任何人有问题的iOS 5encryption?

有一个(相当复杂)的应用程序,在iOS 4上正常工作,但在解密问题的iOS 5上失败。 它解密一个SQLite数据库页面,最后16个字节似乎没有被正确解密。

这是否与任何人打铃?

更新

我已经确定,当CCCryptorUpdate的缓冲区长度为1008(1024 – 16)时,它只解密992个字节(在dataOutMoved参数中报告)。 如果CCCryptorFinal返回剩余的字节,这将是确定的,但它报告零字节移动。 但是,CCCryptorFinal正在报告一个-4304的返回码(这是一个无用的kCCDecodeError)。

更新2

我已经把它作为一个彻头彻尾的bug。 我已经比较了byte-to-byteencryption和input解密的输出,并比较了这些密钥。 相同。 但是,如果缓冲区长度是1008,那么解密总是失败,甚至当解密器被给予更大的输出缓冲器时(它表示在这种情况下它需要1024)。 我认为它可以正常工作1024,但我还没有经过第一个奇怪的大小缓冲区告诉。

等等

那么,似乎没有什么解密。 这是使用“一体化”CCCrypt()接口,以消除CCCryptorCreate / Update / Final的sorting错误的机会。 我不知道这是AES128的问题吗?

奇怪的是,当数据库的第1页被encryption时,encryption总是报告比我告诉的更多的16个字节 – 如果我告诉1008它报告1024,如果我告诉它1024报告1040.没有其他页面这样做,我不知道CCCrypt如何知道它正在处理的页面。 就像我说的,好奇。

发现它(我认为)

旧的代码是指定kCCOptionPKCS7Padding ,据我所知,它应该只用于encryption缓冲区长度不是块长度的倍数(并提供额外的输出缓冲区空间)。 这导致几乎所有的解密操作都以-4304失败。 但是在iOS 4中,操作仍然会移动他们解密的数据(实际上是所有的数据),而iOS 5发生了变化,如果操作失败(最后一个块几乎总是失败),所有数据移动都被抑制。

closures填充选项使代码工作,不会发布任何错误。

如上所述,从iOS 4到iOS 5的变化在于,如果出现错误,则不再将数据复制到目标缓冲区。 所以在iOS 4中,可以忽略错误,仍然可以得到很好的结果,但在iOS 5中却不行。(我没有编写原始代码 – 我从来不会忽略这些错误。)

错误是由于在执行固定长度的块多操作时指定了kCCOptionPKCS7Padding 。 (并不完全确定如何在填充时排列缓冲区,但这不是我需要做的事情。)删除该选项将导致操作无错误。

kCCOptionPKCS7Padding上删除kCCOptionPKCS7Padding ,如果kCCEncrypt之前的原始数据不是块长度的倍数,则kCCDecrypt之后的输出数据长度与kCCDecrypt之前的原始数据长度不同。

所以没有错误,但结果是错误的。