Node.js的加密模块crypto之使用ECDH类生成EC Diffie-Hellman交换密钥

 2015年07月24日    1996     声明


ECDH是基于ECC(Elliptic Curve Cryptosystems,椭圆曲线密码体制,参看ECC)的Diffie-Hellma密钥交换算法。交换双方可以在不共享任何秘密的情况下协商出一个密钥。与Diffie-Hellman相比ECDH具有ECC的高强度、短密钥长度、计算速度快等优点。Node.js的crypto模块,封装了ECDH类,可以用这个类来生成EC Diffie-Hellman交换密钥。

  1. ECDH类的创建
  2. ECDH类简介
  3. ECDH类使用示例


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