【问题标题】:Encryption on iOS5 vs iOS4.3iOS5 与 iOS4.3 上的加密
【发布时间】:2012-01-14 12:26:44
【问题描述】:

以下代码在iOS4.3上的iOS4.3 SDK上产生status = 0

size_t mySize, cypherSize;
mySize = (secKeyGetBlockSize() - 11);
// Code that reads in mySize bytes into buffer and
// sets cipherSize to secKeyGetBlockSize().
// [...]
status = SecKeyEncrypt(myPublicKey,
                       kSecPaddingPKCS1,
                       myBuffer,
                       mySize,
                       myBuffer,
                       &cipherSize);

原来setKeyGetBlockSize()256,因此是mySize = 245。从SecKeyEncrypt返回后,cypherSize 始终为256

在 iOS5 上运行的 iOS5 SDK 上,上面相同的代码导致status = -50!经过一些实验,我发现mySize = 244(比以前低一个!)再次起作用。我在 iOS5.0 上查看了SecKeyEncrypt 的文档,它没有改变——因此,大小也不应该改变。

造成这种差异的原因是什么?

【问题讨论】:

  • 你为什么将SecKeyGetBlockSize()-11 传递为mySize?这是您可以传递的最大大小,但您应该传递myBuffer中的字节数。
  • 在设置缓冲区的代码中,我将mySize 设置为从文件中读取的值。该文件通常大于 256 字节,因此大部分时间 mySize 确实处于最大值。我已经澄清了问题中的代码块。
  • 这也发生在我身上,解决方案是相同的(使用块大小 -12 而不是 -11)但它根本没有任何意义。你找到更多相关信息了吗?
  • 不,我没有。我应该向 Apple 提交错误报告,但他们总是要求提供一个演示该行为的示例项目……为此,我需要一台装有 iOS 4.x 的设备(因为模拟器不支持 API)。搞清楚如何在当前设备上安装旧的 iOS 版本对我来说绝对是太麻烦了!
  • 您找到任何相关信息了吗?有什么事吗?

标签: iphone ios encryption ios5


【解决方案1】:

我认为你的问题是cipherSize。您未初始化该变量,但在输入 SecKeyEncrypt() 时,它应该包含您的 myBuffer 缓冲区的大小(在输出时,它包含实际写入该缓冲区的字节数)。

【讨论】:

  • 其实并不是未初始化。我刚刚跳过了缓冲区的初始化代码。输入时为 256 字节(secKeyGetBlockSize() 的返回值),输出时也为 256 字节。我已更新问题以反映这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2012-10-27
  • 2012-02-28
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多