2

我看过这个帖子,那里提到的加密技术运行良好。但并非在所有情况下。

要求:

很简单,拍摄一张图像,对其进行加密,然后存储加密数据。稍后,获取加密数据,对其进行解密,重新创建原始图像并显示。

我做了什么

从上面提到的线程中,我发现NSData 添加了 AES 256 加密。我尝试使用它,但取得了部分成功。这是代码

//encryption
NSData *srcData       =   UIImageJPEGRepresentation(srcImage, 1.0);
NSLog(@"srcData length : %d",[srcData length]);
NSData *encryptedData =   [srcData AES256EncryptWithKey:KEY];
NSLog(@"encrypted data length : %d",[encryptedData length]);

........

//later..
//decryption
decryptedImage  =   [UIImage imageWithData:[encryptedData AES256DecryptWithKey:KEY]];
imageView.image =   decryptedImage;

怎么了

对于小图像,例如分辨率为 48*48 的图像,此代码可以成功运行。但是当我在具有更高分辨率的图像中运行代码时,比如 256 * 256,该方法AES256EncryptWithKey失败并出现错误kCCBufferTooSmall(-4301)。

问题

  1. AES 256 是否对要加密的有效负载的大小(以字节为单位)施加任何限制?
  2. 如果第一个问题的答案是肯定的,那么在 iphone 中使用什么样的加密算法来加密图像(可能是大的)?
  3. 如果第一个问题的答案是NO,那么为什么会出现这个错误?
4

1 回答 1

1
  1. 不,不是。一些散列函数确实有最大值,但更多的是 2^64,所以通常你不必担心。
  2. 不适用
  3. 它可能dataWithBytesNoCopy与与调用的组合有关malloc,但如果不实际运行代码就很难找到。

请注意,该包装器非常脑残,因为它确实需要一次加密,而无需使用CCCryptorUpdate. 它不使用危及安全的 IV。它将键作为字符串处理。最后,它为解密创建了太大的缓冲区大小。您最好使用更可靠的来源创建自己的。

于 2012-12-30T00:32:02.160 回答