3

我正在尝试获取一些python 代码来解密使用 OS X CommonCrypto API 加密的数据。关于 CommonCrypto 使用的确切选项几乎没有文档,所以我需要一些帮助来确定在 PyCrypto 中设置哪些选项。

具体来说,我的 CommonCrypto 解密设置调用是:

CCCryptorCreateWithMode(kCCDecrypt, kCCModeCFB, kCCAlgorithmAES128, ccDefaultPadding, NULL, key, keyLength, NULL, 0, 0, 0, &mAESKey);

我的主要问题是:

  1. 由于同时存在 kCCModeCFB 和 kCCModeCFB8,CommonCrypto 对 CFB 模式的定义是什么——什么段大小等?
  2. CommonCrypto AES128 使用什么块大小?16 还是 128?
  3. 什么是默认填充,它在 CFB 模式下是否重要?

目前,只要我将 segment_size 设置为 16*,就可以使用 PyCrypto 成功解密前 4 个字节的数据。

想法?

4

1 回答 1

2

在不知道 CommonCrypto 或 PyCrypto 的情况下,一些部分答案:

  • AES(在所有三个变体中)的块大小为 128 位,即 16 个字节。

  • CFB(密码反馈模式)实际上也可以在没有填充的情况下工作(即使用部分最后一个块),因为对于每个块,密文都是作为明文与某个密钥流块的异或创建的,该密钥流块仅取决于先前的块。(你仍然可以使用任何你想要的填充。)

    如果您可以尝试一些已知数据,请先查看密文大小。如果它不是一个完整块的倍数(并且与明文 + IV 相同),那么它很可能没有填充。

    否则,使用 noPadding 模式解密,看看结果,并与不同的已知填充模式进行比较。

    看源码,可能是PKCS#5-padding。

  • CFB8 是 CFB 的变体,它仅使用每个分组密码调用输出的前 8 位(= 一个字节)(将密文(或 IV)的前 128 位(= 16 字节)作为输入)。这需要 16 倍的分组密码调用,但允许部分发送流,而不必担心分组边界。

  • CFB 的另一种定义包括段大小——这里的段大小是每个密码输出中要使用的比特数(或字节数)。在这个定义中,“普通”CFB 的段大小为 128 位(= 16 字节),CFB8 的段大小为 8 位(一个字节)。

于 2011-12-23T22:02:05.737 回答