RSA加密算法讲解及C++实现

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

目录

一.加密原理             

二.C++实现

3.1实现加解密算法

加解密算法示例:

2.2实现pqed的生成

2.2.1找出质数P、Q 

2.2.2计算公共模数N=P*Q

 2.2.3欧拉函数F(N)=(P-1)*(Q-1)

 2.2.4计算公钥E

2.2.5 计算私钥D

完整代码


一.加密原理             

此步骤讲解建立在了解欧拉函数等数学基础和密码学基础上的。

步骤     举例
1.找出质数  P、Q  设P=1   Q=11
2.计算公共模数  N=P*Q N=P*Q=3*11=33
3.欧拉函数  F(N)=(P-1)*(Q-1) F(33)=F(3)*F(11)=(3-1)*(11-1)=20
4.计算公钥E  1<E<F(N),E与FN互质 E可取3.7.9.11.13.17.19 假设E=3
5.计算私钥D  E*D%F(N)=1 3*D%20=1   故D取7
6.公钥加密  C=modN 假设M=2    C=8
7.私钥解密  M=modN 故解得M=2

                                          

二.C++实现

实现步骤:首先实现加解密算法、接着实现pqed的生成

其中包括:扩展欧几里得算法、加密函数、解密函数、质数的判定函数、互质的判断等独立函数

3.1实现加解密算法

用最基本思路来做加解密很简单,即为上述6、7步的实现。

void RSAEnc(int& num,int e,int n){
	unsigned long temp = (unsigned long)pow(num,e) % n;
	num = (int)temp;
}

但是很遗憾的是,稍微大一点的数字,都会出现溢出问题。因此,为防止空间时间复杂性过大,在此我们采用二分快速幂算法,用于加快幂次取模速度。

参考博文:快速幂算法(全网最详细地带你从零开始一步一步优化)_刘扬俊的博客-CSDN博客_快速幂算法

什么?没看懂?什么?太长了看不下去?行吧行吧,我们来总结下:

首先,最重要的是了解取模运算运算法则【原理感兴趣的可以自行百度】:

接着根据这个法则,我们可以根据RSA算法要求推出(E个(M%N)):

明白这一点我们就可以,使用取模算法优化我们的代码了,如果使用的指数不太大的完全够用。但是如果幂数很大的情况,还是可能出现溢出问题的。

void RSAEnc(int& num,int e,int n){
//取模运算的运算法则
	int temp = 1;
	for(int i=1;i<=e;i++){
		temp = temp * (num % n);
	}
	num = temp % n;
}

因此我们使用能算出指数非常大的快速幂算法,它通过减小指数的大小,使我们的循环次数大大减小了。【二次快速幂过程主要看上述博文的动画演示,这个动画比较通俗易懂】

但实际上,最重要思想还的就是咱们上述的取模运算运算法则指数分半,底数平方

最终优化后即为:

加解密算法示例:

void RSAEnc(int& num,int e,int n){
//取模运算的运算法则
	int temp = 1;
	while(e > 0){
		if(e & 1){
			temp = temp*num%n;
		}
		e >>= 1;
		num = num*num%n;
	}
	num = temp;
}

2.2实现pqed的生成

对于pqed的生成我的实现思路是根据RSA加密原理的步骤一步步往下撸。

2.2.1找出质数P、Q 

我使用的是p、q由用户输入,因此仅需要判定p、q是否为素数

示例:

bool IsPrime(int n){
	if(n <= 1)
		return false;
	for(int i=2;i<sqrt(n);i++){
		if((n%i) == 0)
			return false;
	}
	return true;
}

2.2.2计算公共模数N=P*Q

这不用说了吧

RSA加密算法讲解及C++实现

 2.2.3欧拉函数F(N)=(P-1)*(Q-1)

这也不用说了吧

RSA加密算法讲解及C++实现

 2.2.4计算公钥E

 分为随机数的生成与互质的判定。

随机数生成:rand随机生成的数的取值范围为[0,x),故x取fn-2,最终结果再加2,e的取值范围为[2,fn)中的整数。

		srand((int)time(0));
		e = rand()%(fn-2)+2;

互质的判定:辗转相除法求解最大公约数,当余数为0,除数为1时,两数互质。通俗点就是,这俩数的最大公约数为1,那可不就是互质嘛。

//互质的判断
bool IsCOPrime(int x,int y){
	int z;
	while(x%y !=0){
		z = x%y;
		x = y;
		y = z;
	}
	if(z == 1)
		return true;
	return false;
}

2.2.5 计算私钥D

在敲代码的时候,看了很多的讲关于扩展欧几里得算法的文章,通俗易懂的很少,推荐这一篇:​​​​​​扩展欧几里德算法详解_zhj5chengfeng的博客-CSDN博客_扩展欧几里得算法

我们用的是对乘法逆元的计算:

可以表示为:

再对比上述文章中的:

很熟悉了是不是,我们直接套用就ok了。

int e_gcd(int a,int b,int&x,int&y){
	if(b == 0){
		x = 1;
		y = 0;
		return a;
	}
	int  ans = e_gcd(b,a%b,x,y);
	int temp = x;
	x = y;
	y = temp-a/b*y;
	return ans;
}
//生成私钥d=cal(e,fn);
int cal(int a,int m){
	int x,y;
	int gcd = e_gcd(a,m,x,y);
    if(1%gcd !=0) return -1;
	x *= 1/gcd;
	m = abs(m);
	int ans = x%m;
	if(ans <= 0) ans +=m;
	return  ans;
}

完整代码

完整cpp看这里

不过我相信,聪明的你,看完了一定能自己写出来的对吧?看什么看,还不点赞!文章来源地址https://www.toymoban.com/news/detail-415448.html

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

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

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

相关文章

  • C语言实现简单加密算法 凯撒密码 RSA算法 简介及实现

    凯撒密码的核心思想就是移位。 将明文的每一个字符 在 密码系统所支持字符序列中向右平移N,映射得到新的字符从而实现加密,而解密则相反向左平移N。加密的Key即为N。 加密  解密 在如今的万维网环境中,如果A要向B发送数据,需要先加密这个数据,因为在一些不安全

    2024年02月08日
    浏览(53)
  • 公开密钥加密之RSA算法【概念+计算+代码实现】

    🌈推荐阅读:http://t.csdn.cn/nQfIY🔥 安全算法:公开密钥加密之RSA算法 公开密钥加密(又称“非对称加密”)是加密和解密使用不同密钥的一种加密方法。包括公开密钥和私有密钥(成对生成的,网上有工具网站)。 公开密钥(public key,后面简称P):加密用的密钥 私有密钥

    2023年04月17日
    浏览(107)
  • Java代码实现RSA算法加密解密文件功能

    底层算法不做赘述,想要了解自行百度。 RSA属于非对称加密,非对称加密有公钥和私钥两个概念,私钥自己拥有,不能给别人,公钥公开。根据应用的不同,我们可以选择使用不同的密钥加密: 签名:使用私钥加密,公钥解密。用于让所有公钥所有者验证私钥所有者的身份

    2024年02月12日
    浏览(56)
  • C语言中的 RSA加密和解密算法: 深度探索与实现

    RSA加密算法是一种非对称加密算法,即公开密钥加密,私有密钥解密。在公开密钥加密和私有密钥解密的过程中,密钥是不同的,这是与其他加密算法的主要区别。RSA算法的安全性依赖于大数分解,随着计算机的发展,对于大数的分解能力越来越强,RSA算法的密钥长度也在不

    2024年02月03日
    浏览(54)
  • 从加密到签名:如何使用Java实现高效、安全的RSA加解密算法?

    目录 1. 接下来让小编给您们编写实现代码!请躺好 ☺ 1.1 配置application.yml文件 1.2 RSA算法签名工具类 1.3  RSA算法生成签名以及效验签名测试 1.4 RSA算法生成公钥私钥、加密、解密工具类 1.5 RSA算法加解密测试 我们为什么要使用RSA算法来进行加解密?  RSA 加密算法是一种非对

    2024年02月12日
    浏览(55)
  • C#集成数据加密算法,包含DES、RSA、Base64、SHA、MD5算法,轻松实现数据加密解密需求

    在需要使用配置文件的工控软件中,往往需要在配置文件和数据库中对一些数据加密,即对一串数据进行加密算法后输出复杂符号和字符的形式,让非相关人员无法识别原有数据,从而对数据或数据库进行相应的保护,这往往也是公司安全部门的基本要求。 网上写加密算法的

    2024年02月03日
    浏览(85)
  • 【华为OD机考 统一考试机试C卷】素数之积/RSA加密算法(C++ Java JavaScript Python C语言)

    目前在考C卷,经过两个月的收集整理, C卷真题已基本整理完毕 抽到原题的概率为2/3到3/3, 也就是最少抽到两道原题。 请注意:大家刷完C卷真题,最好要把B卷的真题刷一下,因为C卷的部分真题来自B卷。 另外订阅专栏还可以联系笔者开通在线OJ进行刷题,提高刷题效率。

    2024年03月21日
    浏览(46)
  • 在Python中应用RSA算法实现图像加密:基于Jupyter环境的详细步骤和示例代码

    一、引言 在当今的数字化社会中,信息安全问题备受关注。随着数字图像在生活中的应用越来越广泛,图像的安全性和隐私性也成为人们关心的焦点。如何在网络上安全地传输和存储图像已经成为一项重要的挑战。RSA(Rivest-Shamir-Adleman)算法作为一种被广泛应用的公钥密码体

    2024年02月13日
    浏览(47)
  • Python 基于pycryptodome,实现对AES、DES、3DES、RSA等常用加密算法的使用,文末附各种加密的源码示例

    (中文名:加密圆顶)pycryptodome是一个基于c实现的Python库,它在2.x中支持2.7以上版本,或3.x中支持3.5以上版本的Python。 可以使用以下命令安装它: 该库支持以下特性 认证加密模式 Authenticated encryption modes (GCM, CCM, EAX, SIV, OCB) AES加密在英特尔上的加速 Accelerated AES on Intel platf

    2023年04月09日
    浏览(93)
  • RSA密码原理详解及算法实现(六步即可掌握)

    rsa算法是一种非对称加密算法,其安全性是建立在大素数难以分解的基础上的,即将两个大素数相乘十分容易,但想对其乘积进行分解却很困难,所以可以将其乘积公开作为加密密钥 根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将

    2023年04月23日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包