在我的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 = 0x0001
和kCCModeCBC = 2
所以kCCOptionPKCS7Padding | kCCModeCBC = 3
但不存在值为3
的分组密码的选项。
是否有人可以帮助我理解?
答案 0 :(得分:2)
您在此使用kCCModeCBC
是不正确的。所有CCOption
枚举值均以kCCOption
开头。 kCCModeCBC
是CCMode
枚举的一部分。你不能用这种方式组合它们。你正在逃避它,因为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模式。 (这恰好意味着你的密码几乎肯定是非常不安全,但这是一个单独的问题。)