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 ...
随机推荐
- 造成segmentation fault的可能原因分析
一 造成segment fault,产生core dump的可能原因 1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串 ...
- 大数据日志分析产品——SaaS Cloud, e.g. Papertrail, Loggly, Sumo Logic;Open Source Frameworks, e.g. ELK stack, Graylog;Enterprise Products, e.g. TIBCO LogLogic, IBM QRadar, Splunk
Learn how you can maximize big data in the cloud with Apache Hadoop. Download this eBook now. Brough ...
- Eclipse_常用技巧_03_字母大小写转换快捷键
eclipse中字母大小写转换快捷键: ctrl+shift+x 转为大写 ctrl+shift+y 转为小写
- CTreeCtrl控件
一.HTREEITEM HTREEITEM是树中节点的句柄,也就是一个DWORD值.在树中唯一标识一个节点.它的值对于程序员其实没有什么意义,只是可以通过它找到一个节点,从而取得节点的属性,如 Get ...
- 2_flyweight, 轻量化模式
### instanced rendering. send shared data to gpu just once mesh, texture, leaves push every instance ...
- poj3630 Phone List (trie树模板题)
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26328 Accepted: 7938 Descr ...
- 【集成学习】lightgbm参数介绍(sklearn)
# XGBoost和LightGBM部分参数对比表: lightgbm.sklearn参数介绍(官网)
- HihoCoder1664 01间隔方阵([Offer收割]编程练习赛40)(DP)
给定一个NxM的01矩阵,小Hi希望从中找到一个01间隔的子方阵,并且方阵的边长越大越好. 例如对于 0100100 1000101 0101010 1010101 0101010 在右下角有一个4x ...
- GridView有用的小方法--2017年2月13日
原文:http://blog.csdn.net/21aspnet/article/category/285354更多:http://blog.csdn.net/21aspnet/article/cat ...
- JavaScript下的进制转换
JavaScript下的进制转换 //十进制转其他进制 var num = 99; console.log('十进制: ', num); console.log('八进制:', (num).toStr ...