【问题标题】:Encrypt Decrypt Python PHP convert AES加密 解密 Python PHP 转换 AES
【发布时间】:2018-08-16 14:54:05
【问题描述】:

我有这个问题,在 python 中使用 aes 256 cbc 加密对某些内容进行了加密,如 python 代码加密方法所示。

我正在尝试在 php 中创建一个 Decrypt 方法来实际解密使用 python 类加密的内容。

这是我将 python 解密方法转换为 php 的尝试,它看起来是正确的还是我在转换中遗漏了什么,因为每次我使用 php 版本解密时都说 hmac 失败?

任何将 python 类转换为 php 的帮助,我将不胜感激。

public function decrypt(){
        $encrypt_method ="AES-256-CBC";
        $secret_key =base64_decode('samekeyusedintheencryption');
        $encrypted=(string)'some encrypted text to be decrypted';
        $data=json_decode(base64_decode($encrypted),true);
        $secret_iv =base64_decode($data['iv']);
        $output = \openssl_decrypt($data['value'], 
        $encrypt_method,$secret_key,0,$secret_iv);
        return  json_encode($output);
    }


    def decrypt(self, payload):
        data = json_c.decode(base64.b64decode(payload))
        value =  base64.b64decode(data['value'])
        iv = base64.b64decode(data['iv'])
        crypt_object=AES.new(self.key,AES.MODE_CBC,iv)
        plaintext = crypt_object.decrypt(value)
        return loads(plaintext)

【问题讨论】:

    标签: php python encryption aes


    【解决方案1】:

    好的,我开始工作了!

    function decrypt($encryptedText, $secret_key){
    
    $secret_key = base64_decode($secret_key);
    $encrypt_method ="AES-256-CBC";
    
    $data = json_decode(base64_decode($encryptedText),true);
    
    $data['iv'] = base64_decode($data['iv']);
    $data['value'] = base64_decode($data['value']);
    
    return openssl_decrypt($data['value'], $encrypt_method, $secret_key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $data['iv']);
    
    }
    

    我学到的一些东西: 如果 openssl 函数中的选项设置为“0”,则它期望密文的 base64_encoded 输入。此外,如果默认选项设置为“0”,则填充默认设置为 PKCS#7。我认为,这就是我们收到坏块大小错误的原因。

    所以,密文需要base64_decoded,我们需要设置两个选项的填充。

    我能够解密您提供的密文并查看电子邮件地址。

    在 Data 数组中为您提供了 MAC,这样您就可以在 PHP 脚本中检查 MAC。这使您可以确保数据未被篡改。

    我最近做了一个加密项目,从 open ssl 开始,但最终改用 libSodium 库。我强烈建议您查看它以了解更多项目。

    干杯!

    【讨论】:

    • @user3548161 看到你的 python 类数据是一个包含你的值的 json 数组,我真的很慢。再次查看时,我注意到您的 data['value'] 尚未经过 base64 解码。试试看。
    • @user3548161 只是确认您使用当前发布的代码。
    • @user3548161 我正在使用 openssl_error_string() 并收到与坏块长度相关的错误。填充问题可能是一个很好的焦点。
    • 我认为它与 php base 64 解码与 python 不同,不太确定stackoverflow.com/questions/37147049/…
    • @user3548161 - 明白了!
    猜你喜欢
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2019-10-27
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多