在iOS 7中,AES解密在iOS 8/9中具有不同的行为

以下方法在iOS 7上运行时会返回不同的结果,而不是在iOS 8/9上运行。

+ (NSData *)decryptData:(NSData *)data key:(NSData *)key iv:(NSData *)iv; { NSData *result = nil; // setup key unsigned char cKey[FBENCRYPT_KEY_SIZE]; bzero(cKey, sizeof(cKey)); [key getBytes:cKey length:FBENCRYPT_KEY_SIZE]; // setup iv char cIv[FBENCRYPT_BLOCK_SIZE]; bzero(cIv, FBENCRYPT_BLOCK_SIZE); if (iv) { [iv getBytes:cIv length:FBENCRYPT_BLOCK_SIZE]; } // setup output buffer size_t bufferSize = [data length] + FBENCRYPT_BLOCK_SIZE; void *buffer = malloc(bufferSize); // do decrypt size_t decryptedSize = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, FBENCRYPT_ALGORITHM, kCCOptionPKCS7Padding, cKey, FBENCRYPT_KEY_SIZE, cIv, [data bytes], [data length], buffer, bufferSize, &decryptedSize); if (cryptStatus == kCCSuccess) { result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize]; } else { free(buffer); NSLog(@"[ERROR] failed to decrypt| CCCryptoStatus: %d", cryptStatus); } return result; } 

encryption适用于iOS 7/8/9。 但是iOS 7的解密结果是零。

执行后decryptedSize为0。 buffer元素保持为0。

一些定义是

 #define FBENCRYPT_ALGORITHM kCCAlgorithmAES128 #define FBENCRYPT_BLOCK_SIZE kCCBlockSizeAES128 #define FBENCRYPT_KEY_SIZE kCCKeySizeAES256 

我已经阅读了关于SO的类似CCCrypt()问题的答案。 试过以下几点:

  1. cKey长度增加1
  2. cKey长度增加到FBENCRYPT_KEY_SIZE * 2 + 1
  3. 设置cKey的第一个字节为0(有人说iOS 6从NSString获取关键字节的时候这样做)

以上都不是。


当方法被调用时,我回来了一些示例数据。

传递给decryptData的三个参数是:

  • 数据: ea1e6896 b5731f40 1d560a18 f0729fa6
  • 键: 17c76e90 9a6fef8d b1fd45fa 2de18db0 d2236264 db6c8a60 125599ec 2dfb5614 ,AES256的256位
  • iv: 41463531 38453234 44333835 42463636字节,与块大小相同

预期的结果(和iOS8 / 9上的实际结果)是248e51af 66bf85d3 00003ab6 fe3c0000

由于没有什么信息可以进行快速猜测:

数据使用PKCS#7(或PKCS#5)的不同填充进行encryption。 mcrypt() ,而stream行的是由一些bozos写的,并使用非标准的null填充,这是不安全的,如果数据的最后一个字节是0x00将无法正常工作。

有关PKC#7传递的更多信息,请参阅此SO回答 。

CCCrypt早期版本会返回一个错误,如果填充显然是不正确的,这是一个安全错误,后来被纠正。 IIRC iOS7是报告错误填充的最后一个版本。