【问题标题】:CCCrypt decrypting in AESAES 中的 CCCrypt 解密
【发布时间】:2016-02-15 14:03:07
【问题描述】:

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

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

【问题讨论】:

  • “但不存在值为 3 的分组密码的选项” - 这是什么意思?
  • 对不起@ArtjomB.,但正如 Rob 向我指出的那样,我误解了位字段的含义。现在更清楚了。

标签: ios aes commoncrypto


【解决方案1】:

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

对于您更深层次的问题,这些是bit fields。所以“位零”(其值为 1)是 PKCS7 填充。位 1(值为 2)打开 ECB(不是 CBC)。如果你“或”它们(这与添加它们相同),你会得到 3,这意味着两个选项。这是在 C 中传递布尔数据的一种极为常见的方式,为每个字段赋予一个更大的整数位。

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

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


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

【讨论】:

  • 如果我删除 | kCCModeCBC 解密结果不正确。我发现获得正确结果的唯一方法是 kCCOptionPKCS7Padding | kCCModeCBC。我同意你的观点,这是没有意义的。这就是我问这个问题的原因。
  • kCCModeCBCkCCOptionECBMode 恰好具有相同的值。
  • 好的。那么kCCOptionECBModekCCOptionPKCS7Padding 不是互斥的吗?如果我只使用 kCCOptionPKCS7Padding 我有一个填充的 CBC 密码。如果我使用 kCCOptionPKCS7Padding | kCCOptionECBMode 我有一个填充的 ECB 密码。对吗?
  • 正确。您可以将选项与 | 一起加入。
猜你喜欢
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 2012-10-27
  • 2014-12-02
  • 2016-09-22
  • 2021-02-11
  • 2013-10-28
  • 1970-01-01
相关资源
最近更新 更多