RSA加密与解密原理

 

目录

一、什么是RSA加密

二、RSA加密原理

三、RSA加解密过程与算法代码


一、什么是RSA加密

RSA加密是一种非对称加密算法。

对称加密:

        对称加密是一种加密方式,加密和解密使用同一个密钥,被加密的信息在传输前用预先协商好的密钥进行加密,接收方再用同样的密钥进行解密。这种方式的优点是加密效率高、加解密速度快,但是缺点是密钥需要事先共享,如果密钥被泄漏,则加密无效。

常见的对称加密算法包括DES、3DES、AES等。

非对称加密:

        非对称加密是一种加密方式,加密和解密使用不同的密钥。发送方使用公钥进行加密,接收方使用私钥进行解密。因为公钥可以公开,所以只有私钥知道的加密信息能够被解密,这种方式的优点是安全性高,缺点是相对于对称加密而言,加密速度较慢。


二、RSA加密原理

涉及到的数学术语

  1. 质数(prime number)是指大于1且只能被1和自身整除的正整数,例如2、3、5、7等。

  2. 公共模数(common modulus)是指在加密算法中使用相同的模数进行加密或解密操作。多个用户可以使用相同的模数进行加密,但需要不同的密钥进行解密。

  3. 欧拉函数(Euler's totient function),也称为φ函数,描述了小于某个正整数n且与n互质的正整数的个数。具体计算方法根据n的素因数分解进行推导,例如对于质数p,φ(p) = p - 1,对于两个互质的质数p和q,φ(pq) = (p - 1)(q - 1)。

  4. 互质数(coprime numbers)指的是两个或多个整数的最大公因数为1的非零自然数。换句话说,互质数之间没有共同的因数,除了1以外没有其他公共因数。例如,2和3是互质数,因为它们的最大公因数是1;而6和9不是互质数,因为它们的最大公因数是3。


三、RSA加解密过程与算法代码

1.随机选取1对质数

选取的质数的值越大越安全。

2.计算公共模数

n = p * q

 如果质数越大,则乘积n越大。乘积n越大。n转换为二进制后对应的加密位数越长。越长的加密位数,越容易引发雪崩效应,以减小数据的关联性。故越安全。

假设p = 65 q = 71 ,则n = 4615,对应的二进制为1001000000111,长度为13位。

算法(Java):

public class mo {public static void main(String[] args) {int q,p;int number;Scanner scanner = new Scanner(System.in);System.out.println("please input prime number q and p");q= scanner.nextInt();p = scanner.nextInt();number = q*p;String str;
//        change number's form into binarystr = Integer.toBinaryString(number);System.out.println("binary number is"+str);System.out.println("if number change form to binary the length between "+ str.length());}
}

3.计算欧拉函数

φ(n) = φ(p*q) = (p-1)(q-1)

φ函数计算的是1~n之中的互斥数的个数。

当n=8时候,互质数为1,3,5,7  即φ(8) = 4

互斥数的个数计算算法代码(Java)

public class ola {public static void main(String[] args) {
//        setting count to caculate the number of coprime numbersint count = 0;System.out.println("Please input nums");Scanner scanner = new Scanner(System.in);//        caculateif (scanner.hasNext()){int num = scanner.nextInt();for (int i = 0 ;i<num;i++){
//                analyse "i" is coprime numbersif (BigInteger.valueOf(i).gcd(BigInteger.valueOf(num)).intValue() == 1){count++;}}}System.out.println(count);}
}

4.生成公钥

1 < e < φ(n)

注意:

  • e 的取值必须是整数
  • e 和 φ(n) 必须是互质数

公钥e的取值算法(Java):

public class publicKey {public static void main(String[] args) {int num;Scanner scanner = new Scanner(System.in);System.out.println("Please input number");num = scanner.nextInt();//        public Key is coprime number to num between 1 to numSystem.out.println("e's value can be ");for (int i = 0;i<num;i++){if (BigInteger.valueOf(i).gcd(BigInteger.valueOf(num)).intValue() ==1){System.out.printf(i+"、");}}}
}

5.生成私钥

e * d % m = 1  其中(φ(n) = m)

 其中d就是所谓的私钥,而求取d的方式就是解出二元一次方程式.

解除这个二元一次方程式可以通过扩展欧几里得算法进行求解

扩展欧几里得算法:

扩展欧几里得算法(Extended Euclidean Algorithm)是一种用于求解两个整数的最大公约数(Greatest Common Divisor,简称GCD),以及它们的线性组合的算法。该算法还可以用于解决一元线性同余方程。

假设有两个非零整数a和b,我们的目标是找到它们的最大公约数d,以及两个整数x和y,使得满足贝祖等式:ax + by = d。

扩展欧几里得算法的步骤如下:

  1. 首先,我们用辗转相除法求出a除以b的余数r,并更新a为原来的b,b为原来的r,重复这一步骤直到余数r为0。
  2. 一旦余数r为0,我们找到了d,即a和b的最大公约数。
  3. 接下来,我们倒回去进行递归计算。初始时,我们有两个系数x和y为1,然后通过迭代,更新它们的值,直到达到基本情况(b=0)。在每一步迭代中,我们用之前的系数减去当前商乘以之前的系数,以便保持贝祖等式成立。
  4. 当递归结束时,得到的两个系数x和y就是满足贝祖等式的整数解。

扩展欧几里得算法在密码学、模运算等领域有广泛的应用,例如求取模反元素、计算模逆等。它的时间复杂度为O(log min(a,b)),效率较高。

算法(Java):

public static int[] extendGcd(int a, int b) {int[] result = new int[3];if (b == 0) {result[0] = a;result[1] = 1;result[2] = 0;return result;}int[] temp = extendGcd(b, a % b);result[0] = temp[0];result[1] = temp[2];result[2] = temp[1] - (a / b) * temp[2];return result;
}

6.公钥加密

public class encryption {public static void main(String[] args) {
//        明文 与密文int M;double C;//        公钥 与公共模数int e;int num;Scanner scanner = new Scanner(System.in);System.out.println("Plase input 明文、公钥、公共模数");M = scanner.nextInt();e = scanner.nextInt();num = scanner.nextInt();//        加密算法C = Math.pow(M,e) % num;System.out.println("密文为:"+C);}
}

7.私钥解密

与公钥加密同理

C:密文 M:明文

知道所有加密流程后,快快动手试试写一个完整的RSA加密算法吧!


参考资料:

RSA加密解密原理_rsa解密_未完成的歌~的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/105878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KUKA机器人如何强制输出或取消数字IO信号?

KUKA机器人如何强制输出或取消数字IO信号? 具体的操作方法和步骤可参考以下内容: 如下图所示,点击菜单—显示—输入/输出端,如下图所示,选择想要查看的信号,这里以数字输出端为例进行说明, 如下图所示,此时可以看到输出端信号的编号、名称和当前值,可以通过下拉滚动条…

河北专升本(C语言)

目录 一&#xff1a;C语言的构成特点 二: 数据类型 三: 常量、变量、运算符及表达式 &#xff08;一&#xff09;标识符 &#xff08;二&#xff09;常量 &#xff08;三&#xff09;变量&#xff1a;其值可以改变的量 &#xff08;四&#xff09;各种类型数据混合运算 &…

简单好用的解压缩软件:keka 中文 for mac

Keka是一款功能全面、易于使用的文件压缩和解压缩软件&#xff0c;为Mac用户提供了便捷的文件管理工具。它支持多种压缩格式&#xff0c;具有快速解压和强大的压缩功能&#xff0c;让您能够轻松地处理各种文件压缩需求。 隐私非常重要 安全共享只需设置密码并创建高度加密的文…

深度强化学习 第 2 章 蒙特卡洛

2.1随机变量 强化学习中会经常用到两个概念&#xff1a; 随机变量、 观测值。 本书用大写字母表示随机变量&#xff0c;小写字母表示观测值&#xff0c;避免造成混淆。 下面我们定义概率质量函数&#xff08;probability mass function&#xff0c;缩写 PMF&#xff09;和概率…

LINUX定时解压缩方案

需求背景 对接客户中某个上游为外包系统&#xff0c;外包系统每日推送压缩文件至指定文件夹下&#xff0c;文件格式为YYYYMMDD_RegReport.zip。由于每日采集文件&#xff0c;无法对接压缩包内文件&#xff0c;需要将推送的压缩文件每日解压为文件夹 需求分析 与客户沟通后&a…

HarmonyOS 远端状态订阅开发实例

IPC/RPC 提供对远端 Stub 对象状态的订阅机制&#xff0c; 在远端 Stub 对象消亡时&#xff0c;可触发消亡通知告诉本地 Proxy 对象。这种状态通知订阅需要调用特定接口完成&#xff0c;当不再需要订阅时也需要调用特定接口取消。使用这种订阅机制的用户&#xff0c;需要实现消…

C++初阶(1)

W...Y的主页&#x1f60a; 代码仓库分享&#x1f495; ​ &#x1f354;前言&#xff1a; 今天我们正式进入C篇章&#xff0c;作为学过C语言的同志&#xff0c;继续学习C肯定就不会进行那些与C语言相同的学习&#xff0c;因为C语言的内容在C中也可以正常使用&#xff0c;所…

通过示例详细了解ES6导入导出模块

通过示例详细了解ES6导入导出模块 似乎许多开发人员认为 ES6 模块只不过是export、import关键字。事实上&#xff0c;它更加多样化。它拥有强大的功能和鲜为人知的问题。在本文中&#xff0c;我们将使用一些示例来了解这些内容。 示例一 // index.mjs import { default } fr…

flask vue跨域问题

问题&#xff1a; 调试时候跨域访问报&#xff1a; Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response. 解决办法&#xff1a; 安装flask_cros from flask_cors import CORS CORS(app) app.after_request def a…

如何避免大语言模型绕过知识库乱答的情况?LlamaIndex 原理与应用简介

本文首发于博客 LLM 应用开发实践 随着 LangChain LLM 方案快速普及&#xff0c;知识问答类应用的开发变得容易&#xff0c;但是面对回答准确度要求较高的场景&#xff0c;则暴露出一些局限性&#xff0c;比如向量查询方式得到的内容不匹配&#xff0c;LLM 对意图识别不准。所…

【Linux】多线程

文章目录 一.Linux线程概念1.什么是线程2.二级页表3.线程的优点4.线程的缺点5.线程异常6.线程用途 二.Linux进程VS线程1.进程和线程2.进程的多个线程共享3.进程和线程的关系 三.Linux线程控制1.POSIX线程库2.线程创建3.线程等待4.线程终止5.分离线程6.线程ID及进程地址空间布局…

手机拍摄的视频噪点很多怎么办,视频怎么做降噪处理?

现如今&#xff0c;智能手机已经成为了我们生活中必不可少的存在。而随着智能手机越来越强大&#xff0c;很多人已经开始使用手机来拍摄各种类型的视频。但是由于手机的限制&#xff0c;很多人会发现自己拍摄的视频存在着很多的噪点。那么&#xff0c;我们该怎样来解决拍摄视频…

N点复序列求2个N点实序列的快速傅里叶变换

一、方法简介 通过一个点复数序列求出两个点实数序列的离散傅里叶变换&#xff0c;进一步提升快速傅里叶变换的效率。 二、方法详解 和是实数序列&#xff0c;且长度都为&#xff0c;定义复数序列&#xff1a; &#xff0c; 则序列和可表示为&#xff1a; 的离散傅…

端到端的机器学习项目(Machine Learning 研习之六)

使用真实数据 当你在研习机器学习时&#xff0c;最好是使用真实世界中的数据&#xff0c;而不是采用人工数据。巧的是&#xff0c;数以千计的数据集可供选择&#xff0c;涵盖了各种领域。 流行的开放数据存储库&#xff1a; OpenML.orgKaggle.compaperswithcode.com UC Irvin…

MAYA教程之模型的UV拆分与材质介绍

什么是UV 模型制作完成后&#xff0c;需要给模型进行贴图&#xff0c;就需要用到UV功能 UV编译器介绍 打开UI编译器 主菜单有一个 UV->UV编译器&#xff0c;可以点击打开 创建一个模型&#xff0c;可以看到模型默认的UV UV编译器功能使用 UV模式的选择 在UV编译器中…

fastjson 1.2.47 远程命令执行漏洞

fastjson 1.2.47 远程命令执行漏洞 文章目录 fastjson 1.2.47 远程命令执行漏洞1 在线漏洞解读:2 环境搭建3 影响版本&#xff1a;4 漏洞复现4.1 访问页面4.2 bp抓包&#xff0c;修改参数 5 使用插件检测漏洞【FastjsonScan】5.1使用説明5.2 使用方法5.2.1 右键菜单中&#xff…

pycharm中快速对比两个.py文件

在学习一个算法的时候&#xff0c;就想着自己再敲一遍代码&#xff0c;结果最后出现了一个莫名其妙的错误&#xff0c;想跟源文件对比一下到底是在哪除了错&#xff0c;之前我都是大致定位一个一个对比&#xff0c;想起来matlab可以快速查找出两个脚本文件(.m文件)的区别&#…

Anylogic 读取和写入Excel文件

1、选择面板-连接-Excel文件&#xff0c;拖入到视图中 然后在excel文件的属性中进行绑定外部excel文件。 绑定完之后&#xff0c;在你需要读取的地方进行写代码&#xff0c; //定义开始读取的行数 //这里设为2&#xff0c;是因为第一行是数据名称 int row12; //读取excel文件信…

23面向对象案例1

目录 1、计算连续表达式的一个过程 2、优化后的代码 为什么不能return resultn&#xff1f; 3、用面向对象的方法可以解决冗余的问题&#xff0c;但是还是不能解决result的值可以被随意修改的问题 4、解决不能被随意修改的问题&#xff0c;可以将类属性改成私有变量吗&…

C++位图,布隆过滤器

本期我们来学习位图&#xff0c;布隆过滤器等相关知识&#xff0c;以及模拟实现&#xff0c;需求前置知识 C-哈希Hash-CSDN博客 C-封装unordered_KLZUQ的博客-CSDN博客 目录 位图 布隆过滤器 海量数据面试题 全部代码 位图 我们先来看一道面试题 给 40 亿个不重复的无符号…