5

我有一个加密的数据流(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会因为不匹配块大小而失败?

4

0 回答 0