RSA 加密解密算法实现(简单,易懂)!!!

article/2025/10/11 4:00:00

目录

一、什么是RSA算法

1.对称加密

2.非对称加密

3.非对称加密的应用

二、RSA算法的基础操作步骤

1.生成公钥和私钥

2.用公钥加密信息 

3.用私钥解密信息

三、AC代码

六、RSA算法的测试

 七、共勉


一、什么是RSA算法

    在计算机中常用的加密算法分为两类:对称加密算法和非对称加密算法。

1.对称加密

    在对称加密技术中,对信息的加密和解密都使用了相同的密钥Key,也就是说使用同一个密钥Key对数据进行加密和解密。这种加密方法可简化加解密的处理过程,信息交换双方都不必彼此研究和交换专用的加解米算法。如果在交换阶段,密钥Key没有泄露,那么加密数据的机密性和报文的完整性就可以得到保证。

2.非对称加密

    在非对称加密中,不再只有一个密钥Key了。在非对称加密算法中,密钥被分解为一对,一个称为公开密钥,另一个称为私有密钥。对于公钥,可以通过非保密方式向他人公开,而私钥则由解密方保密,不对别人公开。

3.非对称加密的应用

由于非对称加密方式可以使通信双方无需事先交换密钥就可以建立安全通信,因此被广泛应用于身份认证、数字签名、等信息交换领域。其中最具有代表性的非对称加密方式就是RSA公钥密码体制。

二、RSA算法的基础操作步骤

1.生成公钥和私钥

生成公钥PK和私钥SK的步骤如下:

(1)随意选择两个大的素数P、Q,P不等于Q。

    此处在算法实现中需要快速的判断P、Q是否为素数,代码如下:

ll primeNum(ll num)   //判断素数
{if (num == 1 || num == 0){return 0;}for (int i = 2; i * i <= num; i++){if (num % i == 0){// 不是素数返回0return 0;}}return 1; //是素数返回1
}

(2)将P、Q两个素数相乘得到一个N,即N=PQ

(3)将P、Q分别减一,再相乘,得到一个数T,即T=(Q-1)*(P-1)

(4)选择一个整数E,作为一个密钥,使E与T互质(即E与T的最大公约数为1),且E必须小于T

    此处在算法实现中需要对E与T进行互质的判断(最大公约数为1)

//判断两个数是否互素
ll coprime(ll a, ll b)  //判断互质
{ll t;if (a < b){t = a; a = b; b = t;}while (a % b){t = b;b = a % b;a = t;}//返回值为1,则a,b互素return b;
}

(5)根据公式DE mod T = 1 ,计算出D的值,作为另一个密钥。

    此时根据算法,逆向求D

	d = 1;//求e的乘法逆while (((e * d) % t) != 1) d++;

(6)通过以上的步骤就可以求出N,E,D这三个数据,其中(N,E)作为公钥,(N,D)作为私钥。

(7)生成公钥和私钥后,就可以对外发布了,其中RSA算法的详细的流程图如下:

2.用公钥加密信息 

    发送信息的一方收到公钥PK后,就可以通过公钥PK对数据进行加密,加密的操作步骤如下图所示,其中明文为:M,密文为:C

明文:M

加密:

密文 :C

其中加密的算法,先进行密文的取余运算在加密,代码如下:

//计算密文
ll candp(ll b, ll p, ll k) //b--明文或密文   p--指数(e/d)    k--模数
{if (p == 1){return b % k;}if (p == 2){return b * b % k;}if (p % 2 == 0){ll sum = candp(b, p / 2, k);return sum * sum % k;}if (p % 2 == 1){ll sun = candp(b, p / 2, k);return sun * sun * b % k;}
}

在进行加密运算

ll encryption()
{ll n, e, x, y;cout << "请输入公钥(e,n)" << endl;cin >> e >> n;cout << "请输入明文: (明文需小于" << n << ")" << endl;  //计算密文cin >> x;y = candp(x, e, n);cout << "密文为:" << y << endl;return 0;
}

3.用私钥解密信息

    接收方持有私钥(N,D)在接受到密文C后,既可以通过私钥解密,得到明文M,解密过程如下:

密文:C

解密:

明文:M

其中解密算法,先产生密钥Key算法:

ll key()
{ll p, q, t, n, e, d;cout << "请输入两个素数 p,q: " << endl;    //输入两个素数q,pcin >> p >> q;if (primeNum(p)==0||primeNum(q)==0){cout << "输入的p或q不是素数" << endl;return 0;}n = p * q;//t为n的欧拉函数t = (p - 1) * (q - 1);cout << "请输入密钥e: " << endl;cin >> e;d = 1;//求e的乘法逆while (((e * d) % t) != 1) d++;cout << "n = p * q = " << n << endl;cout << "t = (p - 1) * (q - 1) = " << t << endl;cout << ("公钥(e,n)为:(") << e << "," << n << ")" << endl;cout << ("私钥(d,n)为:(") << d << "," << n << ")" << endl;return 0;
}

 在进行解密:

ll decode()
{ll n, d, x, y;cout << "请输入私钥(d,n)" << endl;cin >> d >> n;cout << "请输入密文: ";  //计算密文cin >> y;x = candp(y, d, n);cout << "明文为:" << x << endl;return 0;
}

三、AC代码

    新建一个头文件RSA.h

#pragma once
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
// 判断素数
ll primeNum(ll num);
// 判断互质
ll coprime(ll a, ll b);
// 计算密文
ll candp(ll b, ll p, ll k);
// 生成密钥
ll key();
//加密
ll encryption();
//解密
ll decode();
// 菜单
void menu();

    将函数写在RSA.cpp中,用于主函数RSA()的调用代码如下:

#define  _CRT_SECURE_NO_WARNINGS 1
#include "RSA.h"
void menu()
{printf("------------------------------------------\n");printf("*****        请选择所需功能          *****\n");printf("*****          1.生成钥匙            *****\n");printf("*****          2.加密                *****\n");printf("*****          3.解密                *****\n");printf("*****          4.退出                *****\n");printf("------------------------------------------\n");
}
ll primeNum(ll num)   //判断素数
{if (num == 1 || num == 0){return 0;}for (int i = 2; i * i <= num; i++){if (num % i == 0){// 不是素数返回0return 0;}}return 1; //是素数返回1
}
//判断两个数是否互素
ll coprime(ll a, ll b)  //判断互质
{ll t;if (a < b){t = a; a = b; b = t;}while (a % b){t = b;b = a % b;a = t;}//返回值为1,则a,b互素return b;
}
//计算密文
ll candp(ll b, ll p, ll k) //b--明文或密文   p--指数(e/d)    k--模数
{if (p == 1){return b % k;}if (p == 2){return b * b % k;}if (p % 2 == 0){ll sum = candp(b, p / 2, k);return sum * sum % k;}if (p % 2 == 1){ll sun = candp(b, p / 2, k);return sun * sun * b % k;}
}
//生成密钥
ll key()
{ll p, q, t, n, e, d;cout << "请输入两个素数 p,q: " << endl;    //输入两个素数q,pcin >> p >> q;if (primeNum(p)==0||primeNum(q)==0){cout << "输入的p或q不是素数" << endl;return 0;}n = p * q;//t为n的欧拉函数t = (p - 1) * (q - 1);cout << "请输入密钥e: " << endl;cin >> e;d = 1;//求e的乘法逆while (((e * d) % t) != 1) d++;cout << "n = p * q = " << n << endl;cout << "t = (p - 1) * (q - 1) = " << t << endl;cout << ("公钥(e,n)为:(") << e << "," << n << ")" << endl;cout << ("私钥(d,n)为:(") << d << "," << n << ")" << endl;return 0;
}
//加密
ll encryption()
{ll n, e, x, y;cout << "请输入公钥(e,n)" << endl;cin >> e >> n;cout << "请输入明文: (明文需小于" << n << ")" << endl;  //计算密文cin >> x;y = candp(x, e, n);cout << "密文为:" << y << endl;return 0;
}
//解密
ll decode()
{ll n, d, x, y;cout << "请输入私钥(d,n)" << endl;cin >> d >> n;cout << "请输入密文: ";  //计算密文cin >> y;x = candp(y, d, n);cout << "明文为:" << x << endl;return 0;
}

    在写出主函数test.c,对上面的函数进行调用即可:

#include "RSA.h"
void RSA()
{while (1){menu();ll i = 0;cin >> i;switch (i){case 1:key();break;case 2:encryption();break;case 3:decode();break;case 4:exit(0);default:cout << "输入错误,请重新输入" << endl;}}
}
void menu1()
{printf("******************************************\n");printf("******************************************\n");printf("*****     欢迎来到RSA加密测试系统   ******\n");printf("******************************************\n");printf("******************************************\n");
}
int main()
{menu1();RSA();return 0;
}

六、RSA算法的测试

 七、共勉

    以下就是我对RSA算法的理解,如果有不懂或者有问题的小伙伴可以在评论区里说出来哦,我们一起加油哦!!!


http://chatgpt.dhexx.cn/article/eumQdsWk.shtml

相关文章

13种加密与解密算法【一】

这15种加密解密算法分别是&#xff1a;散列哈希[MD5、SHA1、CRC32]&#xff0c;对称[DES&#xff0c;3DES&#xff08;TDEA、Triple DES&#xff09;&#xff0c;AES、&#xff0c;Blowfish&#xff0c;RC4、RC5&#xff0c;IDEA]&#xff0c;Base64、Rabbit、Escape。【三种分…

【2021最新版】Linux面试题总结(48道题含答案解析)

文章目录 1、绝对路径用什么符号表示&#xff1f;当前目录、上层目录用什么表示&#xff1f;主目录用什么表示? 切换目录用什么命令&#xff1f;2、怎么查看当前进程&#xff1f;怎么执行退出&#xff1f;怎么查看当前路径&#xff1f;3、怎么清屏&#xff1f;怎么退出当前命令…

linux操作系统期末考试题库

别光看点个赞呗 文档完整下载链接&#xff1a; w​​​​​​​w​​​​​​​https://download.csdn.net/download/weixin_59241300/87299684 1. cal命令 2.cat命令 3.cd命令 4.date命令 5.echo命令 6.grep命令 7.head 命令 8.ls 命令 9.touch 命令 10.more命令 …

Linux上机考试试题

Linux基础机考测试题 1、如果忘记登录密码&#xff0c;如何破解超级用户root的密码&#xff0c;并将密码改为redhat。&#xff08;操作过程抓图体现&#xff09; 开机在出现grub画面&#xff0c;按e键 用上下键选中第二项(类似于kernel /boot/vmlinuz-2.4.18-14 ro rootLABEL…

linux考试题库

&#xff08;Linux&#xff09;是一个自由、免费、开放的系统软件&#xff0c;支持多种硬件平台&#xff0c;多用户、多任务特点。 Linux操作系统是&#xff08;Linus Torvalds&#xff09;第一个开发的。 下列中&#xff08;单用户&#xff09;不是Linux的特点。 Linux一般…

Linux期末考试题库(超全)

文章目录 Linux期末考试题库选择题填空题简答题操作题 Linux期末考试题库 选择题 在创建Linux分区时&#xff0c;一定要创建&#xff08; D &#xff09;两个分区 A. FAT/NTFS  B. FAT/SWAP  C. NTFS/SWAP  D.SWAP/根分区 在Red Hat Linux 9 中&#xff0c;系统默…

虚拟机镜像文件高速下载方法之一

虚拟机镜像文件高速下载方法之一&#xff08;外加镜像文件合集打包&#xff09; 1.打开网址网易开源镜像站 2.打开对应文件夹&#xff08;比如下载kali镜像文件&#xff09; &#xff08;1&#xff09;点击 kali-images/ &#xff08;2&#xff09;点击自己需要的版本(此处我…

添加虚拟机镜像centso 8的步骤

此篇文章仅介绍添加虚拟机镜像的步骤&#xff0c;特别说明这里以centso 8为例 如有需要安装VMware虚拟机&#xff0c;可以通过以下链接跳转至对应文章 VMware虚拟机安装配置及虚拟机网络模式说明https://blog.csdn.net/weixin_55883492/article/details/123790174?spm1001.2…

vmware 虚拟机恢复ghost镜像文件

一、下载winPE.iso、软碟通 链接&#xff1a;https://pan.baidu.com/s/1Ty2td8_9-3Dr7Qc5XHhyNw 提取码&#xff1a;wtuk 二、恢复&#xff1a; 1、配置基础Vmware系统模板&#xff0c;如何配置可百度搜索 注意&#xff1a;内存必须为2G以上,否则无法使用PE 2、CD/DVD — …

macOS Monterey 12.3 (21E230) 虚拟机 IOS 镜像

macOS Monterey 12.3&#xff08;内部版本号 21E230&#xff09;&#xff0c;这是一个重大更新&#xff0c;引入了通用控制&#xff0c;这项功能可以支持一个键盘或者鼠标同时控制多台 Mac 电脑或者 iPad。另外根据用户反馈&#xff0c;此次更新也对 AMD 6000 系显卡进行了优化…

虚拟机的镜像安装

虚拟机镜像的安装 (1)下载好虚拟机iso镜像安装包 (2)命令virt-manager 打开虚拟机管理器 点击左上角创建新虚拟机按钮 (3)选择"Local install media"这个选项 --> Forward (4)点击Browse…按钮 (5)Browse Local–>找到rhel-server-7.3-x86_64-dvd.iso 镜像…

KVM详解(五)——KVM虚拟机镜像格式

今天继续给大家介绍Linux运维相关知识&#xff0c;本文主要内容是KVM虚拟机镜像格式。 一、虚拟机常用镜像格式介绍 目前&#xff0c;虚拟机的主流镜像格式有raw、cow、qcow、qcow2以及vmdk&#xff0c;下面&#xff0c;我就详细介绍一下这些主流的虚拟机镜像格式。 &#x…

虚拟机下载-下载windows镜像

虚拟机—官方镜像下载—windows镜像 访问微软官网: win10: https://www.microsoft.com/zh-cn/software-download/windows10 win7: https://www.microsoft.com/zh-cn/software-download/windows11 点击立即下载工具进行下载[windows] 下载 以后-双击—安装程序 点击 [下一步] 协…

如何下载虚拟机和下载kali虚拟机镜像

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 官网下载(Player版本免费)kali虚拟机镜像下载 官网下载(Player版本免费) VMware Workstation Player是免费版本 1.进入官网 2.选择大版本 3.下载 kali虚拟机镜…

Virtualbox加载虚拟机镜像

启动虚拟机 打开这个文件夹 双击蓝色图标 会自动开启virtualbox虚拟机,并加载当前镜像 必须保证当前镜像文件所在全部路径都没有中文 建议启动Virtualbox时使用单击右键->管理员方式运行 配置镜像参数 选中镜像,点击设置 修改usb设置 修改网络设置 桥接的网卡必须是具…

使用虚拟机镜像文件导入部署openGauss

实验项目名称 实验1 使用虚拟机镜像文件导入部署openGauss 一、实验目的&#xff1a; 将现有的VirtualboxcentosopenGauss镜像文件导入虚拟机&#xff0c;并启动使用openGauss数据库。本实验中使用的镜像文件名为&#xff1a;centos_openGauss.ova。 二、实验内容及过程、结…

制作虚拟机镜像文件

1. Linux&#xff08;Ubuntu14.04&#xff09;虚拟机镜像的制作过程 (1)准备ISO文件 准备Ubuntu14.04版本操作系统的ISO文件&#xff0c;文件名为ubuntu-14.04-server-amd64.iso&#xff08;已提供&#xff09;。 (2) 将ISO文件上传至宿主机 将Ubuntu14.04的ISO文件通过Xftp上…

几个自用的虚拟机镜像文件,兼容VMware vbox等虚拟机 ova格式直接导入

下载地址&#xff1a; 链接: https://pan.baidu.com/s/1-S-gBDFfiZSc4pLyDygfKw 提取码: havg详细说明 导出几个自己常用的虚拟机镜像 - 小类随手记1、win7 64 俄罗斯精简版没有优化&#xff0c;直接上传2、win10 64 20h2 企业 官网版正常安装&#xff0c;然后关闭休眠powercfg…

虚拟机镜像文件

通常虚拟机用到的image文件有两种&#xff1a;raw和qcow2。 制作raw格式文件的命令&#xff1a; #qemu-img create –f raw Linux-test.raw 20G 制作qcow2格式文件的命令&#xff1a; 制作qcow2格式的文件有两种方式&#xff1a;一种是backing_file方式&#xff0c;另外一种…

【调试】——idea远程调试服务器上的代码

前提 有些时候难免会出现一些线上问题&#xff0c;可能就需要远程调试服务器上的代码&#xff0c;依次快速定位错误代码&#xff0c;进行改正。小编最近通过idea进行了远程代码调试&#xff0c;特此记录一下&#xff0c;希望可以帮需要的朋友。 步骤 1、保证本机的代码和服务…