Encryption 将AES代码从M2Crypto移植到pycrypto

Encryption 将AES代码从M2Crypto移植到pycrypto,encryption,aes,pycrypto,m2crypto,Encryption,Aes,Pycrypto,M2crypto,我想将一些现有的AES代码从M2Crypto转换为等效的pycrypto,但文档很薄,特别是M2Crypto。我已将相关代码缩减为。主要问题是: Pycrypto要求输入长度为16的倍数,m2crypto则不要求 即使输入长度是16的倍数,密文也会不同。在对M2Crypto-cipher参数进行实验后,结果表明,将padding和key_as_bytes设置为false将与pycrypto加密到相同的密文。因此,我需要在纯python中模拟padding=True和key\u as\u byt

我想将一些现有的AES代码从M2Crypto转换为等效的pycrypto,但文档很薄,特别是M2Crypto。我已将相关代码缩减为。主要问题是:

  • Pycrypto要求输入长度为16的倍数,m2crypto则不要求
  • 即使输入长度是16的倍数,密文也会不同。在对M2Crypto-cipher参数进行实验后,结果表明,将
    padding
    key_as_bytes
    设置为false将与pycrypto加密到相同的密文。因此,我需要在纯python中模拟
    padding=True
    key\u as\u bytes=True
任何帮助都将不胜感激


编辑:已解决-gist已使用等效的M2Crypto/pycrypto代码和测试进行了更新,我将把它留在那里,以防将来有人发现它有用。

您将必须实现PKCS#7填充/取消添加,这有点简单,并且在RSA实验室的公开标准中指定,当然还有在Wikipedia上。另请参见以下答案:


请注意,PKCS#7填充和PKCS#5填充是相同的,尽管后者正式仅适用于8字节块密码(例如DES/TDEA)。OpenSSL默认使用PKCS#7填充。

谢谢,修复了填充问题!我更新了gist,并在将KEY_AS_BYTES更改为false时验证了密文是否匹配。现在需要弄清楚
key\u as\u bytes
是做什么的。如果你没那么幸运的话,这是一个错误命名的
EVP\u BytesToKey
(3)。我说不走运是因为OpenSSL使用了一个专有的密钥派生函数,这可能意味着要用Python实现它。这是可行的,如果你测试得很好,这实际上不是一个关于安全性的问题,但它确实需要一些密码理解。我最终发现了这一点,主要归功于更广泛的测试并更新了要点。