目录

一.加密原理

二.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

这不用说了吧

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

这也不用说了吧

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看这里

不过我相信,聪明的你,看完了一定能自己写出来的对吧?看什么看,还不点赞!

RSA加密算法讲解及C++实现相关推荐

  1. 用实例给新手讲解RSA加密算法

    用实例给新手讲解RSA加密算法 2009年06月24日14:04 来源: 我有话说 查看评论(2) 好文我顶(3) 图为 RSA公开密钥算法的发明人,从左到右Ron Rivest, Adi Shami ...

  2. RSA加密算法个人理解

    RSA加密算法 引用http://www.cfca.com.cn/zhishi/wz-012.htm RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.但是有不少新来的同事对它不太 ...

  3. RSA加密算法,从实际应用到基础原理(一)

    RSA加密算法,从实际应用到基础原理(二)https://blog.csdn.net/mashiqing/article/details/127042988 日常的基础应用,登录远程服务器 在使用ss ...

  4. RSA加密算法及使用公私钥实现数字签名

    一, 传统对称加密算法 传统的对称密码算法可以有效地保护小范围内的点对点传输数据的机密性,但是在参与通信的节点数量增多后,密钥管理成为了瓶颈问题. 在密码学中,恺撒密码,或称恺撒加密.恺撒变换.变换加 ...

  5. RSA加密算法破解及原理

    " RSA加密算法是一种非对称加密算法,目前被广泛应用.本文介绍RSA算法的基本原理和破解方法." RSA在互联网上被广泛应用,典型的如各个网站的证书. 很多应用数据的加密也是使用 ...

  6. [转帖]在SQL SERVER中实现RSA加密算法

    /*本次修改增加了unicode的支持,但是加密后依然显示为16进制数据,因为进行RSA加密后所得到的unicode编码是无法显示的,所以密文依然采用16进制数据显示. 需要特别注意:如果要对中文进行 ...

  7. rsa加密算法java实例,java实现的RSA加密算法详解

    本文实例讲述了java实现的RSA加密算法.分享给大家供大家参考,具体如下: 一.什么是非对称加密 1.加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密 2.密钥分为:公钥,私钥 公钥:可 ...

  8. RSA加密算法原理和java简单实现

    数学 RSA加密算法中,用到素数.互质数.指数运算.模运算等几个数学知识. 素数 素数又称质数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数. 互质数 百度百科:公因数只有 ...

  9. RSA加密算法——密码学笔记(四)

    一.数学知识 1. 质数 质数,又称素数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数. 2. 互质数 百度百科上的解释是:公因数只有1的两个数,叫做互质数. 维基百科上的 ...

最新文章

  1. 为什么UI线程中创建Handler可以不传Looper?
  2. Python网络编程1--笔记
  3. WINDOWS SERVER 2003从入门到精通之活动目录数据库的维护
  4. 标准程序的Parameter id 并不一定准确
  5. AI理论知识整理(16)-线性方程组有解
  6. 在用户离开页面(刷新、后退、关闭等)时提示信息
  7. RESTEasy教程第1部分:基础
  8. 真无线蓝牙耳机霸主之争:苹果AirPods和索尼WF-1000XM3怎么选?
  9. opencv qt5安装linux,Ubuntu OpenCV安装和设置(Qt5吗?)
  10. 手机网站按住放大图片_这6个鲜为人知的黑科技网站,我可以玩一天
  11. GCC,GDB,Makefile
  12. mysql主从复制巡检脚本_mysql主从复制监控shell脚本
  13. MySQL 常用函数大全
  14. Arduino—— SSD1306 OLED IIC
  15. Python库-pandas详解
  16. 用PPT作数模论文图片的方法与技巧
  17. Gartner:浪潮存储进入分布式存储前三
  18. 酷比魔方 iwork10旗舰版恢复出厂设置遇到的问题
  19. 选择排序之简单选择排序
  20. 新安装的福昕阅读器总是弹出“文件安全进程防护”

热门文章

  1. 零空间、点积与对偶性
  2. tensorflow中的eval的用法
  3. c语言state用法,常见设计模式的解析和实现—State模式
  4. 分布式系统中CAP原理
  5. 南科大学生对网络授课的反馈
  6. spring boot: Whitelabel Error Page(小白的终极解决方案)
  7. pycharm---更改背景颜色
  8. 【MongoDB】mongodb | 安装 | 使用 | mdb
  9. KGC的衡量指标(MR、MRR、Hits@n)
  10. 昨天同事lastday,把前端测试包扔线上去了