我有一个使用 PHP openssl 使用密码 AES-CBC-256 加密的值,但最终值的密码也使用相同的方法加密。openssl_encrypt($key, $cipher, $passphrase, 0, $iv)
我需要能够使用 Python 解密这些数据,但遇到了块大小问题。
以下是我目前掌握的一些代码。我已经用 PHP 测试过解密,一切正常。本例中的最终值应该是“Jimmy”。
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
localKey = base64.b64decode('Po0KPxyF')
localIv = base64.b64decode('s8W+/a4jkp9mhO3NkCL7Yg==')
encrypted_value = base64.b64decode('hl5n6Nq5QYtgKIyLEVCupA==')
encrypted_key = base64.b64decode('MGRHRFlaMzhCR0lxb2VHS1JHQXcrWkV2bkJpNWFZb3cybW9iQW5KYTlOU0xKK1FHc2pPUW1MUE9JRU5zTXN1Rg==')
encrypted_iv = base64.b64decode('J31SrExr7KKIOertYIPhpQ==')
# First need to encrypted key that uses the local key as the passphrase
cipher_key = AES.new(pad(localKey,16), AES.MODE_CBC, localIv)
decrypted_key = cipher_key.decrypt(encrypted_key)
# Then decrypted the final value using the newly decrypted key
cipher_key = AES.new(unpad(decrypted_key,16), AES.MODE_CBC, encrypted_iv)
decrypted_value = cipher_key.decrypt(encrypted_value)
我设法找出了执行解密的 PHP 代码:
输出:
(演示)
评论:
$localKey
短于 256 位,因此openssl_decrypt()
用空字节填充$encrypted_key
经过两次 base64 编码,因此需要解码两次$decrypted_value
被序列化为serialize()
这是一个 Python 实现(基于 PyCryptodome):
输出:
(演示)