为什么在php中生成的字符串在python中解密时部分工作?

为什么在php中生成的字符串在python中解密时部分工作?,python,php,cryptography,aes,Python,Php,Cryptography,Aes,我正在开发一个小应用程序,我在用python解密数据方面遇到了问题 首先,我使用以下代码在php中使用AES-256-CBC加密字符串: function EncryptAES($data){ global $KEY; $ivlen = openssl_cipher_iv_length("aes-256-cbc"); $iv = openssl_random_pseudo_bytes($ivlen); $ciphertext =

我正在开发一个小应用程序,我在用python解密数据方面遇到了问题

首先,我使用以下代码在php中使用AES-256-CBC加密字符串:

 function EncryptAES($data){
        global $KEY;
        $ivlen = openssl_cipher_iv_length("aes-256-cbc");
        $iv = openssl_random_pseudo_bytes($ivlen);
        $ciphertext = openssl_encrypt($data, "aes-256-cbc", $KEY, NULL, $iv);
        return $ciphertext;
    }
现在openssl_encrypt返回base64字符串(因为我使用了NULL作为第四个变量)

之后,我尝试用python对其进行解密,但它只返回字符串的最后一部分

以下是python代码:

BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
unpad = lambda s : s[0:-s[-1]]

class AESCipher:

    def __init__( self, key ):
        self.key = hashlib.sha256(key.encode('utf-8')).digest()

    def decrypt( self, enc ):
        enc = base64.b64decode(enc)
        iv = enc[:16]
        cipher = AES.new(self.key, AES.MODE_CBC, iv )
        return unpad(cipher.decrypt( enc[16:] ))

def Decrypt(data):
    cipher = AESCipher(KEY)
    decrypted = cipher.decrypt(data).decode('UTF-8')
    return decrypted
当然,变量与服务器上的变量相同

现在,使用加密数据运行Decrypt()函数后,它只返回解密字符串的一部分。

好的,问题解决了! 对于任何想知道的人,您需要在php中预先添加IV。它没有添加默认的openssl_加密

代码如下:

$ciphertext = openssl_encrypt($data, "aes-256-cbc", $KEY, OPENSSL_RAW_DATA, $iv);
$DATA = base64_encode($iv.$ciphertext);

在php中不是填充,而是在python中取消添加。我猜只要改成
返回密码。解密(enc[16:])
谢谢你的帮助,但我试过了。这没有帮助。仍然只返回已解密字符串的一半。如果它正在解密它,并且它的垃圾不是完整的,那么它将继续工作;p我不懂python,但会摆弄
enc[16:]
我确信在前16个字节之后,它的意思类似于所有东西
unpad
函数的意图是什么?如果消息的第一个块是垃圾,那么您可能在使用不同的IVs。这将在CBC模式下关闭第一个块,保持以下块正常。或者,您可能会将一个带前缀的IV作为第一块密码文本处理。