DH秘钥交换算法

图片说明,清晰明了

preview

上图很经典
它的数学基础就是离散对数这个数学难题。用它进行密钥交换的过程简述如下:

选取两个大数p和g并公开,其中p是一个素数,g是p的一个模p本原单位根(primitive root module p),所谓本原单位根就是指在模p乘法运算下,g的1次方,2次方……(p-1)次方这p-1个数互不相同,并且取遍1到p-1;

对于Alice(其中的一个通信者),随机产生一个整数a,a对外保密,计算Ka = g^a mod p,将Ka发送给Bob;
对于Bob(另一个通信者),随机产生一个整数b,b对外保密,计算Kb = g^b mod p,将Kb发送给Alice;

在Alice方面,收到Bob送来的Kb后,计算出密钥为:key = Kb^a mod p = g^(b*a) mod p mod p;
对于Bob,收到Alice送来的Ka后,计算出密钥为:key = Ka ^ b mod p = g^(a*b) mod p mod p。

攻击者知道p和g,并且截获了Ka和Kb,但是当它们都是非常大的数的时候,依靠这四个数来计算a和b非常困难,这就是离散对数数学难题。
 

(1)Alice与Bob确定两个大素数n和g,这两个数不用保密

(2)Alice选择另一个大随机数x,并计算A如下:A=gxmod n

(3)Alice将A发给Bob

(4)Bob  选择另一个大随机数y,并计算B如下:B=gymod n

(5)Bob将B发给Alice

(6)计算秘密密钥K1如下:K1=Bxmod n

(7)计算秘密密钥K2如下:K2=Aymod n

 K1=K2,因此Alice和Bob可以用其进行加解密

 

二、实践化的表达方式

1、Server Key Exchange消息

server端:用DH算法产生整数p,g,pubkey(即A=ga mod p),将这三个参数放到Server Key Exchange消息中。为了防止消息被恶意篡改,Server Key exchange消息中还要包含一个对公钥参数的签名signature。

Client端:收到此消息后,会把消息中的 p,g,pubkey(即A=ga mod p) 三个参数记录下来,有了这些,可以依据pubkey(即A=ga mod p)和 private(即b)计算出 pre-master。

2、Client Key Exchange消息

Client端:把产生的pubkey(即B=gb mod p) 放入Client Key Exchange消息中发给 server 。

server端:收到此消息后,会把消息中的pubkey(即B=gb mod p) 记录下来,可以依据pubkey(即B=gb mod p)和 private(即a)计算出 pre-master。

三、图形化表达方式

1、DH 概述

摘自https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange

Diffie–Hellman key exchange is a specific method of securely exchanging cryptographic keys over a public channel and was one of the first public-key protocols as originally conceptualized by Ralph Merkle and named after Whitfield Diffie and Martin Hellman. D–H is one of the earliest practical examples of public key exchange implemented within the field of cryptography. Traditionally, secure encrypted communication between two parties required that they first exchange keys by some secure physical channel, such as paper key lists transported by a trusted courier. The Diffie–Hellman key exchange method allows two parties that have no prior knowledge of each other to jointly establish a shared secret key over an insecure channel. This key can then be used to encrypt subsequent communications using a symmetric key cipher.
  • 它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。

2、算法实现

如下图所示 
这里写图片描述 
假如用户A和用户B希望交换一个密钥。

取素数p和整数a,a是p的一个原根,公开a和p。

A选择随机数XA<p,并计算YA=a^XA mod p。

B选择随机数XB<p,并计算YB=a^XB mod p。

每一方都将X保密而将Y公开让另一方得到。

A计算密钥的方式是:K=(YB) ^XA modp

B计算密钥的方式是:K=(YA) ^XB modp

证明:

  (YB)^ XA mod p = (a^XB modp)^ XA mod p

 = (a^XB)^ XA mod p = (a^XA) ^XB mod p    
 (<-- 密钥即为 a^(XA*XB) mod p)

 =(a^XA modp)^ XB mod p= (YA) ^XB mod p
  • 由于XA和XB是保密的,而第三方只有p、a、YB、YA可以利用,只有通过取离散对数来确定密钥,但对于大的素数p,计算离散对数是十分困难的。 

下面我们以Alice和Bob为例叙述Diffie-Hellman密钥交换的原理。

1,Diffie-Hellman交换过程中涉及到的所有参与者定义一个组,在这个组中定义一个大质数p,底数g。
2,Diffie-Hellman密钥交换是一个两部分的过程,Alice和Bob都需要一个私有的数字a,b。 
  •  

这里写图片描述 
下面我们进行一个实例

1.爱丽丝与鲍伯协定使用p=23以及g=5.

2.爱丽丝选择一个秘密整数a=6, 计算A = g^a mod p并发送给鲍伯。
   A = 5^6 mod 23 = 8.

3.鲍伯选择一个秘密整数b=15, 计算B = g^b mod p并发送给爱丽丝。
   B = 5^15 mod 23 = 19.

4.爱丽丝计算s = B a mod p
  19^6 mod 23 = 2.

5.鲍伯计算s = A b mod p
   8^15 mod 23 = 2. 
  •  

对方的公钥和自己的私钥计算的到秘密整数,双方对比之后,验证正确性。

3、用途

  1. 可以用作对称加密算法中,双方约定的加密准则的交换(对方的公钥和自己的私钥计算的到秘密整数,可以作为双方的加密准则)。交换双方可以在不共享任何秘密的情况下协商出一个密钥。

转自: https://blog.csdn.net/xy010902100449/article/details/52089508

 

展开阅读全文

没有更多推荐了,返回首页