Gio*_*gio 1 aes ios 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
Run Code Online (Sandbox Code Playgroud)
在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);
Run Code Online (Sandbox Code Playgroud)
现在,我不明白其中的意义kCCOptionPKCS7Padding | kCCModeCBC。kCCOptionPKCS7Padding = 0x0001等等kCCModeCBC = 2,kCCOptionPKCS7Padding | kCCModeCBC = 3但不存在具有 value 的分组密码选项3。
有没有人可以帮助我理解?
您对此处的使用kCCModeCBC不正确。所有CCOption枚举值都以 开头kCCOption。kCCModeCBC是CCMode枚举的一部分。你不能以这种方式组合它们。你可以逃脱惩罚,因为 CBC 恰好是默认值。你应该删除| kCCModeCBC. (CCMode由名为 的较新接口使用CCCryptorCreateWithMode。您使用的接口默认为 CBC,并且可以选择切换到 ECB 模式。))
对于您更深层次的问题,这些是位字段。因此“位零”(值为 1)是 PKCS7 填充。第 1 位(值为 2)打开 ECB(不是 CBC)。如果你“或”它们(这与添加它们相同),你会得到 3,这意味着两个选项。这是在 C 语言中传递布尔数据的一种极其常见的方法,为每个字段赋予一个更大的整数一位。
如果有更多字段,它们的值将是 4、8、16、32 等。所有 2 的幂。因此,您打开或关闭的选项正是由一(开)和零(关)组成的二进制数。
C 没有真正好的方法来维护这些类型值的类型安全,因此它不会阻止您像在这里所做的那样组合不相关的枚举。
它“起作用”的原因kCCModeCBC是它与 具有相同的值kCCOptionECBMode。您的加密采用 ECB 模式,而不是 CBC 模式。(这恰好意味着你的密码几乎肯定是非常不安全的,但这是一个单独的问题。)
| 归档时间: |
|
| 查看次数: |
1747 次 |
| 最近记录: |