【发布时间】:2021-08-28 11:35:59
【问题描述】:
我想使用 HKDF 作为密钥推导函数来实现椭圆曲线 diffie hellman。我在前端使用 python 后端和(香草)javascript。我在后端使用python cryptography 库,在前端使用Web Crypto api 作为加密库。我在双方都创建了 ECDH 密钥对并交换了公共密钥。现在我正在尝试使用交换的公钥和私钥以及 HKDF 算法创建 AES 共享密钥。我可以在 python 后端做到这一点(我关注this example 获取 python 代码):
def encrypt(public_key, secret):
global loaded_public_key
loaded_public_key = public_key
shared_key = server_private_key.exchange(ec.ECDH(), public_key)
IV = bytes("ddfbccae-b4c4-11", encoding="utf-8")
derived_key = HKDF(
algorithm=hashes.SHA256(),
length=32,
salt=None,
info=None,
).derive(shared_key)
aes = Cipher(algorithms.AES(derived_key), modes.GCM(IV))
encryptor = aes.encryptor()
padder = padding.PKCS7(128).padder()
padded_data = padder.update(secret.encode()) + padder.finalize()
return encryptor.update(secret.encode()) + encryptor.finalize()
但我不确定如何使用网络加密 API 来做到这一点。这是我的尝试:(但不起作用)
async function deriveSecretKey(privateKey, publicKey) {
let sharedKey = await window.crypto.subtle.deriveKey(
{
name: "ECDH",
public: publicKey
},
privateKey,
{
name: "AES-GCM",
length: 256
},
false,
["encrypt", "decrypt"]
);
return window.crypto.subtle.deriveKey(
{
name: "HKDF",
hash: {name: "SHA-256"} ,
salt: new ArrayBuffer(0),
info: new ArrayBuffer(0)
},
sharedKey,
{
name: "AES-GCM",
length: 256
},
false,
["encrypt", "decrypt"]
);
}
如何使用 web crypto api 在前端创建共享 AES 密钥以及 HKDF(与 python 相同)?
【问题讨论】:
-
@Topaco 我关注了this python example....我知道网络加密api有both ECDH and HKDF options...但不知道如何将它们一起使用来生成AES密钥,就像在python代码中一样.
标签: javascript encryption cryptography webcrypto-api