基于Diffie-Hellman协议的安全密钥交换的实现

Author Avatar
Euan 9月 05, 2019
  • 在其它设备中阅读本文章

基于Diffie-Hellman协议的安全密钥交换的实现

实验目的

通过模拟两个客户之间的加密会话过程,理解安全密钥交换的重要性,理解基于Diffie-Hellman协议的安全密钥交换的原理和流程。

实验原理

用Diffie-Hellman协议进行密钥交换的过程简述如下:

选取两个大数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=g^(b*a) mod p;

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

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

要实现Diffie-Hellman密钥交换协议,需要能够快速计算大数模幂,在模幂算法中,仍需计算大数的乘法和模运算,所以整个过程需要三个算法:高精度乘法,高精度除法(用来同时求出一个大数除以另一个大数的商和余数),快速模幂算法。

高精度的乘法和除法可以程序模拟手算。快速模幂算法也是从手算中总结出规律来,例如:

5^8 = (5^2)^4 = (25)^4 = (25^2)^2 = (625)^2,这样,原来计算5^8需要做8次乘法,而现在则只需要三次乘法,分别是:5^2, 25^2, 625^2。这就是快速模幂算法的基础。将算法描述出来,那就是:

算法M:输入整数a,b,p,计算a^b mod p:

M1.初始化c = 1

M2.如果b为0,则c就是所要计算的结果。返回c的值。算法结束。

M3.如果b为奇数,则令c = c a mod p,令b = b - 1,转到M2。

M4.如果b为偶数,则令a = a a mod p,令b = b / 2,转到M2。

实验环境

Windows Server 2012 R2

实验工具在【C:\密码学课程\04密码学应用\01-基于Diffie-Hellman协议的安全密钥交换的实现】

实验步骤

1.打开实验环境,在单机上执行实验程序,双击打开需要运行的程序.如图1所示

KqHysU.png

图1

2.弹出界面如图,分别为客户A和客户B。如图2所示

KqHsMT.png

图2

3.在客户端A输入密码,如123456,生成公钥。如图3所示

KqHDzV.png

图3

4.客户端A点击计算并发送X。如图4所示

KqHBR0.png

图4

5.在客户端B点击计算并发送出Y,则B利用A的公钥和X计算并发送出Y。如图5所示

KqH0Gq.png

图5

6.客户端A获取到Y之后,在两个客户端都可以生成相同的会话密钥。如图6所示

生成密钥

KqH6LF.png

图6

7.在客户端A输入要发送的内容。如图7所示

ji加密发送

KqHgZ4.png

图7

8.点击加密,发送。B即可收到密文。如图8所示

KqH2dJ.png

图8

9.客户端B点击解密,得到明文。如图9所示

KqHRo9.png

图9

实验思考

1.简述安全密钥交换的重要性

保证个人信息安全;

使用信任度证书分发服务器获取公钥,能有效防止了中间人攻击。

2.简述基于Diffie-Hellman协议的安全密钥交换的原理和流程

原理:

  1. 有两个全局公开的参数,一个素数q和一个整数a,a是q的一个原根.
  2. 假设用户A和B希望交换一个密钥,用户A选择一个作为私有密钥的随机数XA(XA<q),并计算公开密钥YA=a^XA mod q。A对XA的值保密存放而使YA能被B公开获得。类似地,用户B选择一个私有的随机数XB<q,并计算公开密钥YB=a^XB mod q。B对XB的值保密存放而使YB能被A公开获得.
  3. 用户A产生共享秘密密钥的计算方式是K = (YB)^XA mod q.同样,用户B产生共享秘密密钥的计算是K = (YA)^XB mod q.这两个计算产生相同的结果: K = (YB)^XA mod q = (a^XB mod q)^XA mod q = (a^XB)^XA mod q (根据取模运算规则得到) = a^(XBXA) mod q = (a^XA)^XB mod q = (a^XA mod q)^XB mod q = (YA)^XB mod q 因此相当于双方已经交换了一个相同的秘密密钥.
  4. 因为XA和XB是保密的,一个敌对方可以利用的参数只有q,a,YA和YB.因而敌对方被迫取离散对数来确定密钥.例如,要获取用户B的秘密密钥,敌对方必须先计算 XB = inda,q(YB) 然后再使用用户B采用的同样方法计算其秘密密钥K. Diffie-Hellman密钥交换算法的安全性依赖于这样一个事实:虽然计算以一个素数为模的指数相对容易,但计算离散对数却很困难.对于大的素数,计算出离散对数几乎是不可能的. 下面给出例子.密钥交换基于素数q = 97和97的一个原根a = 5.A和B分别选择私有密钥XA = 36和XB = 58.每人计算其公开密钥 YA = 5^36 = 50 mod 97 YB = 5^58 = 44 mod 97 在他们相互获取了公开密钥之后,各自通过计算得到双方共享的秘密密钥如下: K = (YB)^XA mod 97 = 44^36 = 75 mod 97 K = (YA)^XB mod 97 = 50^58 = 75 mod 97 从|50,44|出发,攻击者要计算出75很不容易.

流程:

假设用户A希望与用户B建立一个连接,并用一个共享的秘密密钥加密在该连接上传输的报文.用户A产生一个一次性的私有密钥XA,并计算出公开密钥YA并将其发送给用户B.用户B产生一个私有密钥XB,计算出公开密钥YB并将它发送给用户A作为响应.必要的公开数值q和a都需要提前知道.另一种方法是用户A选择q和a的值,并将这些数值包含在第一个报文中. 下面再举一个使用Diffie-Hellman算法的例子.假设有一组用户(例如一个局域网上的所有用户),每个人都产生一个长期的私有密钥XA,并计算一个公开密钥YA.这些公开密钥数值,连同全局公开数值q和a都存储在某个中央目录中.在任何时刻,用户B都可以访问用户A 的公开数值,计算一个秘密密钥,并使用这个密钥发送一个加密报文给A.如果中央目录是可信任的,那么这种形式的通信就提供了保密性和一定程度的鉴别功能.因为只有A和B可以确定这个密钥,其它用户都无法解读报文(保密性).接收方A知道只有用户B才能使用此密钥生成这个报文(鉴别). Diffie-Hellman算法具有两个吸引力的特征: 仅当需要时才生成密钥,减小了将密钥存储很长一段时间而致使遭受攻击的机会. 除对全局参数的约定外,密钥交换不需要事先存在的基础结构.

本文使用 CC BY-NC-SA 3.0 中国大陆 协议许可
具体请参见 知识共享协议

本文链接:https://zyhang8.github.io/2019/09/05/cipher-exp5/