#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>//质数判定函数
intlong IsPrime(intlong n)
{int i=2;int m=sqrt(n);if(n<=1){return 0;}for(i=2;i<=m;i++){if(n%i==0){break;}}if(i>m){return 1;}else{return 0;}
}int main()
{
//------------step1:随机生成两个质数-------------------------srand(time(NULL));intlong a=rand()%1000001+1000000;int i;for(i=0;;i++){if(IsPrime(a)){break;}else{a=rand()%1000001+1000000;//生成一个1000000到2000000之间的质数}}for(i=0;i<1000000000;i++){}//防止产生两个同样的质数srand(time(NULL));intlong b=rand()%1000001+1000000;for(i=0;;i++){if(IsPrime(b)){break;}else{b=rand()%1000001+1000000;}}printf("a:%ld\nb:%ld\n",a,b);//------------step2:生成两个随机数的积n与n的欧拉函数m-------------------------long long n;n=a*b;//此数位数越大,破解难度会指数上升 printf("n:%lld\n",n);long long m;            //生成n的欧拉函数  m=(a-1)*(b-1);          //公式1printf("m:%lld\n",m);//------------step3:生成公钥e-------------------------long long e;for(i=0;i<1000000000;i++){}srand(time(NULL));e=rand()%m+1;           //公式2for(i=0;;i++){if(IsPrime(e)){break;}else{e=rand()%m+1;}}printf("e:%lld\n",e);
//------------step4:生成私钥d-------------------------  long long d;for(d=0;;d++)         //用一个for循环代替欧几里得扩展算法{if((e*d)%m==1)      //公式3       {break;}}printf("d:%lld\n",d);
//------------step5:用n与公钥e加密message-------------------------  long int Message=888; //明文消息long int CodedMessage;//加密后消息long int DecodedMessage//解密后消息CodedMessage=pow(Message,e)%n //加密//------------测试1:合法的用n与私钥d解密加密后消息-------------------------  DecodedMessage=pow(CodedMessage,d)%n      //------------测试2:在无私钥d的情况下,遍历穷举尝试将n分解求ab,进而代回Step2中的公式2求出m,m代回step3公式2求出e,m和e代回公式4求出私钥d,以达到非法破解-------------------------  int long try_a,try_b;for(try_a=2;a1<n;try_a++){for(try_b=2;try_b<n;try_b++){if(IsPrime(try_b)){if(IsPrime(try_a)){if(try_a*try_b==n){printf("a=%ld,b=%ld,n=%ld",try_a,try_b,try_a*try_b);  //将n分解为两个质数,只可能有一个解,到这里既已经找到了abreturn;                                               }}else{continue;}}else{continue;}}}return 0;}

此加密算法的安全性就是建立在将n分解为两个质因数的耗时性上,以上面测试二中的代码为例,a*b结果的取值范围在1 000 000 000 000~4 000 000 000 000, 1万亿~4万亿,也既是for循环的次数。一个主频4GHz的cpu每秒震荡40亿次,假设ab相乘一次(try_a*try_b==n)的指令需要4个周期(cpu4次震荡)完成,对于一个乱序cpu可以简单的优化一下代码,使用循环展开多路并行计算达到1个周期相乘一次,如果cpu支持SIMD可以最快达到0.5个周期,既需2万亿次震荡,既是只算ab不断的连续相乘也需要500秒,而这只是该函数循环中最不耗时最可优化的部分,另外4万亿这个数字对于64位int来讲还是很小的一个数(无符号64位int最大值大于10的19次方,1万亿是10的12次方,只通过放大ab取值范围,很轻松的就可以将破解难度上升百万倍)。所以一个万位长度秘钥的商业级的rsa加密,即使用优化的算法顶级的算力,破解时间也需以百年计。

===================================================

维护日志:

2018-7-24:review

一个简单地C语言程序展示RSA加密原理相关推荐

  1. 一个简单的C语言程序(详解)

    C Primer Plus之一个简单的C语言程序(详解) #include <stdio.h>int main(void) //一个简单的 C程序 {int num; //定义一个名为 n ...

  2. 一个简单的C语言程序HelloWorld!

    所谓万事开头难嘛,我们就先写一个最简单的C语言程序来认识C语言吧! 万能的HelloWorld! #include <stdio.h>int main(void) {printf(&quo ...

  3. 一个简单的C语言程序是怎么来的呢?

    1.定义程序的目标 首先构思这个C程序的作用,干什么,比如我想打印"hello world!" 2.设计程序: 进行简单的程序设计,比如我们需要设计一个打印hello word的C ...

  4. 在Ubuntu下实现一个简单的C语言程序

    1.首先鼠标右键进入终端(Terminal) 2.安装编辑器(vim)输入:sudo apt-get install vim 安装编译器(gcc)输入:sudo apt-get install g++ ...

  5. 一个简单51c语言程序,三个简单的C语言程序(上)

    今天我们介绍三个最简单的C语言程序. 例1:要求在屏幕上输出下面一行信息:ThisisaCprogram. 解决方法:在主函数中使用printf函数,将以上单词原样输出. 写程序: 运行结果:This ...

  6. Vulkan是什么?和我一起完成一个简单的Vulkan应用程序

    在本章,你将学到: Vulkan以及它背后的基本原理: 如何创建一个最简单的Vulkan应用程序: 在本书其余部分将使用到的术语和概念. 本章将介绍并解释Vulkan是什么.我们会介绍API背后的基本 ...

  7. 为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要1...

    为什么80%的码农都做不了架构师?>>>    为什么3年的Java高级程序员薪水仅仅8k-10k,而一个Linux底层C语言程序员两年经验就敢要10k的薪水?   由于目前国内嵌入 ...

  8. hosts多个ip对应一个主机名_一个简单的Web应用程序,用作连接到ssh服务器的ssh客户端...

    WebSSH 一个简单的Web应用程序,用作连接到ssh服务器的ssh客户端.它是用Python编写的,基于tornado,paramiko和xterm.js. 特征 支持SSH密码验证,包括空密码. ...

  9. UNIX网络编程笔记(2):一个简单的时间获取程序

    这一讲通过一个简单的时间获取程序简单介绍套接字编程. 1.套接字API 1.1.套接字地址结构 上一讲中介绍了TCP的一些内容,知道了一个套接字对唯一标识了网络中的一个TCP连接,而一个套接字标识了一 ...

最新文章

  1. ossim-agent代理和要监控的服务器的配置
  2. 用标准 GHOST镜像xpe系统(EWF保护模式为RAM)时,写保护丢失问题的解决方法
  3. ORACLE 表类型 OLTP和OLAP
  4. 服务器提交协议冲突 Section=ResponseStatusLine 的解决办法
  5. R语言学习笔记(四)参数估计
  6. 使用layui框架时,select的onchange事件没有生效。
  7. 简单理解操作系统中的PV操作
  8. FairMOT论文详解
  9. 浅谈TCP/IP网络编程中socket的行为
  10. python短期预测图_用Python预测「周期性时间序列」的正确姿势
  11. php爬取网站所有链接,php 爬取超链接
  12. 图片太大怎么压缩变小?图片如何压缩?
  13. CSS写一个实心小圆点的样式
  14. Linux配置访问服务器图片路径(防止踩坑)
  15. 根据userAgent获取浏览器/操作系统/设备类型等信息
  16. 有符号和无符号相加(vivo)
  17. linux文件同步方法,inotify + rsync实现linux文件实时同步
  18. C语言字母升序排列,C语言改错题,题目:实现n个字符串的升序排列
  19. Day 6.重大医疗伤害事件网络舆情能量传播过程分析*———以“魏则西事件”为例
  20. phpstudy安装和使用

热门文章

  1. ubuntu 14.10 64bit系统安装MBuntu主题(仿Mac主题)
  2. linux定制环境变量,定制Linux系统环境变量.doc
  3. php饿死,中国第一懒人:父母去世后,23岁的他饿死家中
  4. 设计一算法,判断给定单链表的长度是奇数还是偶数
  5. python读取excel写入mysql_python读取excel写入mysql
  6. kettle mysql_KETTLE7如何连接MYSQL8?
  7. 小程序 怎么选云服务器,小程序如何选择云服务器
  8. A7x linux游戏,oppoa7x中将游戏空间开启的具体操作流程
  9. php 全局匹配,JS使用RegExp对象实现replaceall全局匹配并替换
  10. linux屏幕怎么放大_02|初始Linux——Windows与Linux区别