当 IV 和值分别提供时 Python 中的 AES 解密
AES Decryption in Python when IV and Value provided separately
我有一个 encrypt/decrypt class 设置基于 this SO answer. I've tested it and it works fine. It's not working for a new API I'm pulling information from. The new API is built with PHP and is using the following package to encrypt information: https://laravel.com/docs/8.x/encryption 使用 Laravel Crypt() 命令。所有加密值均使用 OpenSSL 和 AES-256-CBC 密码进行加密。
解密方法第一行后的enc
值
def decrypt(self, enc):
enc = base64.b64decode(enc)
iv = enc[:AES.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return self._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')
看起来像这样(别担心,这只是非敏感的演示数据):
b"{'iv': 'Ld2pjRJqoKcWnW1P3tiO9Q==', 'value': 'M9QeHtbybeUxAVuIRcQ3bA==', 'mac': 'xxxxxx......'}"
,基本上看起来像一个字节串 JSON。测试加密密钥是 base64:69GnnXWsW1qnW+soLXOVd8Mi4AdXKBFfkw88/7F2kSg=
.
我知道我可以把它变成这样的字典
import json
d = json.loads(enc)
我应该如何操作此字典中的值以准备它像其他 class 可以成功解密的加密文本一样被解密?
更新:
根据评论,我尝试将方法修改为如下所示:
def decrypt(self, encrypted):
enc = base64.b64decode(encrypted)
if b'{"iv":' == enc[:6]:
d = json.loads(enc)
iv = base64.b64decode(d['iv'])
val = base64.b64decode(d['value'])
else:
iv = enc[:AES.block_size]
val = enc[AES.block_size:]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return self._unpad(cipher.decrypt(val)).decode('utf-8')
这还是不行。它没有崩溃,但我得到了一个空白字符串 (''
),而且我知道那不是加密的内容。答案应该是'Demo'
问题的“更新”部分中的代码无需任何更改即可运行。您只需要确保删除提供的加密密钥中的“base64:”前缀。删除后,它将按预期工作。
我有一个 encrypt/decrypt class 设置基于 this SO answer. I've tested it and it works fine. It's not working for a new API I'm pulling information from. The new API is built with PHP and is using the following package to encrypt information: https://laravel.com/docs/8.x/encryption 使用 Laravel Crypt() 命令。所有加密值均使用 OpenSSL 和 AES-256-CBC 密码进行加密。
解密方法第一行后的enc
值
def decrypt(self, enc):
enc = base64.b64decode(enc)
iv = enc[:AES.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return self._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')
看起来像这样(别担心,这只是非敏感的演示数据):
b"{'iv': 'Ld2pjRJqoKcWnW1P3tiO9Q==', 'value': 'M9QeHtbybeUxAVuIRcQ3bA==', 'mac': 'xxxxxx......'}"
,基本上看起来像一个字节串 JSON。测试加密密钥是 base64:69GnnXWsW1qnW+soLXOVd8Mi4AdXKBFfkw88/7F2kSg=
.
我知道我可以把它变成这样的字典
import json
d = json.loads(enc)
我应该如何操作此字典中的值以准备它像其他 class 可以成功解密的加密文本一样被解密?
更新:
根据评论,我尝试将方法修改为如下所示:
def decrypt(self, encrypted):
enc = base64.b64decode(encrypted)
if b'{"iv":' == enc[:6]:
d = json.loads(enc)
iv = base64.b64decode(d['iv'])
val = base64.b64decode(d['value'])
else:
iv = enc[:AES.block_size]
val = enc[AES.block_size:]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
return self._unpad(cipher.decrypt(val)).decode('utf-8')
这还是不行。它没有崩溃,但我得到了一个空白字符串 (''
),而且我知道那不是加密的内容。答案应该是'Demo'
问题的“更新”部分中的代码无需任何更改即可运行。您只需要确保删除提供的加密密钥中的“base64:”前缀。删除后,它将按预期工作。