天天看点

RSA与 Diffie-Hellman密钥交换 的区别前言RSADiffie-Hellman密钥交换总结

前言

最近查看

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次乘法,然后将其结果除以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

<E < L
gcd(E,L)= E和L的最大公约数为(E和L互质)
           

4、求D

<D<L
E * D mod L = 要保证这个式子成立,就要保证EmodL=成立。也就是步骤
           

这样就求出了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