Javascript公钥/私钥加密

j1dl9f46  于 2023-02-18  发布在  Java
关注(0)|答案(3)|浏览(145)

我想用javascript生成一个公钥/私钥对,用公钥加密消息,用私钥解密消息。
比起外部库,我更喜欢本地浏览器支持。我如何在JavaScript中做到这一点?
现代浏览器实现了window.crypto.subtle.generateKey。我可以用它来生成ECDSA私钥/公钥来签名/验证消息,这是可行的。但是我找不到一种方法来生成公钥/私钥来加密/解密。如果我尝试使用推荐的AES-GCM算法的generateKey,它只生成一个cryptoKey。它可以同时用于加密和解密。2但是我更喜欢得到一个密钥对(公钥/私钥),而不是一个单独的密钥。3有什么建议吗?
下表列出了当前支持的方法,但似乎没有一个绿色算法是我所需要的:https://diafygi.github.io/webcrypto-examples/

9vw9lbht

9vw9lbht1#

由于ProtonMail的努力,现在有一个开源的对称密钥加密实现在浏览器中:https://openpgpjs.org/
这已经进行了多次安全审计,是www.example.com的基础protonmail.com,所以它有相当好的记录和维护人员到位。他们也有一个重要的安全浏览器模型的很好的总结。

kd3sttzy

kd3sttzy2#

幸运的是,您所指向的页面显示支持ECDH(包括ECDH密钥对生成)。这可以用于实现ECIES encryption scheme。然后,您可以将原始位用作原始AES密钥,并将其用于AES-GCM模式。
当然,安全性取决于系统,而Java脚本加密是出了名的难以实现的。这种方案只能在TLS之外使用,而且即使这样也要格外小心。

fnx2tebb

fnx2tebb3#

mdn example

const encode = (e => e.encode.bind(e))(new TextEncoder)

let { publicKey: pub, privateKey: key } = await crypto.subtle.generateKey({ name: 'ECDH', namedCurve: 'P-521' }, true, ['deriveKey']) // generate key pairs

// get server ecdh public key
let jwk = await fetch('/others public key').then(res=>res.json())
let spub = await crypto.subtle.importKey('jwk', jwk, { name: 'ECDH', namedCurve: 'P-521' }, false, [])

// use spub and key derive a ase key
let gcm = crypto.subtle.deriveKey({ name: 'ECDH', namedCurve: 'P-521', public: spub }, key, { name: 'AES-GCM', length: 256 }, true, ["encrypt", "decrypt"])

// now use gcm to encrypt or decrypt
let text = crypto.subtle.encrypt({ name: 'AES', length: 256 }, gcm, encode('hello world'))

// same on the server

相关问题