使用 python 中的给定密钥生成 AES 256 GCM 机密

Generating AES 256 GCM secret using a given key in python

我正在尝试在 python 中实施 AES 加密。
我指的是 java 代码示例以完成此操作。
在 Java 中,256 位秘密(使用给定的密钥)是使用

生成的

Key secretKey = new SecretKeySpec(Base64.decodeBase64(GIVEN_KEY), "AES");

我正在尝试使用以下代码段在 python 中执行相同的操作

secret = hashlib.sha256(GIVEN_KEY.encode()).digest()

但是使用 python 实现编码的字符串无法解密。 以上片段是否相似,或者我是否遗漏了什么?

在Java中,GIVEN_KEY的Base64解码值用作键,在Python中,GIVEN_KEY的SHA256散列。两者不一样。

Python 中的对应项类似于:

import base64
...
secret = base64.b64decode(GIVEN_KEY.encode()) # by default UTF8 encoded

编辑: 在 linked code (p. 31) the key is Base64url 编码的 中没有 填充:

QOahfcdo98NLjYJuhP4-VKigx51NkUETsKlIu9uXZFY

可以识别字符-和不能被4整除的长度

这对应Base64url解码后的字节序列

40e6a17dc768f7c34b8d826e84fe3e54a8a0c79d4d914113b0a948bbdb976456

代表一个 32 字节的密钥 (AES-256) 并且可以被测试,例如here.

在 Python 中你可以使用 urlsafe_b64decode. However, a padded Base64url encoded value is expected, so that the padding has to be added first, e.g. with the repad method from here.

进行 Base64url 解码
import base64

# from 
def repad(data):
    return data + "=" * (-len(data)%4)

GIVEN_KEY = 'QOahfcdo98NLjYJuhP4-VKigx51NkUETsKlIu9uXZFY'

secret = base64.urlsafe_b64decode(repad(GIVEN_KEY).encode()) 
print(secret.hex()) # 40e6a17dc768f7c34b8d826e84fe3e54a8a0c79d4d914113b0a948bbdb976456