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