上篇说到了RSA公钥加密算法,这里看一下D-H密钥交换。
首先我们看一下数学上的概念:
本原根:我们定义素数p的本原根为其乘方能够产生从1到p - 1的所有整数的数
比如:若a是素数p的本原根,那么下列数字:
a mod p, a^2 mod p ,…… ,a^(p - 1) mod p
是互不相同的数字, 并且以某种排列包含了从1~p - 1的所有整数。也就是说,对于任何小于 p 的整数 b 和 素数 p 的本原根来说,都有唯一一个指数i满足:
b = a^i mod p 其中0 <= i <= (p - 1)
好了,更加深入的数学自行学习,我们和学习RSA一样,先来开一下D-H密钥交换中使用的几个值:
-
XA :用户A选择的一个小于q随机整数(用户A私有) -
XB :用户B选择的一个小于q随机整数(用户B私有) -
YA :用户A计算出来的供对方使用的公有值 -
YB :用户B计算出来的供对方使用的公有值
在这个方案中,素数q和q的本原根整数α 是两个众所周知的数字,密钥的生成过程如下:
假设有两个用户A和B,首先A选择一个随机的并且小于q的整数
这样有了公有值
===========================
!!!很重要!!!
===========================
根据上述四个公式可以在数学上严密的知道A用户和B用户计算出来的K值是相同的(数学公式自行推导),与此同时,在网络传输的过程中并没有K值的泄露,在网络上进行传输的只有素数q和q的本原根整数α以及相互交换的