簡體   English   中英

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

[英]Why decrypting string generated in php works partially while decrypting in python?

我正在開發小應用程序,但在 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

當然KEY變量與服務器上的相同。

現在在使用加密數據運行Decrypt()函數后,它只返回解密字符串的一部分。

好的,問題解決了! 對於任何想知道的人,您需要在 php 中預先附加 IV。 它沒有與默認的 openssl_encrypt 添加。

這是代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM