我正在尝试在 python 中实现 AES 加密。
我引用了一个 Java 代码示例来完成此任务。
在 Java 中,256 位 secret (使用给定 key )是使用
key secretKey = new SecretKeySpec(Base64.decodeBase64(GIVEN_KEY), "AES");
我正在尝试使用以下代码片段在 python 中执行相同的操作
secret = hashlib.sha256(GIVEN_KEY.encode()).digest()
但是用 python 实现编码的字符串无法解密。 上面的片段是否相似,或者我遗漏了什么?
最佳答案
在 Java 中,GIVEN_KEY
的 Base64 解码值用作 key ,在 Python 中,GIVEN_KEY
的 SHA256 哈希值用作 key 。两者并不相同。
Python 中的对应内容类似于:
import base64
...
secret = base64.b64decode(GIVEN_KEY.encode()) # by default UTF8 encoded
编辑: 在 linked code(第 31 页)中, key 是 Base64url 编码的,没有填充:
QOahfcdo98NLjYJuhP4-VKigx51NkUETsKlIu9uXZFY
可以通过字符-
和不能被4整除的长度来识别。
这对应于解码为字节序列的 Base64url
40e6a17dc768f7c34b8d826e84fe3e54a8a0c79d4d914113b0a948bbdb976456
代表 32 字节 key (AES-256),可以进行测试,例如here。
在 Python 中,您可以使用 urlsafe_b64decode
进行 Base64url 解码。但是,需要填充 Base64url 编码值,因此必须首先添加填充,例如使用 here 中的 repad
方法。
import base64
# from https://stackoverflow.com/a/9024884/9014097
def repad(data):
return data + "=" * (-len(data)%4)
GIVEN_KEY = 'QOahfcdo98NLjYJuhP4-VKigx51NkUETsKlIu9uXZFY'
secret = base64.urlsafe_b64decode(repad(GIVEN_KEY).encode())
print(secret.hex()) # 40e6a17dc768f7c34b8d826e84fe3e54a8a0c79d4d914113b0a948bbdb976456
关于python - 使用 python 中给定的 key 生成 AES 256 GCM key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63277004/