CCCrypt在AES中解密

时间:2016-02-15 14:03:07

标签: ios aes commoncrypto

在我的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的分组密码的选项。

是否有人可以帮助我理解?

1 个答案:

答案 0 :(得分:2)

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

更深层次的问题是bit fields。所以"比特为零" (其值为1)是PKCS7填充。第一位(值为2)打开ECB(不是CBC)。如果你"或"他们(这与添加它们相同),你得到3,这意味着两个选项。这是在C中传递布尔数据的一种非常常见的方法,为每个字段提供一个更大整数的位。

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

C没有一种非常好的方法来维护这些类型的值的类型安全性,所以它不会阻止你组合像你在这里完成的不相关的枚举。

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