Diffie-Hellman( DH ):密钥交换协议/算法 ( Diffie-Hellman Key Exchange/Agreement Algorithm )算法
百科摘录:安全
Diffie-Hellman是一种创建密钥的方法,而不是加密方法ui
这个机制的巧妙在于须要安全通讯的双方能够用这个方法肯定对称密钥,加密
而后能够用这个密钥进行加密和解密,spa
可是注意,这个密钥交换协议/算法只能用于密钥的交换,而不能进行消息的加密和解密,.net
双方肯定要用的密钥后,要使用其余对称密钥操做加密算法实现加密和解密消息。code
如下是我对DH算法的理解:对象
Diffie-Hellman基于的数学原理: 1.对于一个整数b和素数p的一个原根a 2.能够找到唯一的指数i 3.使得 b = a^i mod p ( a的i次方对p取余 ) 一个例子说明Diffie-Hellman算法计算对称密钥的步骤: 1.一个公共素数p = 5,原根 a = 3 2.用户User1生成一个指数i1 = 3 3.用户User1计算b1 = 2,并把b1传给User2 4.User2生成一个指数i2 = 2 5.User2计算b2 = 4,把b2传给User1 6.User1把b2做为a再次计算b1 = 4 7.User2把b1做为a再次计算b2 = 4 8.最终获得的b一、b2便是User1和User2共同的密钥
基于上诉使用 Node.js 实现DH算法:blog
'use strict'; //引入crypto模块 const crypto = require('crypto'); //实例化一个素数p的位数为16位的DH对象,第二个参数是指定原根a,默认为2(十六进制) const User1 = crypto.createDiffieHellman(16, 0xf); //随机生成生成素数p let p = User1.getPrime(); //获取原根a,默认为2 let a = User1.getGenerator(); //获取一个随机数i1,并根据p和原根a生成b1 let b1 = User1.generateKeys(); //以十六进制的形式将素数p、原根a和User1的整数b1打印到控制台上 console.log(p.toString('hex'),a.toString('hex'),b1.toString('hex')); //实例化一个素数是p,原根是a的DH对象 const User2 = crypto.createDiffieHellman(p, a); //获取一个随机数i2,并根据p和a生成b2 let b2 = User2.generateKeys(); console.log(b2.toString('hex')); //User1和User2交换b一、b2再次计算生成对称密钥 let key1 = User1.computeSecret(b2); let key2 = User2.computeSecret(b1); console.log(key1.toString('hex'), key2.toString('hex'));
注:对于上述方法我比较想说的是createDiffieHellman方法get
1.第一个参数表示的是素数p的位数
2.p的位数在Node中最少是16位,这里咱们选择16位是为了计算机在计算的时候快一点
3.第一个参宿的值还有:2,4,8,16(16前面的这些数计算机会默认为16),32,64,128,256,512,1024....
4.p的值越大计算机计算起来就越慢,可是用来进行数据加密就更安全,通常会选择5十二、1024这些值生成密钥
5.第二个参数表示的是原根a,默认是十六进制的02
6.若是要传参数进去的话须要传入十六进制数(如:0xabcdef),不然会报错
7.每次执行程序的时候素数p和i都是随机生成的,因此每次生成的密钥都是不同的
8.原根a是不会变的
拓展阅读:DH算法原理
做者:yine
来源:CSDN