浅谈 RSA 算法

226 阅读3分钟

1.非对称加密算法

非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。        ——————百度百科

假设A向B通过非对称加密算法进行信息交换,流程如下:

    ①B生成一定密钥并将公钥公开,A获取B的公钥

    ②A使用该公钥对信息进行加密后再发送给B

    ③B收到A发送过来的加密信息后,再用自己的私钥对信息解密

2.RSA算法

RSA算法就是非对称加密算法。RSA算法实现分为4个部分:生成密钥、加密、解密和签名。

2.1生成密钥

①生成两个不相等的质数 p 和 q(p和q不应太过相近)。假设 p=13,q=19。

②计算出 p 和 q 的乘积为 n。此处 n=247。

③计算 n 的欧拉函数 φ(n)。φ(247)=216。

2300433-20210728172713824-331514529.png

④选择一个整数 e,使 1<e<φ(n),并且与 φ(n) 互质。此处 e=31。

⑤找出一个整数 d,使得 e×d÷φ(n)......1,余数等于 1。可知 d 为 7。

    d=7 为 e=31 关于 φ(n)=216 的模逆元。

⑦得到私钥和公钥

2300433-20210728172756121-1234662406.png

2.2 加密

A获取B的公钥后对信息进行加密。

①将明文转换为 Unicode 编码。

2300433-20210728172858681-1328776667.png

②利用加密公式加密为密文。加密公式如下所示:

c=E(m)=me mod nc = E(m) = m^e \ mod \ n

  m 为 Unicode编码 转换为十进制,其中 e=31,n=247。

以 Unicode 编码为 6F 的字符加密为例,其转换过程如下:

  • 首先将 6F 转换为十进制数:6161+15160=1116 * 16^1 + 15 * 16^0 = 111
  • 代入加密公式:11131  mod  247=214111^{31}\ \ mod \ \ 247=214
  • 转换为十六进制为 D6

上图的 Unicode 编码经过加密后如下图所示:

2300433-20210728173034002-1281658958.png

2.3 解密

① 利用解密方程对密文进行解密。解密方程如下所示:

m=D(c)=cd mod nm = D(c)=c^d \ mod \ n

  c 为 Unicode 编码转换为十进制,其中 d=7,n=247。

以 Unicode 编码为 D6 的字符解密为例,其转换过程如下:

  • 将 D6 转换为十进制数:13161+6160=21413 * 16^1 + 6 * 16^0=214
  • 代入解密公式:2147  mod  247=111214^7 \ \ mod \ \ 247=111
  • 转换为十六进制为 6F

经过解密后如下图所示:

2300433-20210728173128713-1716420412.png

2.4 签名

假设 A 给 B 发送数据,则过程如下:

    ①A 先用 B 的公钥对原始数据进行加密

    ②计算加密数据的哈希值

    ③用 A 的私钥将这串哈希值加密,这就是数字签名

    ④将签名放在加密的数据后面并发给 B

B 接收到 A 发来的加密数据后,处理过程如下所示:

    ①利用 B 的私钥将密文解密得到明文

    ②利用 A 的公钥将数字签名解密,得到哈希值

    ③将哈希值与收到的加密数据的哈希值进行比较,就可以判断信息来自 A