python - 使用 python 中给定的 key 生成 AES 256 GCM key

标签 python encryption aes-gcm

我正在尝试在 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/

相关文章:

android - android中的PBKDF2安全 key

node.js - Node.js 加密是否在 GCM 模式下使用固定标签大小?

Java CryptoCipher 不消耗所有输入字节

java - 使用 persistence.xml 的 JPA 的数据库连接位于哪里?

java - PKCS5Padding 可以使用 AES/GCM 模式吗?

ios - Secure Enclave ECIES 加密数据格式是什么?

python - Spacy:如何从句子标记化文本创建文档?

python - 找到匹配的字符串然后+1到元素

python - Flask_migrate 可以在数据库初始化文件中与 sqlAlchemy create_engine 一起运行吗?

Python Pandas - 如果满足条件则更改组内的列