【问题标题】:How do I convert mcrypt PHP to Python如何将 mcrypt PHP 转换为 Python
【发布时间】:2017-12-18 22:46:43
【问题描述】:

如何将其转换为 Python?我很困惑的是随机vi。

PHP

public function fnEncrypt($sValue, $sSecretKey)
    {
    $sValue =  $this->pkcs5_pad($sValue, mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, 'ecb'));
      return rtrim(
            base64_encode(
                mcrypt_encrypt(
                    MCRYPT_RIJNDAEL_128,
                    $sSecretKey, $sValue,
                    MCRYPT_MODE_ECB,
                    mcrypt_create_iv(
                        mcrypt_get_iv_size(
                            MCRYPT_RIJNDAEL_128,
                            MCRYPT_MODE_ECB
                        ),
                        MCRYPT_RAND)
                    )
                ), "\0"
            );
    }

更新:

这完全按照它应该的方式工作!

Python

secret_key = 'he21jodkio1289ij'
value = 'hello'

BLOCK_SIZE = 16
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING
PADDING = '\0'
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s)))
cipher = AES.new(secret_key, AES.MODE_ECB)

【问题讨论】:

  • 最好不要使用mcrypt,它是废弃软件,多年未更新,不支持标准PKCS#7(née PKCS#5)填充,只有非标准空填充可以'甚至不能与二进制数据一起使用。 mcrypt 有许多出色的 bugs 可以追溯到 2003 年。不推荐使用的 mcrypt-extension 将在 PHP 7.2 中删除。而是考虑使用defuseRNCryptor,它们提供了完整的解决方案并且正在维护中并且是正确的。
  • 嗯……这当然行不通。你的 Python 代码使用了完全不同的密码!
  • 还有不同的模式和不同的填充。

标签: php python mcrypt


【解决方案1】:
  • PHP 代码使用 RIJNDAEL_128,即 AES,Python 代码使用 DES,它们都需要使用相同的加密算法才能互操作。

  • PHP代码使用ECB模式,而Python代码使用CBC模式,两者需要使用相同的模式才能互操作。

  • PHP 代码 mcrypt(不应使用)使用非标准空填充,Python 代码使用标准 PKCS#5 填充,它们都需要使用相同的填充才能互操作。

注 1:ECB 模式不使用 IV。如果为 ECB 模式提供了 IV,则它会被忽略。

注意 2:不要使用 ECB 模式,它不安全,请参阅ECB mode,向下滚动到企鹅。而是使用带有随机IV的CBC模式,只需在加密数据前加上IV用于解密即可,不需要保密。

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 2017-10-15
    • 2016-09-14
    • 2020-07-17
    • 2020-05-16
    • 2020-06-23
    • 2018-03-30
    • 1970-01-01
    • 2013-08-10
    相关资源
    最近更新 更多