公钥密码算法,常见的有RSA、DH。
首先需要了解一个概念:单向函数
在知道 a、g、p 的情况下,可以计算出 A;
但是在知道 A、g、p(
很大的一个质数
) 的情况下,却不能计算出 a
。这就是单向函数,这个函数也叫做“
离散对数函数
”。
一般来说,大数分解问题被认为是比离散对数问题更困难的问题。
需要注意:DH的公钥私钥和RSA公钥私钥是有区别的。
DH算法涉及6个数字:
p 代表 prime 质数,
一个大的质数,
建议长度在1024比特以上;
g 代表 generator 发生器,g为p的原根,
g^(p-1) = 1 (mod p)
,求原根g目前的做法是从2开始枚举,直至找到一个满足条件的g。
原根一般都不大,所以可以暴力得到,比如p为97,因为2^(97-1) % 97 =1 所以g就是2,g这个值常见的就是2,5。
a 代表 Alice 的私钥,
一个随机数
;
b 代表 Bob 的私钥,
一个随机数
;
A 代表 Alice 产生的
公钥 A = g^a % p
,需要和 Bob 共享,即传递给 Bob;
B 代表 Bob 产生的
公钥 B = g^b % p
,需要和 Alice 共享,即传递给 Alice;
即使中间人即第三者截获了 Alice 和 Bob 的公钥 A 和 B,也无法计算出各自的私钥 a 和 b。
Alice 和 Bob 要协商出来的
对称秘钥
是 K
证明两个人算出的K相同:
计算第一个表达式:
计算第二个表达式:
最终得到:
这个 K 就是Alice和Bob之间⽤的
对称加密密钥
,可以作为会话密钥使⽤。
举个例子:
p为一个随机大质数:
97
g为p的原根,满足g^(p-1) = 1 (mod p),从2开始枚举,直至找到一个满足条件的g,所以g为:
2
a为Alice 的私钥,一个随机数:
23
b为Bob 的私钥,一个随机数:
81
A 代表 Alice 产生的公钥 A = g^a % p,所以计算得到A:
48
B 代表 Bob 产生的公钥 B = g^b % p,所以计算得到B:
70
经过网络明文传输后
Alice 知道的数为:p、g、a、A、B,并计算K的值为:K=B^a mod p =
18
Bob 知道的数为:p、g、b、A、B,并计算K的值为:K=A^b mod p =
18
参考: