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,一经查实,立即删除!

相关文章

[JVM]问下,对象在堆上的内存分配是怎样的

Java 技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以及自动回收分配给对象的内存 这里面最重要的就是,对象在堆上的内存分配 这篇文章来具体讲讲 堆整体上来说,主要分为 新生代 & 老年代 新生代又分为: Eden 区和 Survivor 区, Survivo…

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

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

河北专升本(C语言)

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

Java实现快速排序

1.介绍 快排分为两种: 1.lomuto分区算法 (快慢指针)(单边) 2.Hoare分区算法 (前后指针)(双边) 快排主要思想:选一个基准元素分为两部分,先让左边排一下序再让右边排序 2.思路分析 1.lomuto分区算法 默认&#xff1a;最右边的元素作为基准点 1.设置两个指针(dest , cu…

【Java】工具类的设计

工具类设计思想 构造方法用 private 修饰 外部无法new成员方法使用 public static 修饰 通过类名称 . 方法名称 访问 示例代码&#xff1a; Test11_1.java&#xff1a;设计一个工具类 package com.api.Demo07;import java.util.Arrays;public class Test11_1 {/*** 将数组中 …

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

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

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

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

mkdir-创建目录文件

mkdir命令来自英文词组”make directories“的缩写,其功能是用来创建目录文件。使用方法简单,但需要注意若要创建的目标目录已经存在,则会提示已存在而不继续创建,不覆盖已有文件。 语法格式:mkdir [参数] 目录名 参数说明-m创建目录的同时设置权限-p递归创建多级目录-v显…

课程表系列

相关题目&#xff1a; 207. 课程表 210. 课程表 II 1462. 课程表 IV class CourseSchedule:"""207.课程表https://leetcode.cn/problems/course-schedule/"""def __init__(self):# 记录⼀次递归堆栈中的节点self.onPath []# 记录遍历过的节点&…

LINUX定时解压缩方案

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

Kafka知识补充

如何避免 Rebalance 最简单粗暴的就是 &#xff1a; 减少组成员数量发生变化 每个 Consumer 实例都会定期地向 Coordinator 发送心跳请求&#xff0c;表明它还存活着。如果某个 Consumer 实例不能及时地发送这些心跳请求&#xff0c;Coordinator 就会认为该 Consumer 已经“死…

HarmonyOS 远端状态订阅开发实例

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

Tensorflow2 中对模型进行编译,不同loss函数的选择下输入数据格式需求变化

一、tf2中常用的损失函数介绍 在 TensorFlow 2 中&#xff0c;编译模型时可以选择不同的损失函数来定义模型的目标函数。不同的损失函数适用于不同的问题类型和模型架构。下面是几种常见的损失函数以及它们的作用和适用场景&#xff1a; 1.均方误差&#xff08;Mean Squared …

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…

标准误与聚类稳健标准误的理解

1 标准误 1.1 定义 标准误&#xff08;Standard Error&#xff09;是用来衡量统计样本估计量&#xff08;如均值、回归系数等&#xff09;与总体参数之间的差异的一种统计量。标准误衡量了样本估计量的变异程度&#xff0c;提供了对总体参数的估计的不确定性的度量。标准误越…

动网格模型算法基础(二)

本贴主要简述动网格模型算法 FLUENT动网格模型能够根据用户指定的边界运动、网络类型和网格再生方式自动地调节内部体网格节点的位置。 一、动网格使用面临的量大问题&#xff1a; 体网格的再生&#xff1b;边界运动或变形的指定&#xff1b; 二、体网格再生方法&#xff1…

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 对意图识别不准。所…

C++类型推导

这里对C的类型推导方式进行一次全面的总结。 C中有三种类型推导的方式&#xff0c;分别是模板、auto以及decltype()。以下分别介绍这三种方式的同异。 一 模板 假设有这样的函数模板和这样的调用&#xff1a; template<typename T> void f(ParamType param);f(expr);…