如何基于secp256k1曲线从原始公私钥创建ECDH共享密钥?
Node.js crypto:从原始字节生成ECDH共享密钥
你提到的官方示例用的是生成或哈希派生的密钥,下面针对你的两个疑问给出直接解决方案:
1. 导入32字节私钥到ECDH对象
Node.js的ECDH.setPrivateKey()方法直接支持传入Buffer类型的32字节私钥(secp256k1曲线的私钥标准长度就是32字节),不需要额外转换。设置私钥后,ECDH对象会自动推导对应的公钥,无需调用generateKeys()。
示例代码片段:
const crypto = require('crypto'); // 假设这是你的32字节私钥Buffer const myPrivateKeyBuffer = Buffer.from('你的32字节私钥十六进制字符串', 'hex'); // 创建ECDH实例 const ecdh = crypto.createECDH('secp256k1'); // 导入私钥 ecdh.setPrivateKey(myPrivateKeyBuffer); // 此时可通过ecdh.getPublicKey()获取对应公钥(可选操作)
2. 33字节压缩公钥的有效性
33字节的Buffer是secp256k1曲线的压缩格式公钥,完全可以直接作为computeSecret()方法的otherPublicKey参数传入,Node.js的crypto模块会自动识别并处理压缩格式的公钥,不需要额外转换。
完整示例代码
结合你的需求,完整的共享密钥生成代码如下:
const crypto = require('crypto'); // 你的32字节私钥Buffer const alicePrivateKey = Buffer.from('alice的32字节私钥十六进制', 'hex'); // 对方的33字节压缩公钥Buffer const bobCompressedPubKey = Buffer.from('bob的33字节压缩公钥十六进制', 'hex'); // 创建ECDH实例并导入私钥 const aliceEcdh = crypto.createECDH('secp256k1'); aliceEcdh.setPrivateKey(alicePrivateKey); // 计算共享密钥 const sharedSecret = aliceEcdh.computeSecret(bobCompressedPubKey, null, 'hex'); console.log('共享密钥:', sharedSecret);
内容的提问来源于stack exchange,提问作者fadedbee
相关产品推荐
相关产品推荐

