[英]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.