Javascript公钥/私钥加密

Javascript公钥/私钥加密,javascript,encryption,Javascript,Encryption,我想在javascript中生成一个公钥/私钥对,并使用公钥加密消息,使用私钥解密消息 与外部库相比,我更喜欢本机浏览器支持。 如何在JavaScript中实现这一点 现代浏览器实现了window.crypto.minute.generateKey。 我可以使用它来生成ECDSA私钥/公钥,以对消息进行签名/验证,这很有效。但我找不到一种方法来使用它生成用于加密/解密的发布/私钥。如果我为推荐的AES-GCM算法尝试generateKey,它只生成一个加密密钥,可能可以用于加密和解密。但我更喜欢

我想在javascript中生成一个公钥/私钥对,并使用公钥加密消息,使用私钥解密消息

与外部库相比,我更喜欢本机浏览器支持。 如何在JavaScript中实现这一点

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

此表列出了当前支持的方法,但似乎没有一种绿色算法是我需要的:

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


安全性当然取决于系统,众所周知,Java脚本加密很难正确实现。这种方案只能在TLS之外使用,即使在TLS之外,也必须非常小心。

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

这已经进行了多次安全审计,并且是protonmail.com的基础,因此它有相当好的记录和维护人员。它们还对重要的安全浏览器型号进行了很好的总结。

const encode=(e=>e.encode.bind(e))(新的TextEncoder)
让{publicKey:pub,privateKey:key}=wait crypto.minute.generateKey({name:'ECDH',namedCurve:'P-521',true,['deriveKey'])//生成密钥对
//获取服务器ecdh公钥
让jwk=wait fetch('/others公钥')。然后(res=>res.json())
让spub=wait crypto.minute.importKey('jwk',jwk,{name:'ECDH',namedCurve:'P-521',false,[]))
//使用spub和key派生ase密钥
让gcm=crypto.minute.deriveKey({name:'ECDH',namedCurve:'P-521',public:spub},key,{name:'AES-gcm',length:256},true,[“encrypt”,“decrypt”])
//现在使用gcm加密或解密
让text=crypto.minute.encrypt({name:'AES',length:256},gcm,encode('hello world'))

//服务器上也一样
既然JavaScript在用户浏览器中运行,这怎么可能是安全的呢?任何调试器都可以很容易地隔离私钥,从而否定加密的全部目的。我的建议是将私钥端托管在php、asp或其他服务器端进程中,这样用户就无法浏览代码。当然,但我的问题是,没有任何绿色标记的算法生成私钥。@Jim有时目标是将密钥与服务器隔离(即为用户提供端到端加密)。它的实用性是一罐虫子,不是吗?我只希望它只产生一个私钥。您需要使用不同的算法来生成公共/私有对。我不确定我是否正确理解您。我需要一个公钥,它将被发送给其他人来加密消息,我需要一个私钥,它将留在浏览器中,以便它可以在以后解密消息。根据您的建议,我将拥有ECDH密钥对(公钥和私钥),但这些密钥只能用于派生密钥。因此,如果我从中派生出一个AES密钥,它可以用作加密的公钥吗?我将能够使用我的私钥(ECDH)来解密?不,不管你做什么,你都需要另一个人的可信公钥来向他发送加密消息。如果您没有,那么任何人都可以创建自己的密钥对,并要求您进行加密。或者,如果您向他们发送私钥,那么任何人都可以使用该密钥解密消息。一旦收到公钥,就可以创建一个临时密钥对来派生一个秘密AES密钥。然后将加密消息和(不受信任的)公钥发送给另一个人。另一个人还派生AES密钥并解密消息。“一次”中的所有内容都只是对IES的描述