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 ...
随机推荐
- Sed 命令详解 正则表达式元字符
1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...
- JS判断2个时间是否在同一周
function isSameWeek(old, now) { var oneDayTime = 1000 * 60 * 60 * 24; var old_count = parseInt(+old ...
- cocos2dx & cocostudio 实现模态对话框
用cocos2dx实现模态对话框 http://www.cnblogs.com/mrblue/(转自于) ui部分使用了cocoStudio,注意这里没有实现怎么屏蔽其他的输入事件,其他的文档已经太多 ...
- NodeJS中 Path 模块
var path = require('path'); // 当发现有多个连续的斜杠时,会替换成一个: 当路径末尾包含斜杠时,会保留: // 在 Windows 系统会使用反斜杠. var p = p ...
- CMake简易入门
使用CMake编译 CMake工具用于生成Makefile文件.用户通过编写CMakeLists.txt文件,描述构建过程(编译.连接.测试.打包),之后通过解析该文件,生成目标平台的Makefile ...
- Silk codec的一些资料
Skype表示它最近将开始向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器. Silk下载地址如下 http://developer.skype.com/silk/SILK_ ...
- Gym - 100513B:Colored Blankets (构造)(存疑)
题意:给定N的棒棒,K种颜色,每个棒棒的两端可以涂色.现在已知所有的线段要么有一端涂色,要么两端都没有涂色,现在要求把所有的没涂色的部分涂色,使得我们可以把涂色后的棒棒分为N/K组,每组的涂色情况相同 ...
- 发布django 程序
1.配置需求环境 pip freeze > requirements.txt 在开发环境将工程依赖的包导出. pip install virtualenv pip install virtual ...
- C语言中clock函数的使用
#include<cstdio> #include<cstdlib> #include<ctime> using namespace std; int main() ...
- Velocity常用标签的讲解
Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Veloci ...