PyCrypto在CFB模式下与CommonCrypto兼容吗?

3

我想要一些Python代码来解密使用OS X CommonCrypto APIs加密的数据。关于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模式下是否重要?

目前,只要我将段大小设置为16,PyCrypto就可以成功解密前4个字节的数据。

有什么想法吗?


作为一条注释,M2Crypto在解密数据方面运行得非常好,所以必须是某种选项问题或类似的问题。 - Loki
最近,我也在处理同样的问题。你有找到解决这个问题的方法或示例代码吗? - Yi Jiang
1个回答

2

不需要了解CommonCrypto或PyCrypto,以下是一些部分答案:

  • AES(所有三个变种)的块尺寸为128位,即16字节。

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

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

    否则,以noPadding模式解密它,查看结果,并将其与不同的已知填充模式进行比较。

    浏览源代码来看,它可能是PKCS#5填充。

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

  • 还有另一种CFB的定义,它包括段大小 - 在这里,段大小是要从每个密文输出中使用的位数(或字节)。 在这个定义中,“纯”CFB的片段大小为128位(= 16字节),CFB8的片段大小为8位(一个字节)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接