RSA公钥密码

一、RSA简述

RSA是公钥密码的一种代表算法,它可以被用于公钥密码和数字签名。


二、RSA加密

在RSA中,明文、私钥和密文都是数字。它的加密过程是这样的:

密文 = 明文 ^ E % N

也即是说,RSA的密文是对明文的数字的进行E次方计算,然后再进行求模得到的。这就是RSA的整个加密过程。

在这个式子中,E和N便是RSA加密的密钥,即是说,E和N的组合就是公钥,所以公钥可以表示为(E,N)。

当然,E和N并非随便什么数都是可以的,这两个数是经过严密计算得到的。


三、RSA解密

RSA的解密和加密一样简单,解密的过程如下:

明文 = 密文 ^ D % N

即是说,对密文的数字进行D次方计算,然后再进行求模便可得到明文。

同样道理,可以得到私钥为(D, N)。在加密解密中,N是同一个数字。

只有知道私钥的人才能完成解密,亦是说只有知道D和N两个数才能完成解密运算。N也是公钥的一部分,所以,最主要的私钥可以说是D。

D自然也不是普通的数字,D和E在数学上有着相当密切的联系,所以可以用E加密,然后用D解密。


四、生成密钥对

E和N是公钥,D和N是私钥,因此求E,D,N这三个数就是生成密钥对。RSA密钥的生成步骤如下:

  1. 求N
  2. 求L(此数仅在生成密钥对的进程中使用)
  3. 求E
  4. 求D

1. 求N

首先需要准备两个很大的质数p和q。

若是p和q太小的话,密码便会容易破译,但太大的话又会消耗很长的计算时间。

准备好两个数后,将这两个数相乘,其结果就是数N。即数N = p * q 。


2. 求L

L只用来生成密钥对,它是p-1和q-1的最小公倍数。所以L = lcm(p - 1, q - 1)。


3. 求E

E是一个比1大,比1小的数,并且E和L的最大公约数必须为1.所以E和L的关系如下:

1 < E < L

gcd(E, L) = 1

要找到满足gcd(E, L) = 1的数,需要使用伪随机数生成器。通过伪随机生成器在1 < E < L的范围内生成E的候选数,然后再判断其是否满足gcd(E, L) = 1。

之所以要加上gcd(E, L) = 1这个条件,是为了保证一定存在解密时需要使用的数D。

现在,公钥对已经求出来了。


4. 求D

数D是由数E计算得到的。D、E、L之间必须有如下关系:

1 < D < L

E * D % L = 1

只要满足上述条件,则使用E和N加密的密文,便可通过D和N进行解密。

也就是说,E * D % L = 1保证了对密文进行解密时能得到原来的明文。


五、简单测试

1. 求N

假设p = 17, q =19。(都质数,测试时数字选小点好计算)

N = p * q = 17 * 19 = 323。


2. 求L

L = lcm(p - 1, q - 1) = lcm(16, 18) = 144。


3. 求E

gcd(E, L) = 1

可以找到这些数:5, 7, 11, 13, 17, 19, 23,25......

这些数只要相对L是质数便可以。


4. 求D

E * D % L = 1

当E = 5, 时,此式子为:

5 * D % 144 = 1

可找出当D = 29时可满足。

所以,公钥为:E = 5, N = 323; 私钥为D = 29, N = 323。


5. 加密

现在用这个密钥对通过先前的公式来进行加密。

要加密的数必须小于N,所以要小于323(因为需要求%N,对N求模必定小于N,所以如果明文本身大于N,则解密后就无法得到正确的明文)。

明文 ^ E % N = 123 ^ 5 % 323 = 225。


6. 解密

密文 ^ D % N = 225 ^29 % 323 = 123。

原文地址:https://www.cnblogs.com/coolcpp/p/RSA.html

时间: 2024-11-08 13:34:25

RSA公钥密码的相关文章

AES与RSA混合加密完整实例

前言 前段时间看到一篇文章讲如何保证API调用时数据的安全性(传送门:https://blog.csdn.net/ityouknow/article/details/80603617),文中讲到利用RSA来加密传输AES的秘钥,用AES来加密数据,并提供如下思路: 说人话就是前.后端各自生成自己的RSA秘钥对(公钥.私钥),然后交换公钥(后端给前端的是正常的明文公钥,前端给后端的是用后端公钥加密后的密文公钥:PS:其实我觉得直接交换两个明文公钥就行了),后端生成AES的明文key,用明文key进

20145301实验五 Java网络编程及安全

北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 18:30-21:30 实验名称:实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值,一起传送给客户端 4.客户端用RSA公钥密码中服务器的私钥解密DES的,秘钥,用秘钥对密文进行解密,得出明文.计算

20145307第五次JAVA学习实验报告

20145307<Java程序设计>第五次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 实验名称: 一.实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值,一起传送给客户端 4.客户端用RSA公钥密码中服务器的私钥解密DES的,秘钥,用秘钥对密文进行解密,得出

20135236贾瑗—实验五

北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序与设计         班级:1352 姓名:闫佳歆 贾瑗 学号:20135202 20135236 成绩:             指导教师:娄嘉鹏       实验日期:2015.6.9 实验密级:         预习程度:             实验时间:15:30-18:00 仪器组次:          必修/选修:选修        实验序号:5 实验名称:Java网络编程及安全 实验目的与要

20135313_exp5

课程:Java程序与设计     班级:1353 姓 名:吴子怡  学号:20135313 小组成员: 20135113肖昱 成绩:             指导教师:娄嘉鹏       实验日期:2015.6.9 实验密级:          预习程度:         实验时间:15:30-18:00 仪器组次:          必修/选修:选修        实验序号:5 实验名称:Java网络编程及安全 实验目的与要求:结对编程,实现客户端和服务器之间数据的发送与接收,实现加解密和验证

20135333苏正生实验四实验报告

课程: Java程序设计 班级: 1353 姓名: 苏正生 学号: 2015333 成绩: 指导教师: 娄家鹏 实验日期: 2015.6.9 实验密级: 预习程度: 实验时间: 3:20~5:00 仪器组次: 必修/选修: 必修 实验序号: 实验四 实验名称: Java网络编程及安全 实验内容: 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验仪器:   名称 型号 数量 笔记本电脑 Msi GS70     1                   实验准

证书 pki

对称加密         symmetric cryptographic 非对称加密     asymmetric cryptographic 密钥交换协议 key agreement/exchange 哈希算法          Hash 报文认证码      MAC 数字签名          digital signature 数字证书          digital ID/certificate 证书颁发机构 certificate authority 公钥架构      public

java第四次实验报告

课程:Java程序与设计     班级:1352 姓 名:池彬宁  小组成员: 20135212池彬宁 20135208贺邦 学号:20135212 成绩:             指导教师:娄嘉鹏       实验日期:2015.6.9 实验密级:          预习程度:         实验时间:15:30-18:00 仪器组次:          必修/选修:选修        实验序号:5 实验名称:Java网络编程及安全 实验目的与要求:结对编程,实现客户端和服务器之间数据的发送

20135208 JAVA第四次实验

课程:Java程序与设计     班级:1352 姓名:贺邦 小组成员: 20135212池彬宁 20135208贺邦 学号:20135208 成绩:             指导教师:娄嘉鹏       实验日期:2015.6.9 实验密级:          预习程度:         实验时间:15:30-18:00 仪器组次:          必修/选修:选修        实验序号:5 实验名称:Java网络编程及安全 实验目的与要求:结对编程,实现客户端和服务器之间数据的发送与接收