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. 我理解的关于Vue.nextTick()的正确使用

    什么是Vue.nextTick() 官方文档解释如下: 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 我理解的官方文档的这句话的侧重点在最后那半 ...

  2. 关于android 图片加载优化

    android应用对图片处理算是比较频繁的了,尤其是在程序加载大量图片和高分辨率图片时,最容易产生oom异常,下面是个人平时一些省内存加载方法 方法一: public Bitmap decodeFil ...

  3. I.MX6 Android 永不休眠

    /************************************************************************* * I.MX6 Android 永不休眠 * 说明 ...

  4. I.MX6 Python3 OpenCV

    /************************************************************************* * I.MX6 Python3 OpenCV * ...

  5. pthread_detach()函数

    创建一个线程默认的状态是joinable. 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码). 所以创建线程者应该调 ...

  6. NOI2018网络同步赛游记

    Day1 t1是一道NOI选手眼中的送分题,对于我来说还是有难度的,用了个把小时想了出来可持久化并查集的做法,最后一个点被卡常.赛后才发现Kruskal重构树是这样的简单.t2.t3由于我真的是太弱了 ...

  7. 【LeetCode】019. Remove Nth Node From End of List

    Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...

  8. 【VisualStudio】软件安装中出现的问题

    针对2017版本安装 1. 安装windows通用平台工具出错 报错信息:15605 FQ安装. 2.  LINK : fatal error LNK1104: 无法打开文件“gdi32.lib” 在 ...

  9. Git远程克隆仓库出现Permission denied (publickey)

    $ git clone git@github.com:DavidWanderer/test1.git Cloning into 'test1'... Warning: Permanently adde ...

  10. 使用hibernate validator出现

    1.javax.validation.UnexpectedTypeException: No validator could be found for type: java.lang.Integer ...