python - 单独提供 IV 和 Value 时 Python 中的 AES 解密
问题描述
我有一个基于这个 SO answer的加密/解密类设置。我已经测试过了,它工作正常。它不适用于我从中提取信息的新 API。新的 API 是用 PHP 构建的,并使用以下包来加密信息: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)
我应该如何操作该字典中的值以准备将其解密,就像此类可以成功解密的其他加密文本一样?
更新:
根据评论,我尝试将方法修改为如下所示:
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:”前缀。一旦删除,它将按预期工作。
推荐阅读
- javascript - 我们如何在不修改场景树结构或几何形状的情况下更改 Three.js 对象的旋转原点(枢轴点)?
- python - JSONDecodeError:从 Python 开始的未终止字符串,即使我尝试使用 strict = False 来忽略 /n 之类的字符
- java - 绘画属性在画布上不起作用
- angular - share() 在 Angular HTTP 调用中不起作用
- javascript - 从另一个组件打开纸质对话框
- html - 如何在不裁剪的情况下将完整图像的高度调整为适合 chrome/任何浏览器的背景?
- sql - Oracle 将 CLOB 中的字符串替换为 sql 作为值
- sql - SQL中的多列到不同的行
- android - 使用 WRITE_EXTERNAL_STORAGE 在 Android 中将位图存储为 jpg
- excel - Excel VBA 现在有一个新列,但随后它停止了