目录

一、什么是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算法的理解,如果有不懂或者有问题的小伙伴可以在评论区里说出来哦,我们一起加油哦!!!

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

  1. rsa加解密算法报告c语言,RSA加密解密算法c语言程序Word版

    <RSA加密解密算法c语言程序Word版>由会员分享,可在线阅读,更多相关<RSA加密解密算法c语言程序Word版(5页珍藏版)>请在人人文库网上搜索. 1.传播优秀Word版 ...

  2. golang实现RSA加密解密算法

    golang实现RSA加密解密算法 前言 一.生成密钥对(公钥私钥) 二.根据公钥加密 二.根据私钥解密 总结 前言 直接看正文吧! 一.生成密钥对(公钥私钥) 代码如下(示例): //生成私钥pri ...

  3. python实现rsa加密源代码_python实现RSA加密(解密)算法

    RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准. 今天只有短的RSA钥匙才可能被强力方式解破.到2008年为止,世界上还没有任何可靠 ...

  4. RSA加密解密算法的java实现

    最近有一个外部合作项目要求在数据传输过程中使用RSA加密算法对数据进行加密,所以需要编写一个加解密的工具类,因为对方不是java语言,所以是各自实现的这个工具,本文主要讨论实现以及双方调试过程中的一些 ...

  5. 用实例给新手讲解易懂的RSA加密解密算法

    用实例给新手讲解易懂的RSA加密算法 RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.我查过论坛上很少这方面的介绍,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深 ...

  6. RSA加密解密算法代码实现【scalajava】

    1. 什么是RSA加密算法? 1.1 对称加密和非对称加密 对称加密:对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密.对称加密只有一个秘钥,作为私钥.常见的对称加密算法:DES,AES,3 ...

  7. java php rsa加密解密算法_PHP rsa加密解密算法原理解析

    php服务端与客户端交互.提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密 1.加密解密的 ...

  8. RSA加密解密算法工具_JAVA

    这个版本绝对能用,本人亲测 注意:需要下载两个jar包 [commons-codec-1.11-bin.zip]下载地址如下: http://commons.apache.org/proper/com ...

  9. RSA、MD5加密解密算法全套解析安装教程

    第一部分介绍加密解密算法, 第二部分介绍我小组成功应用的RSA.MD5两种加密解密算法,以及心得体会. 1.加密解密算法介绍 应用的开发中安全很重要,所以信息加密技术显得尤为重要.我们需要对应用中的多 ...

最新文章

  1. JAVA条件表达式的陷阱
  2. cr材质库怎么安装_cr5.0安装没有材质库
  3. python判断输入的数字是完全平方还是三次方
  4. css字体样式 1204
  5. python武器代码_程序员需要掌握的七种 Python 代码更易维护的武器
  6. 具体数学-第4课(多重求和方法)
  7. MapReduce框架Hadoop应用(一)
  8. java 数据库实现源锁_采用java和数据库两种方式进行加锁
  9. java case容易崩溃_一些故障解决的CASE
  10. 即时通讯之xmpp协议简析
  11. android dts播放器下载,安卓dts音效apk安装包
  12. Mybatis中if判断遇到的坑
  13. 三菱FX系列DPLSY指令使用
  14. QQ2012Beta1登录协议(异地需要验证码,且密码错误的情况)
  15. 防火墙技术及其在校园网中的设计方案
  16. 圣诞节儿童什么礼物好呢?精选实用型的圣诞护眼小台灯
  17. iOS网络NSURLSession使用详解
  18. 谷歌离线地图的使用(1)
  19. 如何写好状态机?跑马灯/流水灯Verilog HDL实现
  20. 多基线干涉仪系统测向误差分析

热门文章

  1. Openstack的error僵尸实例的解决办法
  2. java 新建文件_Java创建文件的常用方法
  3. 【Git】删除本地仓库
  4. mac系统使用git上传代码到gitee
  5. HTTP协议之——HTTP报文格式
  6. 网络图片设置为手机背景
  7. 2022电大国家开放大学网上形考任务-古代小说戏曲专题非免费(非答案)
  8. JavaScript基础知识总结(基础篇)
  9. 史上最完整的MySQL注入 1
  10. ※版本管理※=☆SVN工具=※解决地域麻烦※№→搭建自己的网络SVN (SourceForge 免费) [转]...