前言
最近查看jsch
源码时,在理解DH密钥交换
算法时,与RSA
傻傻的分不清。
当时看源码犯了迷糊:既然已经有更先进的RSA
,为什么还要使用DH密钥交换
算法。
之后,看了一位日本人写的《图解密码技术》这本书时,才有所顿悟。
这里我做个笔记;
因为是笔记,所以估计只有我能看懂!哈哈
RSA
看到这个RSA
,我第一时间想到的就是,经常在gitlab
、github
或者码云
上使用到的公钥
和私钥
啦!
我以前只是知道id_rsa
和id_rsa.pub
是利用这种算法生成的,具体的原理,并不清楚。
在这里,我不会去讲解什么原理,因为我觉得《图解密码技术》这本书,已经讲的很好了,我再讲会误导人。
(RSA
在那本书的第五章节)
id_rsa.pub
是公钥里面到底存的是什么信息呢?私钥id_rsa
存的又是什么?
看完那本书后,才知道,公钥id_rsa.pub
里面其实主要存的就是两个数字E 和 N
。
当然书中并没有这样的话语,书中提到只有RSA
加密和解密。
而私钥id_rsa
里面存的是数字D 和 N
。
说明:
E
是Encryption
(加密)的首字母,N
是数字(Number
)的首字母
D
是解密(Decryption
)的首字母。
而公钥和私钥具体有什么作用呢?
在此之前,我脑海的想法就是:
把代码放到GitHub上,所以我要把公钥放到它那里,这样就能上传代码啦!
所以觉得公钥和私钥 是认证功能。就类似于登录密码;只不过有了这个就不需要输入密码。
上面是我以前(没有看这本书之前)的理解。
其实上面理解只理解对了一部分,我先说下ssh公钥登录的流程。
1、客户端生成RSA公钥和私钥
2、客户端将自己的公钥存放到服务器
3、客户端请求连接服务器,服务器将一个随机字符串发送给客户端
4、客户端根据自己的私钥加密这个随机字符串之后再发送给服务器
5、服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。
可以看出,公钥和私钥,最主要的作用其实是加密和解密!
RSA加密的原理是啥呢?
密文 = 明文E mod N
上面的意思就是:将明文和自己做E次乘法,然后将其结果除以N,求余数。这个余数就是密文。
解密原理:
明文 = 密文D mod N
上面的意思就是:将密文和自己做D次乘法,再对其结果除以N求余数,就可以得到明文。
所以我们平时用到的id_rsa
和id_rsa.pub
就是用来加密和解密的!
注意:
细心点,我们打开这两个文件,会发现文件都是一堆很长的字符;
我个人的猜测,应该是对数字E和N,和数字D和N进行了加密!
生成密钥对步骤
1、求N
准备两个很大的质数p和q(目前是512比特大小的数,相当于155位十进制数字。)。
N = p * q.
2、求 L (只出现在,求E和D的过程中)
L是p-1和q-1的最小公倍数
3、求E
1<E < L
gcd(E,L)=1 E和L的最大公约数为1(E和L互质)
4、求D
1<D<L
E * D mod L =1 要保证这个式子成立,就要保证EmodL=1成立。也就是步骤3
这样就求出了E,D,N。
Diffie-Hellman密钥交换
这一块的迷惑是,既然我们已经可以公钥密码算法RSA
来达到我们的目的,为什么还要DH密钥交换
。
个人理解:
类似于答案不止一个这样的解题思路;我们可以使用公钥和私钥来解决密钥配送的问题;
通过DH密钥交换产生的共享密钥也可以解决密钥配送问题;
密钥配送问题:发送方,通过密钥加密明文后,接收方也需要该密钥来对密文进行解密。
RSA的解决思路是:公钥加密,私钥解密。
而DH密钥交换,是双方生成相同的密钥 — 即:共享密钥
。
虽然名字上叫密钥交换
,但实际上,双方并没有真正交换密钥,而是通过计算生成出一个相同的共享密钥。因此,更确切叫法应该是Diffie-Hellman密钥协商
。
步骤:
1、Alice 像 Bob 发送两个质数P和G 。
p是非常大的质数,g是生成元。
2、Alice生成一个随机数A
A是1~p-2
之间的整数。这个数只能Alice知道。
3、Bob生成一个随机数B
B是一个1~p-2
之间的整数。这个是只能Bob知道。
4、Alice将G^A mod P 发送给B
5、Bob将G^B mod P 发送给A
6、Alice用Bob发过来的数计算A次方,并求mod P
G^A*B mod P
7、Bob用Alice发过来的数计算B次方并求mod P
G^A*B mod P
这样就计算出来共享密钥
。
说明:
上面的步骤中,A向B发送的是
G^A mod P
,这个为什么不直接发送G^A,而要mod P呢?
这是因为通过G^A 推算出A来是非常容易的,但是要根据G^A mod P
推算出A则是非常难的。
这个问题称为有限群的离散对数问题。假设未来有快速计算出A的方法,那么这种方法将不可靠。目前是安全的!
总结
可以看出,RSA中的公钥和私钥
与 DH密钥协商
都是用来解决密钥配送
问题的!
RSA
利用 最大公约数(互质)来求出 公钥和私钥。
DH密钥协商
则是利用生成元来得到共享密钥
。
参考地址: