Diffie-Hellman算法是第一个公开密钥算法,早在 1976 年就发现了。其安全性源于在有限域上计算离散对数,比计算指数更为困难。该算法可以使两个用户之间安全地交换一个密钥,但不能用于加密或解密信息。
该算法是一种建立密钥的方法,并非加密方法,但其产生的密钥可用于加密、密钥管理或任何其它的加密方式,这种密钥交换技术的目的在于使两个用户间能安全地交换密钥(KEY)以便用于今后的报文加密。该算法需要公开两个参数:质数 n 和其原根 g,同时通信双方 A 和 B 随机选择自己的私钥 x 和 y,通过交换g
x
mod n 和g
y
mod n 后,它们就可以生成两者之间的会话密钥了。
以下是DH密钥交换的C++实现:
#include <iostream>
#include<cmath>
#include<stdlib.h>
#include<time.h>
using namespace std;
int IsPrime(int a, int b)
int temp;
while (b != 0)
temp = b;
b = a % b;
a = temp;
if (a == 1)
return 1;
return 0;
void Euler(int n, int* s, int& sum)
int i, flag;
for (i = 1; i < n; i++)
flag = IsPrime(i, n);
if (flag == 1)
s[sum] = i;
sum++;
void bubbleSort(int arr[], int n)
for (int i = 0; i < n; i++)
for (int j = 0; j < n - i - 1; j++)
if (arr[j] > arr[j + 1])
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
int power(long int x, long int y, long int n)
long int t = 1;
while (y > 0)
if (y % 2 == 1)
y -= 1;
t = t * x % n;
else {
y /= 2;
x = x * x % n;
return t % n;
void root(int n, int sum, int s[])
int i, j;
int flag[100], k;
for (i = 0; i < sum; i++)
k = 0;
for (j = 1; j < sum + 1; j++)
flag[j - 1] = power(s[i], j, n);
bubbleSort(flag, sum);
for (j = 0; j < sum; j++)
if (flag[j] != s[j])
k = 1;
if (k == 0)
cout << s[i] << " ";
bool is_prime(int number)
int i;
for (i = 2; i <= sqrt(number); i++)
if (number % i == 0)
return false;
if (i > sqrt(number))
return true;
int main()
int a, p;
int Xa, Xb;
int Ya, Yb;
int KeyA, KeyB;
srand((unsigned)time(NULL));//随机时间定义种子
while (1)
p = 2 + (rand() % 95);//控制产生的随机数在2~97之间
if (is_prime(p))
cout << "随机生成的素数p=" << p << endl;
break;
continue;
}//产生随机素数p
cout << "输入素数 p" << endl;
cin >> p;
Xa = 2 + rand() % 30;//控制产生的随机数在2~29之间
Xb = 2 + rand() % 30;//控制产生的随机数在2~29之间
if (Xa != Xb)
cout << "随机生成的数a=" << Xa << endl;
cout << "随机生成的数b=" << Xb << endl;
break;
continue;
}//产生随机数
cout << "a b" << endl;
cin >> Xa >> Xb;
cout << endl;
Ya = a;
for (int i = 0; i < Xa; i++)
Ya = (Ya % p) * a;
Ya = Ya % p;
Yb = a;
for (int i = 0; i < Xb; i++)
Yb = (Yb % p) * a;
Yb = Yb % p;
cout << "KA=" << Ya << " KB=" << Yb << endl;
KeyA = Yb;
for (int i = 0; i < Xa; i++)
KeyA = (KeyA % p) * Yb;
KeyA = KeyA % p;
KeyB = Ya;
for (int i = 0; i < Xb; i++)
KeyB = (KeyB % p) * Ya;
KeyB = KeyB % p;
cout << "KeyA=" << KeyA << " KeyB=" << KeyB << endl;
cout << "解密成功!" << endl;
return main();
system("pause");
Diffie-Hellman算法是第一个公开密钥算法,早在 1976 年就发现了。其安全性源于在有限域上计算离散对数,比计算指数更为困难。该算法可以使两个用户之间安全地交换一个密钥,但不能用于加密或解密信息。该算法是一种建立密钥的方法,并非加密方法,但其产生的密钥可用于加密、密钥管理或任何其它的加密方式,这种密钥交换技术的目的在于使两个用户间能安全地交换密钥(KEY)以便用于今后的报文加密。该算法需要公开两个参数:质数 n 和其原根 g,同时通信双方 A 和 B 随机选择自己的私钥 x 和 y,通过交换g
Diffie-Hellman密钥交换算法
了解Diffie-Hellman密钥交换方法和步骤
VC++环境下,编程实现Diffie-Hellman密钥交换方法和步骤
一、 采用Diffie-Hellman密钥交换方法,编程实现两个用户的密钥交换
按照步骤,先指定一个本原根,然后分别求密钥。
(1) 选择公共数p,a;
(2) 用户Alice选择一个秘密数Xa,并将自己的公钥Ya = (a^Xa) mod p发送给用户Bob
(3) 用户Bob选择一个秘密数Xb,并将自己的公钥Yb = (a^Xb)mod p发送给用户Alice
(4) Alice计算 共享密钥Ka = (Yb^Xa) mod p
(5) Bob计算 共享密钥Kb =(Ya^Xb) mod p
(6) 此时 Ka =Kb
程序实现
#include<iostream&
Diffie Hellman密钥交换
Diffie-Hellman算法是Whitefield Diffie和Martin Hellman在1976年公布的一种密钥交换算法,它是一种建立密钥的方法,而不是加密方法,所以密钥必须和其他一种加密算法结合使用。这种密钥交换技术的目的在于使两个用户安全的交换一个密钥一遍后面的报文加密。
D-H原理
上图很经典
它的数学基础就是离散对数这个数学难题。用它进行密钥交换的过程简述如下:
选取两个大数p和g并公开,其中p是一个素数,g是p的一个模p本原单位根(primiti
1、Diffie-Hellman算法简介
Diffie-Hellman算法(以下简称为:DH算法),是最早的密钥交换算法之一,它使得通信的双方能在非安全的信道中安全的交换密钥,用于加密后续的通信消息。
起基本流程原理如下:
假定小明和小红期望在一个不安全的网络中协商一个共同的密钥,那么进行如下步骤:
两人先说好大素数(质数)p和它的原始根g。
小明随机产生一个数a,并计算A = p^a mod g, 发送给小红。
小红随机产生一个数b,并计算......
DH密钥交换算法因为不能验证数据的来源,所以不能抵御中间人击.
如果需要安全强度更高的非对称加密算法,可以采用Ecc椭圆曲线加密算法或者使用广泛的RSA加密算法.
不对称加密算法主要用于在公共网络安全的数据传输.
不对称加密算法关键部分在于大整数数学函数库的使用.
C/C++实现的DH算法动态链接库,需要64位的可以自己手动编译.
Diffie-Hellman(简称DH)是密钥交换算法之一,它的作用是保证通信双方在非安全的信道中安全地交换密钥。目前DH最重要的应用场景之一,就是在HTTPS的握手阶段,客户端、服务端利用DH算法交换对称密钥。
下面会先简单介绍DH的数理基础,然后举例说明如何在nodejs中使用DH相关的API。下面话不多说了,来一起看看详细的介绍吧。
要理解DH算法,需要掌握一定的数论基础。感兴趣的可以进一步研究推导过程,或者直接记住下面结论,然后进入下一节。
假设 Y = a^X mod p,已知X的情况下,很容易算出Y;已知道Y的情况下,很难算出X;
(a^Xa mod p
#Diffie-Hellman 解释了关于应用密码学的闪电演讲,特别是使用 Node.js 代码的 Diffie Helmman 密钥交换作为示例。
git clone https://github.com/nickdesaulniers/diffie-hellman-explained.git
cd diffie-hellman-explained
npm install
node tutorial.js
d1 = pyDH . DiffieHellman ()
d2 = pyDH . DiffieHellman ()
d1_pubkey = d1 . gen_public_key ()
d2_pubkey = d2 . gen_public_key ()
d1_sharedkey = d1 . gen_shared_key ( d2_pubkey )
d2_sharedkey = d2 . gen_shared_key ( d1_pubkey )
d1_sharedkey == d2_sharedkey
默认情况下,它使用组 14(2048 位)。 使用另一个组(例如,15):
d1 = pyDH . DiffieHellman (
一、实验目的
理解Diffie-Hellman算法的实现原理,编程实现Diffie-Hellman算法的程序,能够实现密钥协商的目的
二、实验原理
w.Diffie与M.Hellman在1976年提出一个称为Diffie——Hellman密钥交换的公钥密码算法。该算法能用来在两个用户之间安全地交换密钥材料,从而使双方得到一个共享的会话密钥,但该算法只能用于交换密钥,不能用于加/解密。
Diffie...