我使用的是苹果SecKeyWrapper从类CryptoExercise在苹果文档的示例代码做一些AES128对称加密。出于某种原因,当我加密 1-15 个字符或 17 个字符时,它会正确加密和解密。使用 16 个字符,我可以加密,但在解密时它会在CCCryptorFinal调用 with后抛出异常ccStatus == -4304,这表明解码错误。(去搞清楚。)
我知道 AES128 每个加密块使用 16 个字节,所以我的印象是该错误与落在块边界上的明文长度有关。有没有人使用CommonCryptor或遇到过这个问题SecKeyWrapper?
以下几行...
// We don't want to toss padding on if we don't need to
if (*pkcs7 != kCCOptionECBMode) {
if ((plainTextBufferSize % kChosenCipherBlockSize) == 0) {
*pkcs7 = 0x0000;
} else {
*pkcs7 = kCCOptionPKCS7Padding;
}
}
Run Code Online (Sandbox Code Playgroud)
...是我问题的罪魁祸首。为了解决它,我只需要将它们注释掉。
据我所知,加密过程不是在加密端填充,而是在解密端仍然期望填充,导致解密过程失败(这通常是我所经历的)。
kCCOptionPKCS7Padding到目前为止,总是使用加密/解密对我有用,对于满足length % 16 == 0和不满足的字符串。同样,这是SecKeyWrapper对CryptoExercise 示例代码类的修改。不确定这如何影响那些使用CommonCrypto自制包装纸的人。