iOS AES加密

导入头文件

导入CommonCryptor为苹果提供的系统加密接口,支持iOS 和 mac 开发;
#import <CommonCrypto/CommonCryptor.h>
NSString *const kInitVector = @"16-Bytes--String";
初始化向量,可选的。用于密码块链接(CBC)模式。如果存在,必须与所选的长度相同吗算法的块大小。
如果CBC模式是被选择的(通过在没有任何模式位的情况下)选项标志),没有IV, a将使用NULL(所有零)IV。这是如果使用ECB模式或如果使用流,则忽略选择密码算法。良好的加密,总是用随机数据初始化IV。

加密方法:

+ (NSString *)encryptAES:(NSString *)content key:(NSString *)key {
    
    NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
    NSUInteger dataLength = contentData.length;
    
    // 为结束符'\0' +1
    char keyPtr[kKeySize + 1];
    memset(keyPtr, 0, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    // 密文长度 <= 明文长度 + BlockSize
    size_t encryptSize = dataLength + kCCBlockSizeAES128;
    void *encryptedBytes = malloc(encryptSize);
    size_t actualOutSize = 0;
    
    NSData *initVector = [kInitVector dataUsingEncoding:NSUTF8StringEncoding];
    
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES,
                                          kCCOptionPKCS7Padding,  // 系统默认使用 CBC,然后指明使用 PKCS7Padding
                                          keyPtr,
                                          kCCKeySizeAES128,//支持的AES key size 有 128位,192位,256位
                                          initVector.bytes,
                                          contentData.bytes,
                                          dataLength,
                                          encryptedBytes,
                                          encryptSize,
                                          &actualOutSize);
    
    if (cryptStatus == kCCSuccess) {
        // 对加密后的数据进行 base64 编码
        return [[NSData dataWithBytesNoCopy:encryptedBytes length:actualOutSize] base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
    }
    free(encryptedBytes);
    return nil;
}

解密方法:

+ (NSString *)decryptAES:(NSString *)content{
    // 把 base64 String 转换成 Data
    NSData *contentData = [[NSData alloc] initWithBase64EncodedString:content options:NSDataBase64DecodingIgnoreUnknownCharacters];
    NSUInteger dataLength = contentData.length;
    NSString * key = @"16BytesLengthKey";
    char keyPtr[kCCKeySizeAES128 + 1];
    memset(keyPtr, 0, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    size_t decryptSize = dataLength + kCCBlockSizeAES128;
    void *decryptedBytes = malloc(decryptSize);
    size_t actualOutSize = 0;
    
    NSData *initVector = [kInitVector dataUsingEncoding:NSUTF8StringEncoding];
    
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                          kCCAlgorithmAES,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCKeySizeAES128,
                                          initVector.bytes,
                                          contentData.bytes,
                                          dataLength,
                                          decryptedBytes,
                                          decryptSize,
                                          &actualOutSize);
    
    if (cryptStatus == kCCSuccess) {
        return [[NSString alloc] initWithData:[NSData dataWithBytesNoCopy:decryptedBytes length:actualOutSize] encoding:NSUTF8StringEncoding];
        
        
    }
    free(decryptedBytes);
    return nil;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这几天项目要求做一个加密功能,采用的是 AES 加密,要求是 CBC 方式NoPadding。项目需求只有加密功能...
    ztx_xtz阅读 5,723评论 0 1
  • 因为项目需求,所以最近需要使用AES对本地保存的数据以及请求参数进行加密。 1.关于AES的区别 AES有不同的模...
    oldmonster阅读 11,760评论 5 11
  • 前言 1. 介绍1.1 AES是什么?1.2 AES详解1.3 实现原理和比较1.4 模式和填充选择 2. 经验...
    LuckyCat_A阅读 13,817评论 6 21
  • AES是开发中常用的加密算法之一。然而由于前后端开发使用的语言不统一,导致经常出现前端加密而后端不能解密的情况出现...
    那C乱我心阅读 5,732评论 0 1
  • AES加密 之前公司项目有需要用到这个加密,但是由于网络上找到的都是没有设置向量的,所以后来进行整理之后,自己写了...
    宁小缺阅读 8,599评论 9 3