Diffie-Hellman( DH ):密钥交换协议/算法 ( Diffie-Hellman Key Exchange/Agreement Algorithm )

百科摘录:

Diffie-Hellman是一种建立密钥的方法,而不是加密方法

这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥,

然后可以用这个密钥进行加密和解密,

但是注意,这个密钥交换协议/算法只能用于密钥的交换,而不能进行消息的加密和解密,

双方确定要用的密钥后,要使用其他对称密钥操作加密算法实现加密和解密消息。

以下是我对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.最终得到的b1、b2即是User1和User2共同的密钥

基于上诉使用 Node.js 实现DH算法:

'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交换b1、b2再次计算生成对称密钥
let key1 = User1.computeSecret(b2);
let key2 = User2.computeSecret(b1);

console.log(key1.toString('hex'), key2.toString('hex'));

注:对于上述方法我比较想说的是createDiffieHellman方法

1.第一个参数表示的是素数p的位数

2.p的位数在Node中最少是16位,这里我们选择16位是为了计算机在计算的时候快一点

3.第一个参宿的值还有:2,4,8,16(16前面的这些数计算机会默认为16),32,64,128,256,512,1024....

4.p的值越大计算机计算起来就越慢,但是用来进行数据加密就更安全,一般会选择512、1024这些值生成密钥

5.第二个参数表示的是原根a,默认是十六进制的02

6.如果要传参数进去的话需要传入十六进制数(如:0xabcdef),否则会报错

7.每次执行程序的时候素数p和i都是随机生成的,所以每次生成的密钥都是不一样的

8.原根a是不会变的

拓展阅读:DH算法原理

      作者:yine

      来源:CSDN

Node.js 内置模块crypto加密模块(4) Diffie Hellman的更多相关文章

  1. Node.js 内置模块crypto加密模块(3) HMAC

    HMAC:哈希消息认证码 ( Hash-based Message Authentication Code ) HMAC是密钥相关的哈希算法 使用 HMAC 进行加密的Node实现的一种方法: &qu ...

  2. Node.js 内置模块crypto加密模块(5) RSA

    RSA加密算法 写在前面: 了解RSA算法的原理请查看下面的文章 一文搞懂 RSA 算法 来源:简书  作者:somenzz 在使用 Node 进行 RSA 加密之前我们首先需要获取RSA公共和私有密 ...

  3. Node.js 内置模块crypto加密模块(2) AES

    AES:高级加密标准 ( Advanced Encryption Standard ) AES是一种对称加密算法:加密需要密钥,且加密密钥和解密密钥相同 下面是AES加密的Node实现: " ...

  4. Node.js 内置模块crypto加密模块(1) MD5 和 SHA

    MD5:消息摘要算法(Message-Digest Algorithm) SHA家族:安全散列算法( Secure Hash Algorithm ) 1.首先看一个简单的加密 "use st ...

  5. Node.js 内置模块crypto使用事件方法(onreadable)加密的一些问题

    javaScript代码如下: 'use strict'; const crypto = require('crypto'); //实例化一个AES加密对象 const aesEncrept = cr ...

  6. [Node.js] Gzip + crypto in stream

    We can using gzip and crypto with stream: const fs = require('fs') const zlib = require('zlib') cons ...

  7. Node.js 内置模块fs(文件系统)

    fs模块的三个常用方法 1.fs.readFile() -- 读文件 2.fs.writeFile() -- 写文件 3.fa.stat() -- 查看文件信息 fs模块不同于其它模块的地方是它有异步 ...

  8. Node.js 内置模块fs的readdir方法 查看某个文件夹里面包含的文件内容

    fs.readdir(path[, options], callback) 例: "use strict"; const fs = require("fs"); ...

  9. Node.js 内置模块Stream(流)

    "流"是一种抽象的数据结构 通过使用"流"可以将一段数据分割成几段,并按顺序传输,使用"流"可以降低对系统性能的要求,减少对CPU的消耗 S ...

随机推荐

  1. 与STL文件相关的各类学习地址

    几个网址: 1.STL :https://en.wikipedia.org/wiki/STL_(file_format)#ASCII_STL 2.一个博客的文章地址: 三维图形数据格式 STL的 读取 ...

  2. 201621123014《JAVA程序设计》第2周学习总结

    1. 本周学习总结 引用数据类型:JAVA定义字符串实际上是创建字符串的引用,将引用指向需要的字符串. 字符串常量池:直接对引用赋值时,会先在字符串中搜索是否有这个对象,已有则不创建直接指向它. St ...

  3. mfc设置鼠标状态OnSetCursor响应函数

    参考文章:1.https://bbs.csdn.net/topics/70084486 2.https://blog.csdn.net/wang15061955806/article/details/ ...

  4. C++内存使用机制基本概念详解

    .程序使用内存区 一个程序占用的内存区一般分为5种: ()全局.静态数据区:存储全局变量及静态变量(包括全局静态变量和局部静态变量) ()常量数据区:存储程序中的常量字符串等. ()代码区:存储程序的 ...

  5. Mule ESB学习【转-结合了网络上的一些资源】

    1.SOA标准之一:SCA架构思想 SOA在Java领域有两套标准:一个是SUN推出的JBI(没有得到BEA和IBM的承认),另外一个是:IBM和BEA等公司推出的SCA和SDO标准. JBI之关注J ...

  6. ONTAK2010 Peaks加强版

    给一个图,每个点有点权,$q$ 次询问从 $x$ 开始只走点权小于等于 $y$ 的路径能到的点中第 $k$ 大的点权,无解输出 -1 强制在线 请注意因为这个 sb 博主为了描述方便,这里的题目描述用 ...

  7. bzoj 2733 永无乡 线段树

    题目: 支持两种操作: 合并两点所在的联通块 查询某点所在联通块内权值第k小. 题解 平衡树启发式合并随便搞一搞就好了. 我写了一个线段树合并 #include <cstdio> #inc ...

  8. 第k小和(搜索)

    Description [问题描述] 从n个数中选若干(至少1)个数求和,求所有方案中第k小的和(和相同但取法不同的视为不同方案).[输入格式]    第一行输入2个正整数n,k.    第二行输入这 ...

  9. RenderingPath 渲染路径

    http://blog.csdn.net/lichaoguan/article/details/42554821 RenderingPath 渲染路径 Deferred Lighting 延时光照 延 ...

  10. Windows下安装MySQL-5.7.19

    下载MySQL-5.7.19版本,解压之后发现安装包不是一个exe文件: 于是网上找资料,发现了另外一种安装方法. 1.新建一个环境变量,我的电脑-属性-高级-环境变量-系统变量-新建 2.在系统变量 ...