我有一个加密的数据流(AES 128、CBC、PKCS7),我试图在它到达时对其进行解密。有时我会收到一个长度为 334 的数据包,然后我会尝试对其进行解密。当我在 iPhone 5 上执行此操作时,它会返回kCCBufferTooSmall
(对于非 mod 16 数据来说这是预期的)。但是,当我在 iPhone 3GS 上使用相同的东西时,它会返回kCCSuccess
并给我一个部分解密的流(它给我的 333 的最后十个字节左右是伪造的 - 空终止符和随机数据)。
两台设备都是 iOS 6.1.2。该应用程序使用设置为最新 SDK (6.1) 的基本 SDK 构建,部署目标为 iOS 5.0。
我创建了以下测试用例,它也出现了这个问题:
+ (void)decryptionTest {
NSData *data = [NSMutableData dataWithLength:334]; // 334 % 16 = 14
NSData *key = [NSMutableData dataWithLength:kCCKeySizeAES128];
NSData *iv = [NSMutableData dataWithLength:kCCBlockSizeAES128];
size_t outLength = 0;
NSMutableData *cipherData = [NSMutableData dataWithLength:data.length];
CCCryptorStatus result = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
key.bytes,
key.length,
iv.bytes,
data.bytes,
data.length,
cipherData.mutableBytes,
cipherData.length,
&outLength);
NSLog(@"result = %d", result);
}
为什么我kCCSuccess
会因为不匹配块大小而失败?