ECDH
是基于ECC(Elliptic Curve Cryptosystems,椭圆曲线密码体制,参看ECC)的Diffie-Hellma密钥交换算法。交换双方可以在不共享任何秘密的情况下协商出一个密钥。与Diffie-Hellman
相比ECDH具有ECC的高强度、短密钥长度、计算速度快等优点。Node.js的crypto模块,封装了ECDH
类,可以用这个类来生成EC Diffie-Hellman交换密钥。
1. ECDH
类的创建:crypto.createECDH(curve_name)
创建ECDH
类使用crypto.createECDH(curve_name)方法,该通过传入的参数曲线名curve_name
(如:'secp256k1'),创建一个 EC Diffie-Hellman 秘钥交换对象。
2. ECDH
类简介
ECDH
类与Diffie-Hellman
类用法相似,其中的方法名也基本相同但参数并不相同,ECDH
类中的相关方法有:
-
ECDH.generateKeys([encoding[, format]])
:生成ECDH
秘钥和公钥,并返回指定格式的公钥。生成的公钥可以转交给第三方使用。
encoding
编码方式:'binary'
,'hex'
, 或'base64'
。如果没有指定编码方式,将返回 Buffer。
format
可以是:'format'
、'compressed'
、'uncompressed'
或'hybrid'
。如果没有指定编码方式,将返回'uncompressed'
格式。 -
ECDH.computeSecret(other_public_key[, input_encoding][, output_encoding])
:以other_public_key
作为第三方公钥来计算共享秘钥,并返回这个共享秘密。
参数input_encoding
为密钥编码方式,output_encoding
为计算出的共享密钥的编码方法。编码方式可以是:'binary'
、'hex'
或'base64'
。如果没有指定编码方式,则默认为一个Buffer。
format
可以是:'format'
、'compressed'
、'uncompressed'
或'hybrid'
。如果没有指定编码方式,将返回'uncompressed'
格式。 -
ECDH.getPublicKey([encoding[, format]])
:根据指定的编码格式返EC Diffie-Hellman
公钥。encoding
编码方式可以是:'binary'
、'hex'
或'base64'
。如果没有指定编码方式,则返回一个Buffer。
format
可以是:'format'
、'compressed'
、'uncompressed'
或'hybrid'
。如果没有指定编码方式,将返回'uncompressed'
格式。 -
ECDH.getPrivateKey([encoding])
:根据指定的编码格式返EC Diffie-Hellman
私钥,编码方式可以是:'binary'
、'hex'
或'base64'
。如果没有指定编码方式,则返回一个Buffer。 -
ECDH.setPublicKey([encoding])
:设置EC Diffie-Hellman
公钥,编码方式可以是:'binary'
、'hex'
或'base64'
。如果没有指定编码方式,默认为Buffer。 -
ECDH.getPrivateKey([encoding])
:设置EC Diffie-Hellman
私钥,编码方式可以是:'binary'
、'hex'
或'base64'
。如果没有指定编码方式,默认为Buffer。
3. ECDH
类使用示例
创建EC Diffie-Hellman
类,生成公钥和私钥后计算共享密钥:
var crypto = require('crypto'); var alice = crypto.createECDH('secp256k1'); var bob = crypto.createECDH('secp256k1'); //生成公钥和私钥 alice.generateKeys(); bob.generateKeys(); //计算共享密钥相同 var alice_secret = alice.computeSecret(bob.getPublicKey(), null, 'hex'); var bob_secret = bob.computeSecret(alice.getPublicKey(), null, 'hex'); //两个共享密钥应该相同 console.log(alice_secret == bob_secret); //tre