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

前言

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


g modp, g 2mod p, … , g p-1 mod p

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

b=g imod p,0<=i<=p-1

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

DIFFIE-HELLMAN算法描述

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


Key=B Xmod p=(g Ymod p) Xmod p=g YXmod p=g XYmod p=(g Xmod p) Ymod p=A Ymod p=Key *
  易证Key=Key *

DIFFIE-HELLMAN的缺点

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


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

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

#include
#include
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

你可能感兴趣的:(密码编码学与网络安全小记)