我正在尝试获取一些 python 代码来解密使用 OS X CommonCrypto API 加密的数据。几乎没有关于 CommonCrypto 使用的确切选项的文档,因此我需要一些帮助来确定在 PyCrypto 中设置哪些选项。
具体来说,我的 CommonCrypto 解密设置调用是:
CCCryptorCreateWithMode(kCCDecrypt, kCCModeCFB, kCCAlgorithmAES128, ccDefaultPadding, NULL, key, keyLength, NULL, 0, 0, 0, &mAESKey);
我的主要问题是:
- 由于同时存在 kCCModeCFB 和 kCCModeCFB8,CommonCrypto 对 CFB 模式的定义是什么 - 段大小等?
- CommonCrypto AES128 使用的 block 大小是多少? 16 还是 128?
- 什么是默认填充,它在 CFB 模式下重要吗?
目前,只要我将 segment_size 设置为 16*,前 4 个字节的数据就可以使用 PyCrypto 成功解密。
想法?
最佳答案
在不知道 CommonCrypto 或 PyCrypto 的情况下,一些部分答案:
AES(在所有三种变体中)的 block 大小为 128 位,即 16 个字节。
CFB(密码反馈模式)实际上也可以在没有填充的情况下工作(即使用部分最后一个 block ),因为对于每个 block 密文创建为明文与某个 key 流 block 的 XOR,这仅取决于先前的 block 。 (您仍然可以使用任何您想要的填充。)
如果您可以用一些已知数据进行试验,请先查看密文大小。如果它不是 a 的倍数 完整 block (和明文+IV一样),那么很可能没有填充。
否则,用noPadding模式解密,看看结果,并与已知的不同填充模式进行比较。
来自glance at the source code ,它可能是 PKCS#5-padding。
CFB8 是 CFB 的一种变体,它仅使用每个 block 密码调用输出的前 8 位(= 一个字节)(采用 前 128 位(= 16 字节)的密文(或 IV)作为输入)。这需要 16 倍的分组密码调用,但是 允许部分发送流,而不必担心 block 边界。
CFB 的另一个定义包括段大小 - 这里的段大小是 从每个密码输出中使用的位(或字节)。在此定义中,“普通”CFB 的段大小为 128 位(= 16 字节),CFB8 的段大小为 8 位(一个字节)。
关于macos - PyCrypto 在 CFB 模式下与 CommonCrypto 的兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8608731/