简介

Diffie-Hellman(简称DH)是密钥交换算法之一,它的作用是保证通信双方在非安全的信道中安全地交换密钥。目前DH最重要的应用场景之一,就是在HTTPS的握手阶段,客户端、服务端利用DH算法交换对称密钥。

下面会先简单介绍DH的数理基础,然后举例说明如何在nodejs中使用DH相关的API。

数论基础

要理解DH算法,需要掌握一定的数论基础。感兴趣的可以进一步研究推导过程,或者直接记住下面结论,然后进入下一节。

  1. 假设 Y = a^X mod p,已知X的情况下,很容易算出Y;已知道Y的情况下,很难算出X;
  2. (a^Xa mod p)^Xb mod p = a^(Xa * Xb) mod p

握手步骤说明

假设客户端、服务端挑选两个素数a、p(都公开),然后

  • 客户端:选择自然数Xa,Ya = a^Xa mod p,并将Ya发送给服务端;
  • 服务端:选择自然数Xb,Yb = a^Xb mod p,并将Yb发送给客户端;
  • 客户端:计算 Ka = Yb^Xa mod p
  • 服务端:计算 Kb = Ya^Xb mod p

Ka = Yb^Xa mod p

= (a^Xb mod p)^Xa mod p
= a^(Xb * Xa) mod p
= (a^Xa mod p)^Xb mod p
= Ya^Xb mod p
= Kb

可以看到,尽管客户端、服务端彼此不知道对方的Xa、Xb,但算出了相等的secret。

Nodejs代码示例

结合前面小结的介绍来看下面代码,其中,要点之一就是client、server采用相同的素数a、p。

var crypto = require('crypto');var primeLength = 1024; // 素数p的长度
var generator = 5; // 素数a// 创建客户端的DH实例
var client = crypto.createDiffieHellman(primeLength, generator);
// 产生公、私钥对,Ya = a^Xa mod p
var clientKey = client.generateKeys();// 创建服务端的DH实例,采用跟客户端相同的素数a、p
var server = crypto.createDiffieHellman(client.getPrime(), client.getGenerator());
// 产生公、私钥对,Yb = a^Xb mod p
var serverKey = server.generateKeys();// 计算 Ka = Yb^Xa mod p
var clientSecret = client.computeSecret(server.getPublicKey());
// 计算 Kb = Ya^Xb mod p
var serverSecret = server.computeSecret(client.getPublicKey());// 由于素数p是动态生成的,所以每次打印都不一样
// 但是 clientSecret === serverSecret
console.log(clientSecret.toString('hex'));
console.log(serverSecret.toString('hex'));

相关链接

理解 Deffie-Hellman 密钥交换算法

迪菲-赫尔曼密钥交换

Secure messages in NodeJSusing ECDH

Keyless SSL: The Nitty Gritty Technical Details

Nodejs进阶:使用DiffieHellman密钥交换算法相关推荐

  1. 8月30日云栖精选夜读:Nodejs进阶:使用DiffieHellman密钥交换算法

    原文地址 Diffie-Hellman(简称DH)是密钥交换算法之一,它的作用是保证通信双方在非安全的信道中安全地交换密钥.目前DH最重要的应用场景之一,就是在HTTPS的握手阶段,客户端.服务端利用 ...

  2. Diffie-Hellman 密钥交换算法

    在文章 安全之初--加解密.签名和证书理解 中说了,密钥交换是对称加密的一大问题,并给出了利用非对称加密传输密钥的解决方案.其实,我们还有另一种解决方案,那就是本文的Diffie-Hellman 密钥 ...

  3. python实现Diffie-Hellman密钥交换算法

    Program : Diffie–Hellman key exchange (on group) In this part, you are required to implement the Dif ...

  4. 密码学--Diffie-Hellman密钥交换

    1.W.Diffie与M.Hellman在1976年提出一个称为Diffie-Hellman密钥交换的公钥密码算法.该算法能用来在两个用户之间安全地交换密钥材料,从而使双方得到一个共享的会话密钥,但该 ...

  5. https详解+密钥交换算法+公钥与私钥

    1.https的简单介绍 https(超文本传输安全协议),它是一个安全通信通道,简单讲就是http的安全版.它使用安全套接字层(SSL)进行信息交换,在http下加入SSL层,https的安全基础是 ...

  6. java dh算法_dh密钥交换算法java

    dh密钥交换算法java 迪菲-赫尔曼密钥交换(Diffie–Hellman key exchange,简称"D–H") 是一种安全协议. 它可以让双方在完全没有对方任何预先信息的 ...

  7. 密钥交换算法 - Java加密与安全

    密钥交换算法我们在使用对称加密算法的时候,我们用的是同一个密钥key 我们以AES加密为例,当我们需要加密明文,我们需要一个随机生成的key,作为密钥进行加解密,最后我们的问题是如何传递密钥 因为不给 ...

  8. 密码学 专题 DH密钥交换算法

    注意事项: SSL中密钥交换算法有6种:无效(没有密钥交换).RSA.匿名Diffie-Hellman.暂时Diffie-Hellman.固定Diffie-Hellman.Fortezza 生成对话密 ...

  9. 信息安全密码学实验四:Diffie-Hellman密钥交换协议的设计与实现

    一.实验目的 理解Diffie-Hellman算法的实现原理,编程实现Diffie-Hellman算法的程序,能够实现密钥协商的目的 二.实验原理 w.Diffie与M.Hellman在1976年提出 ...

最新文章

  1. C语言,后门程序,C语言CGI编程二 - 编写cmd后门
  2. lnmp mysql 自动关闭_mysql总是自动停止 日志提示Plugin ‘FEDERATED’ is disabled的解决办法...
  3. 人脸识别(5)---人脸识别技术及应用概览
  4. LVS三种工作模式、十种调度算法介绍
  5. CCF CSP 201703-1 分蛋糕
  6. 登陆模板_曝北京国安克星将登陆中超,3年进84球,可成中超新政引援模板
  7. sql 查询 当不想查出记录时候采用的方法
  8. Pascal VOC 2007和2012数据集下载地址(不需国外,速度依旧让你感动)
  9. 如何评估开发费 (From 程序匠人)
  10. 如何从零学习游戏开发
  11. 手把手教你摆地摊之摆摊卖什么
  12. XMind8 pro 免费破解版!速度
  13. 全国公立医院病案首页上报系统(适用于二、三级医院)
  14. “十四五”数字泉城建设应用场景
  15. knex 找不到mysql_node knex mysql ER_NOT_SUPPORTED_AUTH_MODE
  16. 【Tryhackme】Hacker of the Hill #1
  17. 全球定位系统GPS简介
  18. 大数据应用安全研究报告
  19. 四、ESP32单片机wifi的AP与STA模式使用
  20. Column ‘createTime’ cannot be null,could not execute statement; SQL [n/a]; constraint [null]; nested

热门文章

  1. 概率论-2.1 随机变量及其分布(重点:右连续的来源)
  2. 1.0 mysql的连接
  3. html 文字输出语音,html 录音与文本转语音demo
  4. Struts2之类型转换
  5. Oracle 多行合并一行 方法
  6. 四、CI框架之通过URL路径访问C中的函数
  7. redis雪崩解决方案
  8. javabean自定义组件
  9. ViewState机制的解析(转自csdn)
  10. [导入]浅析.Net下的AppDomain编程