AES Decryption在iOS 7中的行为与iOS 8/9不同

时间:2015-08-06 04:27:51

标签: ios security encryption ios7 aes

以下方法在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;
}

加密适用于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获取关键字节时执行此操作)
  4. 以上都不起作用。

    调用方法时,我会回复一些示例数据。

    传递给decryptData的三个参数是:

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

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

1 个答案:

答案 0 :(得分:1)

快速猜测,因为几乎没有信息可以继续:

使用PKCS#7(或PKCS#5)的不同填充对数据进行加密。 CCCrypt,虽然流行是由一些bozos写的,并使用非标准的空填充,这是不安全的,如果数据的最后一个字节是0x00将无法工作。

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

如果填充明显不正确,那么早期版本的JFrame将返回错误,这是一个安全错误,后来得到纠正。 IIRC iOS7是最后一个报告错误填充的版本。