Javascript公钥/私钥加密

时间:2017-09-18 19:23:38

标签: javascript encryption

我想在javascript中生成公钥/私钥对,并使用公钥加密邮件和私钥来解密邮件。

我更喜欢本地浏览器支持外部库。 我怎么能用JavaScript做到这一点?

现代浏览器实施window.crypto.subtle.generateKey。 我可以使用它来生成ECDSA私钥/公钥来签名/验证消息,这是有效的。但我找不到如何使用它来生成发布/私钥来加密/解密的方法。如果我为推荐的AES-GCM算法尝试使用generateKey,它只生成一个cryptoKey,它可能用于加密和解密。但我更喜欢获得密钥对(publib /私钥),而不仅仅是一个密钥。有什么建议吗?

此表列出了当前支持的方法,但似乎没有一种绿色算法是我需要的: https://diafygi.github.io/webcrypto-examples/

3 个答案:

答案 0 :(得分:0)

幸运的是,您指向的页面显示支持ECDH - 包括ECDH密钥对生成。这可用于实现ECIES encryption scheme。然后,您可以将原始位用作原始AES密钥,并将其用于AES-GCM模式。

安全性当然取决于系统,而Java脚本加密是非常难以正确的。除了 TLS之外,这种方案只应该使用,即使这样,也只能非常小心。

答案 1 :(得分:0)

由于ProtonMail的努力,现在浏览器中有一个开源的对称密钥加密实现:https://openpgpjs.org/

这有多个安全审核,是protonmail.com的基础,所以它有一个相当不错的记录和维护者。他们还对重要的安全浏览器模型进行了很好的总结。

答案 2 :(得分:0)

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