# RSA算法公钥、私钥及数字签名加密流程分步解析

By [JiugeCoin](https://paragraph.com/@jiuge) · 2022-01-24

---

文/九歌

1977年，三位数学家Rivest、Shamir 和 Adleman提出了一种新的**非对称加密算法**，并以他们自己的名字命名，即为RSA加密算法。RSA算法知识涉及了数论、欧拉函数等高等数学知识，如果没有高等数学基础，建议不要深究下去。本文重点介绍如何使用Python实现密钥对的生成以及数字签名流程，从而实现网络信息的加密和解密。

![RSA算法发明者：Rivest、Shamir 和 Adleman](https://storage.googleapis.com/papyrus_images/75f3bfb9eb8943ab21cfe7f7f18f81a696f6ae50e1e5f364cd7bc902625e23a3.jpg)

RSA算法发明者：Rivest、Shamir 和 Adleman

RSA算法可以总结为四句话：**公钥加密、私钥解密、私钥签名、公钥验签**。加密是防止信息泄露，而签名是为了防止信息被篡改。

比如，小九同学想通过互联网给小蓝同学发送一段文字“一切安好”，为了不让其他人在网上获取这段文字，小九同学选择使用RSA算法加密，使用在线RSA工具模拟步骤如下：

**一**

小九和小蓝同学提前使用RSA算法，分别生成自己的一对密钥对（公钥和密钥）。公钥用来加密，私钥用来解密和数字签名；公钥提前告诉对方，私钥不告诉任何人。公钥和私钥其实就是两个字符串。

（1）小九同学生成的密钥对：

![](https://storage.googleapis.com/papyrus_images/79a38248c71108867579abc69a10e7d91ef09fa55c578475a86325b8eec4dddd.png)

（2）小蓝同学生成的密钥对

![](https://storage.googleapis.com/papyrus_images/3dad054eae491a0bb13daaf00711a4645b710c8b8d3e1cea40a86bba56a35811.png)

**二**

小九想给小蓝发送信息“一切安好”，就需要使用小蓝的公钥对“一切安好”这四个汉字进行加密，加密后获得加密文本字符串。这样可以保证，只有小蓝的私钥能解开加密后的文本。

![](https://storage.googleapis.com/papyrus_images/ab37cfbdc5e0c4cde3ca37d0cdd78ca5cae31dd854ced53934d7b7efa84d1938.png)

**三**

为了确保小蓝收到的就是小九本人发送的内容，不是别人伪造的，小九使用自己的私钥和发送内容中的一部分文本，生成数字签名，一同发送给小蓝同学。

我们这里使用“一切安好”四个汉字的后两个汉字“安好”作为签名文本，并提前跟小蓝约定发送信息的最后两个汉字是签名文本。现实世界，双方使用的是数字证书和相同的哈希函数，这里仅作了解。

![](https://storage.googleapis.com/papyrus_images/198bee495cddc9a8d55bf07bffbaec9ef879d3ab38dc35f66142f30142686a78.png)

**四**

小蓝收到小九发送的加密密文和签名字符串后，首先用自己的私钥对密文进行解密。

![](https://storage.googleapis.com/papyrus_images/dd823ce5ce3d2c3cf2b00204ad6410a7d5c8c063e18296423f757ca1af55ef75.png)

**五**

小蓝同学为了验证该内容是不是小九本人发送，使用小九的公钥对小九的数字签名内容进行确认。

![](https://storage.googleapis.com/papyrus_images/d2cc666c1d305d17b3adf3ae8fcc45df3ba33c05e259761752ceb631423f3707.png)

**六**   

如果数字签名验证准确，则小九通过RSA算法，将“一切安好”四个汉字发送给了小蓝同学。

![](https://storage.googleapis.com/papyrus_images/a52f013912cf00d3a906395deebf42bd98987bc66e855a38378608d76a89c7bc.png)

本文属于边学边整理，如果内容不准确或者理解有误，欢迎留言指正。我的推特：JiugeCoin

---

*Originally published on [JiugeCoin](https://paragraph.com/@jiuge/rsa)*
