美文网首页iOS大咖说工具iOS进阶指南
iOS开发中如何使用DES加密

iOS开发中如何使用DES加密

作者: 晨曦之光nl | 来源:发表于2016-05-09 15:56 被阅读3384次

1.首先引入头文件

#import <CommonCrypto/CommonCryptor.h>

2.cocoaPods加入第三方框架GTMBase64,并引入头文件

#import "GTMBase64.h"

3.DES分为加密和解密

//密钥
#define gkey            @"mobilewinx@easipass@1234"
//偏移量
#define gIv             @"01234567"

加密方法

#pragma mark - 加密方法
+ (NSString*)encrypt:(NSString*)plainText {
    NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
    size_t plainTextBufferSize = [data length];
    const void *vplainText = (const void *)[data bytes];
    
    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t movedBytes = 0;
    
    bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);
    
    const void *vkey = (const void *) [gkey UTF8String];
    const void *vinitVec = (const void *) [gIv UTF8String];
    
    ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding,
                       vkey,
                       kCCKeySize3DES,
                       vinitVec,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);
    
    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    NSString *result = [GTMBase64 stringByEncodingData:myData];
    return result;
}

解密方法

// 解密方法
+ (NSString*)decrypt:(NSString*)encryptText {
    NSData *encryptData = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];
    size_t plainTextBufferSize = [encryptData length];
    const void *vplainText = [encryptData bytes];
    
    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t movedBytes = 0;
    
    bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);
    
    const void *vkey = (const void *) [gkey UTF8String];
    const void *vinitVec = (const void *) [gIv UTF8String];
    
    ccStatus = CCCrypt(kCCDecrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding,
                       vkey,
                       kCCKeySize3DES,
                       vinitVec,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);
    
    NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
                                                                     length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding];
    return result;
}

相关文章

网友评论

  • 新地球说着一口陌生腔调:偏移量可以去掉吗
  • 库斯科:这个是3DES加密解密吧?
  • 库斯科:偏移量怎么设置呢?
  • 未来的自己在哪里:解密出来是空的,是怎么回事
    d0ab8ef28fa2:@未来的自己在哪里

    能不能说清楚一点哟。
    我这也是解密出来有时候是空的。
    未来的自己在哪里:@晨曦之光n设置了,已经搞定了。/* 资料参考:http://www.2cto.com/kf/201304/205511.html
    * java服务端使用PKCS5Padding算法,密钥只能是8个字节。
    * 在ios中,支持的DES加密算法是kCCOptionPKCS7Padding |kCCOptionECBMode。在使用PKCS7Padding,它的密钥可以是8个字节,也可以不是。如果密钥不是8个字节的话,那么JAVA端的PKCS5Padding算法就不能解密了,只要遵守密钥为8个字节的约定两边就一致了,java: private static byte[] iv = {1, 2, 3, 4, 5, 6, 7, 8};
    */
    晨曦之光nl:@未来的自己在哪里 密钥和偏移量设置了吗

本文标题:iOS开发中如何使用DES加密

本文链接:https://www.haomeiwen.com/subject/hnjerttx.html