iOS开发-AES、DES加密

本文主要说AES加密,而DES大同小异,揭秘也是一个属性的问题
首先,网络上关于iOSAES加密的资料与方法有很多,并且也都可以运行,但是大部分作者都是就自己项目写的代码,具体参数和可能出现坑的地方都没有说明白,也就是说,那些代码可能没有错,但就是不适用于你自己的项目。

特别说明:1. 本文是自己项目中用到后用来记录之用,也为了兴许能帮助到的同胞。如果有说的不对的地方,感谢指正;2. 以下代码是自己学习过程中,通过网络上不同大神们的代码结合所成;3. 以下言论需要斟酌后使用,出错不负责,帮你解决问题也不收礼

先上代码

/**
 *  加密
 *
 *  @param plainText 明文
 *  @param key       密钥
 *  @param iv        向量
 *
 *  @return 密文
 */
+ (NSString *)AES256Encrypt:(NSString *)plainText key:(NSString *)key iv:(NSString *)iv {
    
    char keyPtr[kCCKeySizeAES256+1];
    memset(keyPtr, 0, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    char ivPtr[kCCBlockSizeAES128 + 1];
    memset(ivPtr, 0, sizeof(ivPtr));
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
    
    size_t bufferSize = [data length] + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          [key length],
                                          ivPtr,
                                          [data bytes],
                                          [data length],
                                          buffer,
                                          bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        return [resultData base64EncodedStringWithOptions:0];
    }
    free(buffer);
    return nil;
}

需要注意的地方有几个:

  1. CCCrypt 第一个参数:kCCEncrypt:加密 ;kCCDecrypt:解密
  2. CCCrypt 第二个参数:区分AES加密与DES加密
  3. key(密钥)的长度,char keyPtr[kCCKeySizeAES256+1];需要注意此处后台给你的key的长度,AES的key长度kCCKeySizeAES128 = 16, kCCKeySizeAES192 = 24, kCCKeySizeAES256 = 32,
  4. 向量的长度,char ivPtr[kCCBlockSizeAES128 + 1];一般就是16位,我自己认为没有再多的了
  5. 最后一个非常要注意的点:iOS中填充模式没有[kCCOptionPKCS5Padding][1]模式,而如果后台跟安卓又都是kCCOptionPKCS5Padding的话,那iOS就可以在CCCrypt参数中用kCCOptionPKCS7Padding | kCCOptionECBMode(不写的话默认为CBC模式)来代替。以下纯属个人猜想
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值