Bri*_*unt 6 javascript cryptography diffie-hellman
\n\n\n警告以下内容并非对将密码转换为 ECDH 密钥的认可。从高熵、加密安全的 PRNG 创建 ECDH 密钥。
\n
我想获取一个秘密并从中生成 ECDH 公钥/私钥。
\n\n在浏览器中,通常的方法是使用 PBKDF2(或其他确定性字节)在 WebCrypto 中生成 ECDH 公钥/私钥对。
\n\n以下示例代码应该执行此操作,但它在 Chrome 中引发 DOM 异常:
\n\n// Generate a random KDF key.\nconst priv = new Uint8Array(24)\ncrypto.getRandomValues(priv)\nconst kdfKey = await crypto.subtle.importKey(\n \'raw\', priv, { name: \'PBKDF2\' }, false, [\'deriveKey\'])\n\n// Derive the ECDH key.\nconst salt = new Uint8Array(16)\nconst iterations = 2000\nconst hash = { name: \'SHA-512\' }\nconst curve = { name: \'ECDH\', namedCurve: \'P-384\' }\nconst usages = [\'deriveKey\']\n\ncrypto.getRandomValues(salt)\n\nconst ecdhKey = await crypto.subtle.deriveKey({\n name: \'PBKDF2\', salt, iterations, hash\n}, kdfKey, curve, true, usages) // throws.\nRun Code Online (Sandbox Code Playgroud)\n\n当算法是时AES-GCM(即当 curve 被替换为 eg 时{ name: \'AES-GCM\', length: 256 }),上面的方法有效,但其他算法也会抛出异常,所以我怀疑我错过了一些东西......微妙。
我希望 WebCrypto 适合接受随机位并生成 ECDH 公钥/私钥对。看起来情况可能并非如此。
\n\n另一种方法是使用PBKDF2可deriveBits用于手动创建 ECDH 密钥对的工具。如果这确实是唯一的选择,那么将随机位转换为公钥/私钥(即引用和公共实现)的常用算法是什么?如果我必须开发一些东西,我可能会将其发布在这里并进行兴趣和评论。
使用 PBKDF 是为了避免在给定(私有)参数时必须生成 ECDH 密钥对的公钥(x和) 。和是导数,因此不需要存储,并且我们有一个非常有限的数据存储 \xe2\x80\x94 仅适用于私钥,例如 192 位,或多或少(PBKDF 可以平滑该位)尺寸也一样,但这是一个旁白)。ydxy
如果 WebCrypto 计算x和y当给定(伪)随机参数时,可以d实现/说明所需的结果,如下所示:
>>> curve = { name: \'ECDH\', namedCurve: \'P-256\' }\n>>> k = await crypto.subtle.generateKey(curve, true, [\'deriveKey\'])\n>>> pri = await crypto.subtle.exportKey(\'jwk\', k.privateKey)\n>>> delete pri.x\n>>> delete pri.y\n>>> k2 = await crypto.subtle.importKey(\'jwk\', pri)\n ^^ errors\nRun Code Online (Sandbox Code Playgroud)\n\n在许多示例中,PBKDF 用于生成 (AES) 密钥。我希望 WebCrypto 中已经存在的计算x和y椭圆曲线功能可以通过 PBKDF2 获得deriveKey。
Javascript 中的 DIY 替代方案是解析 JWK/Base64(URL 变体),然后使用带有模运算的大整数函数(例如费马小定理),最后编写椭圆曲线点加法函数,加倍和乘法。这就是我所做的(这里是 ECC 数学)。但我希望这一切都是不必要的,因为 WebCrypto 中存在执行此操作的代码,并且我只是希望使用或importKey使用deriveKey它。
重申一下:没有用户生成的密码;使用此类来生成 ECDH 密钥被认为是不明智的。
\n布莱恩,
使用 WebCrypto 无法根据密码确定性地创建密钥对。
对不起。
您可以根据 Javascript 中的密码确定性地创建密钥对,然后导入该密钥对,只要它是正确表示形式的 secp256r1 密钥即可。
有一些 JavaScript 库支持根据密码确定性地创建密钥对。我无法对这些库的正确性或安全性或是否有库为 secp256r1 执行此操作做出任何声明。当然,密钥生成是使用加密货币时要考虑的最重要的方面之一,并且基于弱熵源这样做是不好的。
如果您决定继续采用这种方法,尽管导入给定类型的密钥非常简单,请参阅: https: //github.com/diafygi/webcrypto-examples#ecdsa---importkey
TL;DR 您的里程会因这种方法而有所不同,但这是可能的。
瑞安
| 归档时间: |
|
| 查看次数: |
2236 次 |
| 最近记录: |