【寒江雪】DIFFIE-HELLMAN密钥分配机制

来源:互联网 发布:中央电视台网络电视 编辑:程序博客网 时间:2024/06/05 04:17

前言

  Diffie-Helman为公开的密钥算法,发明于1976年.该算法不能用于加密或解密,而是用于密钥的传输与分配.
  DH算法安全性体现在:在有限域上计算离散对数非常困难.
&esmsp; 离散对数:定义素数p的本原根为这样一个数,它能生成1~p-1所有数的一个数.现设g为p的本原根,则


g modp, g2mod p, … , gp-1 mod p

是两两互不相同的并且包含1到p-1的整数的某种排列。对于任意数b及素数p的本原根g,可以找到一个唯一的指数i,满足

b=gimod p,0<=i<=p-1

则称指数i为以g为底模p的离散对数

DIFFIE-HELLMAN算法描述

  在这一机制中,通信双方不需要第三方的介入来完成密钥的交换.
  通信双方协商两个可公开的数字g,p
  p:是一个素数
  g:g<p,且g是p的一个本原根
  随后通信双方各自产生一个秘密的数字,X,Y
  利用各自产生的数字计算可以公开的密钥A,B.其中A=gXmod p;B=gYmod p;
  随后,通信双方可以通过对方的公开密钥来计算出通信用的密钥.该密钥为通信双方共享.
  计算密钥的原理:


Key=BXmod p=(gYmod p)Xmod p=gYXmod p=gXYmod p=(gXmod p)Ymod p=AYmod p=Key*
  易证Key=Key*

DIFFIE-HELLMAN的缺点

  • 在没有数字签名的情况下,DIFFIE-HELLMAN容易受到中间人攻击
  • 图示如下:
    图片描述

    [来自百度对本原根的描述:如果g是素数p的本原根,则数g modp, g2mod p, … , gp-1 mod p 是不同的并且包含1到p-1的整数的某种排列。]

利用代码演示其中一种场景

#include<iostream>#include<cmath>using namespace std;int g, p;class People {private:    int secret_num;    int public_key;public:    People(int A,int gg,int pp) :secret_num(A) {        public_key = (int)pow(gg, A) % pp;    }    int getPublicKey() {        return public_key;    }    int getKey(int other,int pp) {        return (int)pow(other, secret_num) % pp;    }};int main() {    g = 6;    p = 17;    People Alice(5, g, p);    People Bob(3, g, p);    //现在,Alice 想要发送'A'给Bob    //首先,Alice 使用Bob的公钥计算密钥    int key = Alice.getKey(Bob.getPublicKey(), p);    cout << "Alice计算出来的密钥:" << key << endl;    //接着,Alice 使用密钥对'A'进行加密,得到密文C    char C = 'A' ^ (char)key;    cout << "密文C:" << (int)C << endl;    //现在,Bob 得到了密文C    //Bob首先通过Alice的公钥计算出密钥    int key_bob = Bob.getKey(Alice.getPublicKey(), p);    cout << "Bob计算出来的密钥:" << key << endl;    //接着,Bob 使用密钥对C进行解密,得到明文P    char P = C^(char)key_bob;    cout << "Bob计算出来的明文P:" << P << endl;    return 0;}




Copyright© by 寒江雪
Date:2016.12.09

0 0
原创粉丝点击