图解RSA非对称加密


非对称加密简介

非对称加密时目前加密的主流方式之一。因为其保密性备受大家重用。无论是在java、php、go、python等语言中,为了大家方便,或官方自带、或轮子哥补全,都会有使用非对称加密的模块。
得益于各个官方以及轮子哥的帮忙,大家使用费对称加密可以只需要两步就可以完成,第一步、自动生成一个“公钥”,一个匹配的“私钥”。第二部、传输数据,并进行加解密。
表象
但是非对称加密具体如何实现的呢?
步骤如下:
1、非对称加密在运行需要暴露私钥与数据。
如下图:

用户获得公钥与密文之后,使用公钥对密文进行解密。即可获得原始数据。
2、非对称加密中,使用密钥进行加密和解密。
如下图:

用户无论是在解密密文的时候还是在加密数据的时候,使用的都是公钥。奇妙的地方在于用户的“公钥”与服务器的“私钥”时不同的。

在公钥与私钥不相同的时候,也不需要在传输的时候传输密钥。这样就没有办法被窃取服务器的“私钥”。

并且,使用公钥时无法解密公钥加密过的数据的。

公钥加密的密文,只能被私钥解密。
作用:所有拥有公钥的“人”都能读取服务器发送的信息,但是客户端发送的信息只有服务器能解读。

算法

在以上传输过程中可以看见,在网络上存在的数据只有两类---公钥与密文。

如果事先约定好公钥,那么密钥和公钥在加解密的时候其实可以完全不暴露。可以做到在互联网上只存在密文。
具体实现有以下几个步骤:
1、寻找质数(一般为大质数,这里为了方便理解采用小质数)

P = 3  
Q = 11

2、计算公共模
N = P * Q = 3 * 11 = 33
3、计算欧拉值(RSA的核心算法)
φ(N) = (P-1)(Q-1) = 2 * 10 = 20
4、确定公钥的取值范围
1 < E < φ(N)
由于E与φ(N)必须互为质数。所以E可以取值3、7、9、11、13、17、19
为了方便
E=3

5、确定私钥值
```
E * D % φ(N) = 1
求得私钥D=7

6、确定公钥值
C = ME mod N
M随意取值(默认为大数,这里为了方便,取值2)
注意这里ME不是M*E而是直接组成数字。
推导出公钥C=8
在开始加解密之前。我们先确定我们手头拥有的数据有哪些:

1、公钥C=8。
2、私钥D=7.
3、公共模数N=33

无需用到到的数
两个质数 3、11

加解密流程一:
公钥加密流程
加密字符串2

2^C%N=密文 => 2^8%33=8

私钥解密
从网络拿到密文8
8^D%N=明文 => 8^7%33=2