CommonCrypto Objective-C AES中IV如何被添加至密文前缀?
解析Zaph的AES/CBC加密代码中IV前缀到密文的逻辑
拿Zaph常用的Objective-C加密实现为例,核心的IV前缀操作就是把随机生成的IV直接拼接在加密后的密文最前端,具体代码行和逻辑如下:
1. 关键代码段拆解
// 1. 生成随机IV(AES-128的块大小固定为16字节) uint8_t iv[kCCBlockSizeAES128]; arc4random_buf(iv, sizeof(iv)); // 2. 调用CommonCrypto执行加密,得到密文数据 NSData *plainData = [@"待加密内容" dataUsingEncoding:NSUTF8StringEncoding]; NSData *keyData = [@"16字节长度密钥" dataUsingEncoding:NSUTF8StringEncoding]; NSMutableData *cipherData = [NSMutableData dataWithLength:plainData.length + kCCBlockSizeAES128]; size_t encryptedBytesLength = 0; CCCryptorStatus status = CCCrypt(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding, keyData.bytes, keyData.length, iv, plainData.bytes, plainData.length, cipherData.mutableBytes, cipherData.length, &encryptedBytesLength); [cipherData setLength:encryptedBytesLength]; // 3. 将IV前缀到密文上 NSMutableData *finalData = [NSMutableData dataWithBytes:iv length:sizeof(iv)]; [finalData appendData:cipherData];
2. 前缀操作的具体代码行
就是最后两行:
[NSMutableData dataWithBytes:iv length:sizeof(iv)]:创建初始数据,直接把16字节的IV作为内容,这就是密文的前缀部分。[finalData appendData:cipherData]:把加密得到的密文追加到IV后面,最终finalData的结构就是 [16字节IV][加密密文]。
如果代码是另一种拼接写法,核心逻辑完全一致:
NSMutableData *finalData = [NSMutableData dataWithLength:sizeof(iv) + cipherData.length]; [finalData replaceBytesInRange:NSMakeRange(0, sizeof(iv)) withBytes:iv]; // 将IV写入结果的最前端 [finalData replaceBytesInRange:NSMakeRange(sizeof(iv), cipherData.length) withBytes:cipherData.bytes]; // 写入密文到IV之后
这里的第一行replaceBytesInRange就是把IV放到结果的前缀位置。
3. 逻辑说明
CBC模式必须用随机IV保证相同明文加密结果不同,且IV无需保密——解密时只要拿到和加密一致的IV即可正常解密。把IV前缀到密文最前端是最直观的方案:解密时只需从结果数据的前16字节取出IV,剩下的部分就是待解密的密文,传入CCCrypt的kCCDecrypt操作即可。
内容的提问来源于stack exchange,提问作者user16780334
相关产品推荐
相关产品推荐

