AES 中的 CCCrypt 解密

CCCrypt decrypting in AES

在我的 iOS 应用程序中,我必须解密来自服务器的数据。我使用CommonCrypto框架,经过多次尝试,我成功解密

CCCrypt(kCCDecrypt, // operation
                     kCCAlgorithmAES128, // Algorithm
                     kCCOptionPKCS7Padding | kCCModeCBC, // options
                     key.bytes, // key
                     key.length, // keylength
                     nil,// iv
                     cipherData.bytes, // dataIn
                     cipherData.length, // dataInLength,
                     decryptedData.mutableBytes, // dataOut
                     decryptedData.length, // dataOutAvailable
                     &outLength); // dataOutMoved

在 java 服务器中,数据使用

加密
byte[] buff = new byte[100];
byte[] buf2 = new byte[32];
byte[] mainKey = ...
byte[] raw = ...
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new AESEngine());
KeyParameter par = new KeyParameter(mainKey);
int minSize = cipher.getOutputSize(data.length);
byte[] outBuf = new byte[minSize];
int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0);
int length2 = cipher.doFinal(outBuf, length1);
int actualLength = length1 + length2;
byte[] result = new byte[actualLength];
System.arraycopy(outBuf, 0, result, 0, result.length);

现在,我不明白kCCOptionPKCS7Padding | kCCModeCBC的意思。 kCCOptionPKCS7Padding = 0x0001kCCModeCBC = 2 所以 kCCOptionPKCS7Padding | kCCModeCBC = 3 但不存在值 3.

的分组密码选项

有没有人可以帮助我理解?

您在这里使用 kCCModeCBC 是不正确的。所有 CCOption 枚举值都以 kCCOption 开头。 kCCModeCBCCCMode 枚举的一部分。你不能以这种方式组合它们。你逃脱了它,因为 CBC 恰好是默认设置。您应该删除 | kCCModeCBC。 (CCMode 由一个名为 CCCryptorCreateWithMode 的较新界面使用。您正在使用的界面默认为 CBC,并且可以选择切换到 ECB 模式。))

对于更深层次的问题,这些是 bit fields。所以 "bit zero"(值为 1)是 PKCS7 填充。位一(值为 2)开启 ECB(而非 CBC)。如果您 "or" 它们(这与添加它们相同),您将得到 3,这意味着两个选项。这是在 C 中传递布尔数据的一种非常常见的方式,给每个字段一个更大的整数中的一位。

如果有更多字段,它们的值将是 4、8、16、32 等。都是 2 的幂。因此,您打开或关闭的选项恰好是二进制数的 1 (on) 和 0 (off)。

C 并没有很好的方法来维护这些类型的值的类型安全,因此它不会阻止您像您在此处所做的那样组合不相关的枚举。


"works" 与 kCCModeCBC 的原因是它与 kCCOptionECBMode 具有相同的值。您的加密处于 ECB 模式,而不是 CBC 模式。 (这恰好意味着你的密码几乎肯定是非常不安全的,但这是一个单独的问题。)