前言

最近查看jsch源码时,在理解DH密钥交换算法时,与RSA傻傻的分不清。

当时看源码犯了迷糊:既然已经有更先进的RSA,为什么还要使用DH密钥交换算法。

之后,看了一位日本人写的《图解密码技术》这本书时,才有所顿悟。

这里我做个笔记;

因为是笔记,所以估计只有我能看懂!哈哈

RSA

看到这个RSA,我第一时间想到的就是,经常在gitlabgithub或者码云上使用到的公钥私钥啦!

我以前只是知道id_rsaid_rsa.pub是利用这种算法生成的,具体的原理,并不清楚。

在这里,我不会去讲解什么原理,因为我觉得《图解密码技术》这本书,已经讲的很好了,我再讲会误导人。
RSA在那本书的第五章节)

id_rsa.pub是公钥里面到底存的是什么信息呢?私钥id_rsa存的又是什么?

看完那本书后,才知道,公钥id_rsa.pub里面其实主要存的就是两个数字E 和 N
当然书中并没有这样的话语,书中提到只有RSA加密和解密。
而私钥id_rsa里面存的是数字D 和 N

说明:

EEncryption(加密)的首字母,N是数字(Number)的首字母
D是解密(Decryption)的首字母。

而公钥和私钥具体有什么作用呢?

在此之前,我脑海的想法就是:

把代码放到GitHub上,所以我要把公钥放到它那里,这样就能上传代码啦!
所以觉得公钥和私钥 是认证功能。就类似于登录密码;只不过有了这个就不需要输入密码。

上面是我以前(没有看这本书之前)的理解。

其实上面理解只理解对了一部分,我先说下ssh公钥登录的流程。

1、客户端生成RSA公钥和私钥

2、客户端将自己的公钥存放到服务器

3、客户端请求连接服务器,服务器将一个随机字符串发送给客户端

4、客户端根据自己的私钥加密这个随机字符串之后再发送给服务器

5、服务器接受到加密后的字符串之后用公钥解密,如果正确就让客户端登录,否则拒绝。这样就不用使用密码了。

可以看出,公钥和私钥,最主要的作用其实是加密和解密!

RSA加密的原理是啥呢?

密文 = 明文E mod N

上面的意思就是:将明文和自己做E次乘法,然后将其结果除以N,求余数。这个余数就是密文。

解密原理:

明文 = 密文D mod N

上面的意思就是:将密文和自己做D次乘法,再对其结果除以N求余数,就可以得到明文。

所以我们平时用到的id_rsaid_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的最大公约数为1E和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密钥协商则是利用生成元来得到共享密钥

参考地址:

https://www.cnblogs.com/scofi/p/6617394.html

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐