Node.js 内置模块crypto加密模块(4) Diffie Hellman
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的更多相关文章
- Node.js 内置模块crypto加密模块(3) HMAC
HMAC:哈希消息认证码 ( Hash-based Message Authentication Code ) HMAC是密钥相关的哈希算法 使用 HMAC 进行加密的Node实现的一种方法: &qu ...
- Node.js 内置模块crypto加密模块(5) RSA
RSA加密算法 写在前面: 了解RSA算法的原理请查看下面的文章 一文搞懂 RSA 算法 来源:简书 作者:somenzz 在使用 Node 进行 RSA 加密之前我们首先需要获取RSA公共和私有密 ...
- Node.js 内置模块crypto加密模块(2) AES
AES:高级加密标准 ( Advanced Encryption Standard ) AES是一种对称加密算法:加密需要密钥,且加密密钥和解密密钥相同 下面是AES加密的Node实现: " ...
- Node.js 内置模块crypto加密模块(1) MD5 和 SHA
MD5:消息摘要算法(Message-Digest Algorithm) SHA家族:安全散列算法( Secure Hash Algorithm ) 1.首先看一个简单的加密 "use st ...
- Node.js 内置模块crypto使用事件方法(onreadable)加密的一些问题
javaScript代码如下: 'use strict'; const crypto = require('crypto'); //实例化一个AES加密对象 const aesEncrept = cr ...
- [Node.js] Gzip + crypto in stream
We can using gzip and crypto with stream: const fs = require('fs') const zlib = require('zlib') cons ...
- Node.js 内置模块fs(文件系统)
fs模块的三个常用方法 1.fs.readFile() -- 读文件 2.fs.writeFile() -- 写文件 3.fa.stat() -- 查看文件信息 fs模块不同于其它模块的地方是它有异步 ...
- Node.js 内置模块fs的readdir方法 查看某个文件夹里面包含的文件内容
fs.readdir(path[, options], callback) 例: "use strict"; const fs = require("fs"); ...
- Node.js 内置模块Stream(流)
"流"是一种抽象的数据结构 通过使用"流"可以将一段数据分割成几段,并按顺序传输,使用"流"可以降低对系统性能的要求,减少对CPU的消耗 S ...
随机推荐
- Mysql总结_02_mysql数据库忘记密码时如何修改
1.从cmd进入mysql的bin下,输入命令 mysqld --skip-grant-tables 回车 注:(输入命令前,确保在任务管理器中已没有mysql的进程在运行,可输入命令:net s ...
- 3_observer
#Observer 成就系统 achievements system 玩家完成某种成就后,通知监督者,监督者做出相应出来 ``` //简单来说就是事件触发的时候, 通知监督者 class Observ ...
- bzoj-2458 2458: [BeiJing2011]最小三角形(计算几何+分治)
题目链接: 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1101 Solved: 380 Des ...
- MySQL_西安11月销售昨日未上架的产品_20161212
#C034西安11月销售昨日未上架的产品 SELECT 城市,a.订单日期,a.客户数,a.订单数,b.产品数,a.金额,c.销售确认额,c.毛利额,c.毛利率 FROM ( SELECT 城市,订 ...
- iOS中使用NSInvocation
在iOS中可以使用NSInvocation进行动态调用方法. /* NSInvocation is much slower than objc_msgSend()... Do not use it i ...
- jenkins pipline 用法收集
1.下载多个项目 node { stage('clone'){ dir('test1'){ checkout([$class: 'GitSCM', branches: [[name: '*/maste ...
- HDOJ1181(简单DFS)(练习使用STL)
#include<iostream> #include<cstdio> #include<string> #include<map> #include& ...
- 多puppetmaster,多ca,keepalived+haproxy(nginx)puppet集群搭建
多puppetmaster,多ca,keepalived+haproxy(nginx)puppet集群搭建 一.服务器详情 192.168.122.111 pm01.jq.com pm01 #(pup ...
- TS学习之基础类型
1.布尔值 let isDone:boolean = false 2.数字(支持二,八,十,十六进制) let width:number = 20 3.字符串 let name:string = &q ...
- popup的简单应用举例
一.首先说一下自执行函数 1. 立即执行函数是什么?也就是匿名函数 立即执行函数就是 声明一个匿名函数 马上调用这个匿名函数 2.popup的举例 点击,弹出一个新的窗口.保存完事,页面不刷新数据就返 ...