python - 在 PyCrypto 中重新创建一个 openssl 解密命令
问题描述
我正在尝试在 PyCrypto 中重新创建第二个命令(解密)
openssl enc -aes-128-ecb -nosalt -base64 -pass pass:abcde -md sha256 -in test.txt -out out.txt
openssl enc -d -aes-128-ecb -nosalt -base64 -pass pass:abcde -md sha256 -in out.txt
的内容test.txt
是flag{flagflag}
。加密的输出是0KSF5koIceXxszsgzpl4uA==
。
binascii.a2b_base64(b'0KSF5koIceXxszsgzpl4uA==')
openssl enc -aes-128-ecb -nosalt -pass pass:abcde -md sha256 -in test.txt -out out.txt
产生与(no )相同的字节数组-base64
,所以我知道 base64 解码应该是第一步。
p = "abcde".encode()
h = SHA256.new(p)
key = h.hexdigest()[:32].upper()
key
与以下输出匹配,所以我知道密钥生成代码是正确的:
$ openssl enc -aes-128-ecb -nosalt -pass pass:abcde -base64 -md sha256 -in test.txt -v -P
key=36BBE50ED96841D10443BCB670D6554F
bufsize=8192
但是,将所有这些放在一起会在msg
. 任何我弄错的地方都将不胜感激。
from Crypto.Hash import SHA256
from Crypto.Cipher import AES
import binascii
c = binascii.a2b_base64(b'0KSF5koIceXxszsgzpl4uA==')
p = "abcde".encode()
h = SHA256.new(p)
key = h.hexdigest()[:32].upper()
cipher = AES.new(key.encode(), AES.MODE_ECB)
msg = cipher.decrypt(m)
print(msg)
解决方案
我发现了问题:密钥编码错误:它不是编码key
为 utf8 来获取字节数组,它应该被key
视为十六进制数字并将其解码为字节数组。
cipher = AES.new(bytearray.fromhex(key), AES.MODE_ECB)
msg = cipher.decrypt(m)
print(msg)
推荐阅读
- reactjs - Firebase 身份验证,在页面刷新时注销
- mysql - SQL 使用另一个查询的结果更新表
- ios - Airwatch MDM 的 iOS .ipa 分发方法
- python - 如何在成功之前使任务失败 n 次?
- jmeter - 如何在 bzm -Parallel Controller 中设置 HTTP 请求之间的思考时间
- javascript - Angular 异步验证器 - 处理响应数据
- python - 有没有办法预测 pytest 生成的 junitxml 中可见的“类名”属性?
- postgresql - 远程插入比本地插入慢 x85,为什么以及如何改进?
- java - Java:从简单链表中删除节点
- php - 如何使用 RedbeanPHP 将行从 MySQL 填充到下拉菜单