RSA加密的原理

news/2024/10/23 5:35:21/

一、RSA加密算法的原理

先上公式:

在这里插入图片描述

加密过程:其实就是明文的E次方对N取模公钥:(E,N)解密过程:密文的D次方对N取模私钥:(D,N)

那么以上公式中的E、D、N分别代表什么,又是如何保证RSA加密算法的安全性的呢?

二、RSA加密为什么是安全的

一、原则:目前计算机无法将一个大整数分解成两个互质的数相乘的结果。如果我告诉你上面公式公式中的N就是这个大整数,而公钥和私钥中的E、D又是根据N计算得到的,那是不是想要破解的人 无法得到N,那么也就无法计算得到D、E,从而无法破解得到公钥和私钥了呢。

二、计算公式
在这里插入图片描述

三、举例

为了计算方便,p q 的值取小一旦,假设:p = 17,q = 19,

则:

(1)求N:N = p * q = 323;

(2)求L:L = lcm(p-1, q-1)= lcm(16,18) = 144,144为16和18对最小公倍数;

(3)求E:1 < E < L ,gcd(E,L)=1,即1 < E < 144,gcd(E,144) = 1,E和144互为质数,E = 5显然满足上述2个条件,故E = 5,此时公钥= (E,N)=(5,323);

(4)求D:求D也必须满足2个条件:1 < D < L,E*D mod L = 1,即1 < D < 144,5 * D mod 144 = 1,显然当D= 29 时满足上述两个条件。1 < 29 < 144,

5 *29 mod 144 = 145 mod 144 = 1,此时私钥=(D,N)=(29,323);

(5)加密:准备的明文必须是小于N的数,因为加密或者解密都要 mod N,其结果必须小于N。

假设明文 = 123,则 密文=(123的5次方)mod 323=225

(6)解密:明文=(225的29次方)mod 323 =123,所以解密后的明文为123。

RSA加密算法使用中需要注意的问题

一、加密算法中使用的Cipher不是线程安全的
二、加密的系统和解密的系统分开部署
三、密钥长度越大,生成密文的长度也就越大,加密的速度也就越慢,而密文也就越难被破解掉
四、RSA 加密实现不允许明文长度超过密钥长度减去 11(单位是字节,也就是 byte)。

如果我们定义的密钥(我们可以通过 java.security.KeyPairGenerator.initialize(int keysize) 来定义密钥长度)长度为 1024(单位是位,也就是 bit),生成的密钥长度就是 1024位 / 8位/字节 = 128字节,那么我们需要加密的明文长度不能超过 128字节 -11 字节 = 117字节

五、Java 默认的 RSA 实现 “RSA/None/PKCS1Padding” 要求最小密钥长度为 512 位(否则会报 java.security.InvalidParameterException: RSA keys must be at least 512 bits long 异常),也就是说生成的密钥、密文长度最小为 64 个字节。如果你还嫌大,可以通过调整算法提供者来减小密文长度:

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA", "BC");
keyGen.initialize(128);

如此这般得到的密文长度为 128 位(16 个字节)。但是这么干密钥长度太短,容易被破解。


http://www.ppmy.cn/news/63116.html

相关文章

Nginx静态资源传输优化,文件高效传输,事半功倍

1.引出问题 Nginx可以作为静态资源服务器&#xff0c;比如我们访问192.168.110.97:80&#xff0c;熟悉的nginx欢迎界面&#xff0c;这其实也是nginx为我们提供的一个静态文件&#xff1a;index.html。 既然是静态资源&#xff0c;那我们能否优化一下传输效率呢&#xff1f; 1…

php+mysql求职招聘人才网站

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户[10]。 2&#xff0e;系统用户管理&#xff1a;不…

Linux安装canal

Linux安装canal 文章目录 Linux安装canalmsql修改1. mysql创建用户并授权2. 修改mysql的配置文件3. 重启mysql4. 检查是否打开binlog5. 查看binlog日志列表和当前正在写入的binlog canal1. 下载canal&#xff1a;2. 在服务器上解压3. 修改配置文件4. 启动canal5. 查看日志是否正…

C++的类型转换

文章目录 1. C语言中的类型转换2. 为什么C需要四种类型转换3. C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast 1. C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0…

685页40万字某省市场监管智慧应用一体化项目(word可编辑)

1.2.3.1 数字XX公共能力建设现状 1.2.3.1.1 数字XX通用基础应用平台现状 通用基础应用平台提供具有共性特征的跨部门、跨层级业务应用&#xff0c;与本项目有关的平台包括某省网上办事大厅、某省政务服务 APP 统一平台&#xff08;X政通 APP&#xff09;、某省公共信用信息平…

Linux | 学习笔记(适合小白)

操作系统概述&#xff1a; 计算机是由硬件和软件这两个主要部分组成的操作系统是软件的一类&#xff0c;主要作用是协助用户调度硬件工作&#xff0c;充当用户和计算机硬件之间的桥梁常见的操作系统&#xff1a;PC端&#xff1a;Windows&#xff0c;Linux&#xff0c;MacOS&…

热门的免费 API 合辑整理

快递物流查询 全国快递物流查询&#xff1a;目前已支持600快递公司的快递信息查询。 跨境国际快递物流查询 &#xff1a; 支持900物流商&#xff0c;提供实时查询和单号订阅API接口。 物流时效性查询&#xff1a;预估从下单开始直到收到货物的时间&#xff0c;计算物流的时效…

go读request.Body内容踩坑记

go读request.Body内容踩坑记 踩坑代码如下&#xff0c;当时是想获取body传过来的json func demo(c *httpserver.Context) {type ReqData struct {Id int json:"id" validate:"required" schema:"id"Title string json:"…