添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

1. Diffie-Hellman密钥交换算法原理

DH方法针对的是以下困难的局面:Alice和Bob 想共有一个密钥,用于对称加密。但是他们之间的通信渠道是不安全的。所有经过此渠道的信息均会被敌对方Eve看到。为了防止密钥泄露,Diffie与Hellman提出以下密钥交换协议:

  1. Alice和Bob先对p和g达成一致,而且公开出来。Eve也就知道它们的值了。
  2. Alice取一个私密的整数a,不让任何人知道,发给Bob 计算结果:A=g a mod p. Eve 也看到了A的值。
  3. 类似,Bob 取一私密的整数b,发给Alice计算结果B=g b mod p.同样Eve也会看见传递的B是什么。
  4. Alice 计算出K=B a mod p=(g b ) a mod p=g ab mod p.
  5. Bob 也能计算出K=A b mod p=(g a ) b mod p=g ab mod p.
  6. Alice 和 Bob 现在就拥有了一个共用的密钥K.
  7. 虽然Eve看见了p,g, A and B, 但是鉴于计算离散对数的困难性,他无法知道a和b 的具体值,所以Eve就无从知晓密钥K是什么了。

2. cpp实现

#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
// 判断输入的p是否是质数
bool isPrime(int p)
  if (p <= 1)
    return false;
  for (int i=2; i<=std::sqrt(p); i++)
    if (p % i == 0)
      return false;
  return true;
void inputPrime(int &p)
    // 判断是否是质数得标志
  bool is_prime = false;
  while (!is_prime)
    // C++对大整数的运算不太友好,稍微大一点的质数在求本原元的时候一乘方就溢出,现在只能用小的质数做密钥交换实验
    std::cout << "Please input a prime(3~17)." << std::endl;
    std::cin >> p;
    is_prime = isPrime(p);
    if(is_prime)
      std::cout << p << " is a prime." << std::endl;
      std::cout << "Is your math taught by your P.E. teacher. " << p << " is not a prime." << std::endl;
  std::cout << "**************************************************" << std::endl;
// 求质数p的最大本原元
int getMaxGenerator(int p)
  // 最大本原元
  int g;
  // 指数
  int d;
  // 对于使g^d % p = 1成立的最小正整数d,如果d=φ(p)=p-1,则g为p的本原元  
  for (g=p-1; g>2; g--)
    for (d=1; d<p; d++)
      // C++对大整数的运算不太友好,稍微大一点的质数在求本原元的时候一乘方就溢出,现在只能用小的质数做密钥交换实验
      if ((unsigned long long)(std::pow(g, d)) % p == 1)
       break; 
    if (d == p - 1)
      return g;
// 生成[1, p-2]集合内的随机整数
int getRandom(int p)
  // 时间作为随机数种子
  srand(unsigned(time(0)));
  // 睡会儿,防止alice与bob的时间随机数种子相同
  sleep(1);
  // 生成[a, b]的随机整数公式 (rand() % (b-a+1)) + a
  return (rand() % (p-2 - 1 + 1)) + 1;
// 用质数、最大本原元以及随机数计算一个数, g^random_number % p
int getCalculation(int p, int g, int random_number)
  return (unsigned long long)(std::pow(g, random_number)) % p;
// 计算密钥. calculation_number^random_number % p
int getKey(int p, int random_number, int calculation_number)
  return (unsigned long long)(std::pow(calculation_number, random_number)) % p;
int main(int argc, char** argv)
  // 大质数、大质数本原元, alice产生的随机数,bob产生的随机数,alice计算的数,bob计算的数,alice计算的密钥,bob计算的密钥
  int p, g, alice_random, bob_random, alice_calculation, bob_calculation, alice_key, bob_key;
  inputPrime(p);
  std::cout << "getMaxGenerator g" << std::endl;
  g = getMaxGenerator(p);
  std::cout << "g = " << g << std::endl;
  std::cout << "**************************************************" << std::endl;
  std::cout << "Alice Bob get random" << std::endl;
  alice_random = getRandom(p);
  bob_random = getRandom(p);
  std::cout << "alice_random = " << alice_random << std::endl << "bob_random = " << bob_random << std::endl;
  std::cout << "**************************************************" << std::endl;
  std::cout << "Alice Bob get calculation" << std::endl;
  alice_calculation = getCalculation(p, g, alice_random);
  bob_calculation = getCalculation(p, g, bob_random);
  std::cout << "alice_calculation = " << alice_calculation << std::endl << "bob_calculation = " << bob_calculation << std::endl;
  std::cout << "**************************************************" << std::endl;
  std::cout << "Alice Bob get key" << std::endl;
  alice_key = getKey(p, alice_random, bob_calculation);
  bob_key = getKey(p, bob_random, alice_calculation);
  std::cout << "alice_key = " << alice_key << std::endl << "bob_key = " << bob_key << std::endl;
  std::cout << "**************************************************" << std::endl;
  std::cout << "Key exchange done!" << std::endl;
  return 0;

3. 程序运行结果

参考文章:
本原元
欧拉定理

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密钥交换方法和步骤 VC++环境下,编程实现Diffie-Hellman密钥交换方法和步骤 一、 采用Diffie-Hellman密钥交换方法,编程实现两个用户的密钥交换 按照步骤,先指定一个本原根,然后分别求密钥
1、Diffie-Hellman算法简介 Diffie-Hellman算法(以下简称为:DH算法),是最早的密钥交换算法之一,它使得通信的双方能在非安全的信道中安全的交换密钥,用于加密后续的通信消息。 起基本流程原理如下: 假定小明和小红期望在一个不安全的网络中协商一个共同的密钥,那么进行如下步骤: 两人先说好大素数(质数)p和它的原始根g。 小明随机产生一个数a,并计算A = p^a mod g, 发送给小红。 小红随机产生一个数b,并计算......
Diffie-Hellman 密钥交换算法是一种用于在不安全的信道上交换密钥的方法。它的基本原理是: 甲、乙两方分别选择一个大素数 $p$ 和一个原根 $g$,公开这两个数。 甲方选择一个私有整数 $a$,乙方选择一个私有整数 $b$。 甲方计算 $A=g^a \bmod p$ 并发送给乙方,乙方计算 $B=g^b \bmod p$ 并发送给甲方。 甲方计算 $s=B^a \bmod p$...
Diffie-Hellman(简称DH)是密钥交换算法之一,它的作用是保证通信双方在非安全的信道中安全地交换密钥。目前DH最重要的应用场景之一,就是在HTTPS的握手阶段,客户端、服务端利用DH算法交换对称密钥。 下面会先简单介绍DH的数理基础,然后举例说明如何在nodejs中使用DH相关的API。下面话不多说了,来一起看看详细的介绍吧。 要理解DH算法,需要掌握一定的数论基础。感兴趣的可以进一步研究推导过程,或者直接记住下面结论,然后进入下一节。 假设 Y = a^X mod p,已知X的情况下,很容易算出Y;已知道Y的情况下,很难算出X; (a^Xa mod p 原根与指标是解高次同余式的基础。在密码学中的Diffe-Hellman密钥交换协议、ElGamal公钥密码体制,以及其他许多密码协议和数字签名方案中都会用到原根及其性质。 实验内容与要求 求模n=43的最小原根,并建立其关于模43的指标表,将指标表写入g.txt中。
Diffie-Hellman密钥交换是一种公开密钥加密算法,用于在不安全的通信渠道上交换密钥。它是由惠特菲尔德·迪菲和马丁·赫尔曼·赫尔曼于1976年共同发明的。 Diffie-Hellman密钥交换算法基于离散对数问题,假设存在一个质数p和一个整数g,使得g是模p的原根。通信双方Alice和Bob分别选择一个私有密钥a和b,然后计算出公开的值A和B。然后,Alice和Bob分别使用对方的公开值和自己的私有密钥计算出一个共享的密钥K。这个共享的密钥K可以用于对后续通信进行加密。 Diffie-Hellman密钥交换算法的优点是,它使用了公开密钥和私有密钥,避免了传统的密钥交换算法中需要通过一个安全的渠道交换密钥的问题。同时,它也避免了使用相同的密钥对所有通信进行加密的问题。