任何人有问题的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
之前的原始数据长度不同。
所以没有错误,但结果是错误的。