RSA加密与解密原理

news2025/1/23 3:59:39

 

目录

一、什么是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 binary
        str = 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 numbers
        int count = 0;
        System.out.println("Please input nums");
        Scanner scanner = new Scanner(System.in);

//        caculate
        if (scanner.hasNext()){
            int num = scanner.nextInt();
            for (int i = 0 ;i<num;i++){
//                analyse "i" is coprime numbers
                if (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 num
        System.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.coloradmin.cn/o/1094874.html

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

相关文章

leetcode-64.最小路径和

1. 题目 2. 解答 data[i][j]表示位置i,j的值 dp[i][j]表示i&#xff0c;j位置的路径最小值&#xff1b; 0. 如果i 0, j 0, dp[i][j] data[i][j]; 如果i 0&#xff0c;j ! 0,dp[i][j] data[i][j] dp[i][j -1];如果i! 0, j 0&#xff0c;dp[i][j] data[i][j] dp[i -1]…

yolov8输出结果后处理

一、模型分析和处理&#xff1a; yolov8模型输出格式为84*8400&#xff0c;结合网络资料和上图的网络模型分析&#xff0c;可以得出如下结论&#xff1a; 84 边界框预测4 数据集类别80 搜索得知yolov8不另外对置信度预测&#xff0c;而是采用类别里面最大的概率作为置信度sc…

Delphi 打包文件到APK安装包中

打包文件到APK安装包中 目的&#xff1a;将配置文件或SQLITE打包进APK中 1.首先&#xff0c;打开菜单 Project - Deployment 2.点击添加按钮&#xff0c;选择要添加的文件&#xff08;文件最好放在工程目录中&#xff0c;这样&#xff0c;即使该工程在其他电脑上打开&#xff0…

MAYA教程之建模基础命令介绍

基础命令 视图相关操作 旋转视图 : ALT 鼠标左键平移视图 : ALT 鼠标中键缩放视图 : 滚动鼠标滚轮 或者 ALT 鼠标右键切换视图 : 空格键回到模型 : F 视图状态 选择状态 : Q移动状态 : W旋转状态 : E缩放状态 : R 视图显示 正常显示 : 1正常圆滑同时显示 : 2圆滑显示 …

1.算法-Python遗传算法实例

题记 以下是一个python遗传算法实例&#xff0c;包括全过程和解析。 编辑main.py文件 main.py文件如下&#xff1a; #导入生成伪随机数的模块 import random# 随机生成初始种群 # 1.初始化种群&#xff0c;在搜索空间内随机生成一组个体&#xff0c;称为种群 # 定义函数&#…

【C++】笔试训练(五)

目录 一、选择题二、编程题1、统计回文2、连续最大和 一、选择题 1、在上下文和头文件均正常情况下&#xff0c;以下程序的输出结果是&#xff08;&#xff09; int x 1; do {printf("%2d\n", x); } while (x--);A 1 B 无任何输出 C 2 D 陷入死循环 答案&#xf…

2.Vue-从零开始搭建一个vue项目

题记 从零开始搭建一个vue项目&#xff0c;以下是操作的全过程。 安装Vue CLI脚手架 打开终端&#xff0c;运行以下命令全局安装Vue CLI脚手架&#xff1a; npm install -g vue/cli 查看 Vue CLI脚手架版本&#xff1a; vue -V 注意&#xff1a;查看vue版本的命令不是vue -V&a…

【计算机毕设选题推荐】超市管理系统SpringBoot+SSM+Vue

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot的超市管理系统 技术栈 SpringBootVueMySQLMaven 文章目录 一、超市管理系统…

RPC框架之OpenFeign快速上手

RPC框架之OpenFeign快速上手 1. 快速上手&#x1f496;1.1 第一步 引入相关依赖&#x1f996;1.2 第二步 启用OpenFeign功能&#x1f995;1.3 第三步 编写FeignClient&#x1fabc;1.4 第四步 使用FeignClient 实现远程调用✨1.5 验证一下&#x1f355;1.6 原理2. OpenFeign整合…

Puppeteer记录操作过程及优秀的开源插件(五)

Puppeteer记录操作过程及优秀的开源插件&#xff08;五&#xff09; Puppeteer记录操作过程及优秀的开源插件&#xff08;五&#xff09;一、简介二、自动生成测试代码三、优秀的开源插件四、参考案例 一、简介 本节我们将介绍通过浏览器工具记录用户的实际操作&#xff0c;并…

SpringBoot面试题4:Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个? Spring Boot支持多种日志框架,包括以下几种: Logback:Logback 是一个快速、灵活…

架构真题2017(五十三)

在磁盘上存储数据的排列方式会影响 I/O服务的总时间。假设每磁道划分成10个物理块&#xff0c;每块存放1个逻辑记录。逻辑记录R1&#xff0c;R2&#xff0c; ...&#xff0c; RI0存放在同一个磁道上&#xff0c; 记录的安排顺序如下表所示 ; 假定磁盘的旋转速度为30ms/周&…

SAP MM学习笔记36 - 释放支付保留的发票

SAP中&#xff0c;请求书照合之后&#xff0c;发现不一致&#xff0c;就会支付保留。 支付保留&#xff0c;可以参考如下文章。 SAP MM学习笔记34 - 请求书照合中的支付保留&#xff08;发票冻结&#xff09;_东京老树根的博客-CSDN博客 当然发现不一致之后&#xff0c;如果不…

进阶JAVA篇- ZoneId 类与 ZoneDateTime 类、Instant类的常用API(七)

目录 API 1.0 ZoneId 类的说明 1.1 如何创建 ZoneId 类的对象呢&#xff1f; 1.2 ZoneId 类中的 getAvailableZoneIds() 静态方法 2.0 ZoneDateTime 类的说明 2.1 如何创建 ZoneDateTime 类的对象呢&#xff1f; 3.0 Instant 类的说明 3.1 如何创建 Instant 类的对象呢…

【初始C语言8】详细讲解初阶结构体的知识

前言 &#x1f493;作者简介&#xff1a; 加油&#xff0c;旭杏&#xff0c;目前大二&#xff0c;正在学习C&#xff0c;数据结构等&#x1f440; &#x1f493;作者主页&#xff1a;加油&#xff0c;旭杏的主页&#x1f440; ⏩本文收录在&#xff1a;再识C进阶的专栏&#x1…

模型UV纹理设置工具

1、什么是模型UV纹理&#xff1f; 模型的UV纹理是将二维纹理图映射到三维模型表面的过程。UV纹理可以为模型赋予颜色、纹理、细节和其他效果&#xff0c;使其看起来更加逼真。 2、UV纹理的原理 下面是模型UV纹理的详细原理介绍&#xff1a; UV坐标系统&#xff1a;UV坐标系统…

2.算法-Python模拟退火算法实例

题记 下面是python编写的模拟退火算法实例&#xff0c;包括全过程和解析。 编写main.py文件 main.py文件如下&#xff1a; import math import random# 初始解&#xff1a;算法从问题的解空间中随机选择一个初始解作为当前解。 # 目标函数&#xff1a;算法需要优化的目标函数…

【Docker】Docker的使用案例以及未来发展、Docker Hub 服务、环境安全、容器部署安全

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

【算法学习】-【滑动窗口】-【将 x 减到 0 的最小操作数】

LeetCode原题链接&#xff1a;1658. 将 x 减到 0 的最小操作数 下面是题目描述&#xff1a; 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数…

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

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