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

这篇具有很好参考价值的文章主要介绍了RSA 加密解密算法实现(简单,易懂)!!!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、什么是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)
		{
			// 不是素数返回0
			return 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算法的详细的流程图如下:

实现rsa加密算法,根据已知明文计算出rsa的加密密文,并解密,密码学,c++,安全,算法

2.用公钥加密信息 

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

明文:M

加密:实现rsa加密算法,根据已知明文计算出rsa的加密密文,并解密,密码学,c++,安全,算法

密文 :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

解密:实现rsa加密算法,根据已知明文计算出rsa的加密密文,并解密,密码学,c++,安全,算法

明文:M

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

ll key()
{
	ll p, q, t, n, e, d;
	cout << "请输入两个素数 p,q: " << endl;    //输入两个素数q,p
	cin >> 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)
		{
			// 不是素数返回0
			return 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,p
	cin >> 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的加密密文,并解密,密码学,c++,安全,算法

实现rsa加密算法,根据已知明文计算出rsa的加密密文,并解密,密码学,c++,安全,算法

 七、共勉

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

实现rsa加密算法,根据已知明文计算出rsa的加密密文,并解密,密码学,c++,安全,算法文章来源地址https://www.toymoban.com/news/detail-808424.html

到了这里,关于RSA 加密解密算法实现(简单,易懂)!!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    第一部分介绍加密解密算法, 第二部分介绍我小组成功应用的RSA、MD5两种加密解密算法,以及心得体会。 1、加密解密算法介绍 应用的开发中安全很重要,所以信息加密技术显得尤为重要。我们需要对应用中的多项数据进行加密处理,从而来保证应用上线后的安全性,给用户

    2024年02月09日
    浏览(59)
  • 使用非对称加密(RSA) 实现前端加密后端解密

    数据加密方式有: 单向加密、对称加密、非对称加密、加密盐、散列函数、数字签名。 1、单向加密 单向加密通过对数据进行摘要计算生成密文,密文不可逆推还原。只能加密,不能解密,常用于提取数据的指纹信息以此来验证数据的完整性。但是会引发雪崩效应(雪崩效应

    2024年02月08日
    浏览(69)
  • js实现rsa密钥的加密、解密与生成

    今天想用js实现rsa的加解密的,在网上找了好久,下载啊什么的,十分麻烦,今天我也不bb的直接放代码 rsa.html 生成完了后,可以去在线rsa网站上检测一下,RSA在线加解密 下载链接: rsa.zip - 蓝奏云 备用下载链接: 百度网盘 密码1234 参考文献: travist/jsencrypt: (github.com)

    2024年02月16日
    浏览(50)
  • 常见加密解密(DES、RSA)以及摘要算法MD5的介绍

    1.1-理解MD5 MD5公开的算法,任何语言实现后其实都是一样的、通用的 不可逆加密:原文——加密——密文,密文无法解密出原文 1.2-MD5封装 1.3-MD5总结 相同原文加密的结果是一样的 不同长度的内容加密后都是32位,可以自行改变长度 原文件改动差别很小,结果差别很大 不管文

    2024年02月14日
    浏览(91)
  • RSAUtil 前端 JavaScript JSEncrypt 实现 RSA (长文本)加密解密

    文章归档:https://www.yuque.com/u27599042/coding_star/cl4dl599pdmtllw1 import JSEncrypt from ‘jsencrypt’ import {stringIsNull} from “@/utils/string_utils.js”:https://www.yuque.com/u27599042/coding_star/slncupw7un3ce7cb import {isNumber} from “@/utils/number_utils.js”:https://www.yuque.com/u27599042/coding_star/tuwmm3ghf5lgo4bw 注意: 此方

    2024年04月22日
    浏览(69)
  • RSA加密解密(无数据大小限制,php、go、java互通实现)

    RSA加解密中必须考虑到的**长度、明文长度和密文长度问题。明文长度需要小于**长度,而密文长度则等于**长度。因此当加密内容长度大于**长度时,有效的RSA加解密就需要对内容进行分段。 这是因为,RSA算法本身要求加密内容也就是明文长度m必须0m**长度n。如果小于这个长

    2024年02月15日
    浏览(77)
  • 【RSA】RSA加密、解密、签名与验证

    最近要做 iOS SDK 的联网授权,涉及到数据安全验证,因此想到使用 RSA 进行签名和验证。 授权主要流程如下: 1、客户方前往我方开放平台注册授权,得到 AppId 和 AppSecret 。 2、客户方集成 SDK ,调用 Register 接口传入 AppId 和 AppSecret 。 3、 SDK 将 AppId 和客户端平台相关信息提交

    2023年04月08日
    浏览(49)
  • RSA双向加解密(公钥加密-私钥解密;私钥加密-公钥解密)

            非对称加密算法中,提供一个公钥一个私钥。一般情况下,采用公钥加密、私钥解密的方式。         假设有这样一个场景:服务A与服务B需要通信,通信内容为了安全需要进行加密传输,并且服务A与服务B不能互相持有对方的钥匙。         我首先想到的是

    2024年02月11日
    浏览(67)
  • Python RSA加密解密

    一、RSA加密算法 RSA加密算法是一种非对称加密算法,加密的秘钥是由公钥和私钥两部分组成秘钥对,公钥用来加密消息,私钥用来解密消息,公钥是公开的,给对方进行加密,私钥则是用户自己保留,用来对加密的数据进行解密。 公钥pem文件格式:以-----BEGIN PUBLIC KEY-----标记

    2024年02月10日
    浏览(47)
  • RSA加密/解密

    1.1、RSA算法介绍 RSA加密算法是一种可逆的非对称加密算法,即RSA加密时候用的密钥(公钥)和RSA解密时用的密钥(私钥)不是同一把。基本原理是将两个很大的质数相乘很容易得到乘积,但是该乘积分解质因数却很困难。RSA算法被广泛的用于加密解密和RSA签名/验证等领域。

    2024年02月06日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包