RSA算法加解密的C语言实现

  • 一. 实现的功能
  • 二. 源代码

一. 实现的功能

  1. 用户输入明文
  2. 自动随机生成较大的数p和q,并对它们进行素性检测,检测成功之后,程序继续
  3. 计算Φ(n)的值,并求出它的所有因子
  4. 随机生成比Φ(n)因子数多1的e的备选值,和上述因子作比较,选出一个不与所有因子相同的值作为e
  5. 计算密钥d
  6. 对原明文进行加密,得到密文并输出
  7. 输入密文,进行解密
  8. 输出解密后的明文

二. 源代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
/*将十进制数转换成二进制,用于检验大素数 p 和 q*/
int zh(int b,int a[],int k)
{int t,temp=-1;while(b>0){t=b%2;temp++;a[temp]=t;b=b/2;}return temp;
}
/*扩展欧几里得算法求乘法逆元,求解密指数 d*/
int extend(int n,int b)
{int q,r,r1=n,r2=b,t,t1=0,t2=1,i=1;while(r2>0){q=r1/r2;r=r1%r2;r1=r2;r2=r;t=t1-q*t2;t1=t2;t2=t;}if(t1>=0) return t1%n;else{while((t1+i*n)<0)i++;return t1+i*n;}
}
/*检验大素数*/
int Witness(int a,int n)
{int d=1,k,r=n-1,i,x,b[1000];k=zh(r,b,1000);for(i=k; i>=0; i--){x=d;d=(d*d)%n;if((d==1)&&(x!=1)&&(x!=n-1)) return 0;if(b[i]==1) d=(d*a)%n;}if(d!=1) return 0;else return 1;
}
/*快速计算模指数*/
int mod(int a,int b,int n)
{int x=0,y=1,k,i,s[1000];k=zh(b,s,1000);for(i=k; i>=0; i--){x=2*x;y=(y*y)%n;if(s[i]==1){x++;y=(y*a)%n;}}return y;
}void main()
{int p,q,e,d,n,yn,m[1000],c[10000],mw[1000];//c[10000] 存放加密后的数字密文, m[1000] 存放解密后的数字明文,即英文明文在 zimu_biao[69] 中的下标,mw[1000]用于存放用户输入的密文。int yinzi[1000],e1[1000];//yinzi[1000]用于存放Φ(n)的所有因子,e1[1000]用于存放一组随机值,用于int i,j=0,j1; //计数器char min_wen[1000],mi_wen[1000],re_min_wen[1000];// 分别为用户输入的明文,密文,解密后的明文。
//密钥生成char zimu_biao[52]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";char shuzi_biao[10]="0123456789";printf(" 请输入您要发送的明文(小写英文表示) :\n");gets(min_wen);
//随机自动生成p和q的值while(1){srand((unsigned)time(NULL));p = rand()%500+2;if(Witness(2,p)==1){printf(" 自动生成的的第一个大素数 p的值为:%d  \n",p);break;}}while(1){srand((unsigned)time(NULL));q = rand()%600+2;if(Witness(2,q)){printf(" 自动生成的的第二个大素数q的值为:%d  \n",q);break;}}n=p*q;yn=(p-1)*(q-1);
//自动随机生成efor(i = 2; i <= yn; i++)   //求出Φ(n)的所有因子{if(yn%i==0){yinzi[j]=i;j++;}j1=j;}srand(time(NULL));for(i = 0; i<j1+1; i++)   //生成大于因子个数的候选值(随机选取整数e(1<e<Φ(n))作为公钥){e1[i] = rand()%(yn-2)+2;for(j=0; j<i; j++){if(e1[j]==e1[i]){i--;break;}}}for(i=0; i<j1+1; i++){for(j=j1; j>i; j--){int x;if(e1[i]>e1[j]){x = e1[i];e1[i] = e1[j];e1[j] = x;}}}for(i = 0; i<j1+1; i++)   //要求满足e与Φ(n)的最大公约数为1,即两者互素{for(j = 0; j<j1; j++){if(e1[i]==yinzi[j]){e1[i]=0;break;}}if(e1[i]!=0){e = e1[i];break;}}d=extend(yn,e); //密钥printf("\n自动生成的加密指数 e=%d",e);
//明文转换过程for(i=0; i<strlen(min_wen); i++)for(j=0; j<51; j++) //for(j=0;j<26;j++)if(min_wen[i]==zimu_biao[j])m[i]=j;// 将字符串明文换成数字,并存到整型数组 m 里面,即明文的另一种表示方法
//加密过程for(i=0; i<strlen(min_wen); i++)c[i]=mod(m[i],e,n);printf(" 输出密文: \n");for(i=0; i<strlen(min_wen); i++)printf("%d",c[i]);
//解密过程printf("\n请输入待解密的密文:\n");gets(mi_wen);for(i=0; i<strlen(mi_wen); i++)for(j=0; j<9; j++)if(mi_wen[i]==shuzi_biao[j])mw[i]=j;printf("解密结果:");for(i=0; i<strlen(min_wen); i++)m[i]=mod(mw[i],d,n);for(i=0; i<strlen(min_wen); i++)re_min_wen[i]=zimu_biao[m[i]];for(i=0; i<strlen(min_wen); i++)printf("%c",re_min_wen[i]);printf("\n\n");}

RSA算法加解密的C语言实现相关推荐

  1. RSA算法加解密过程全解析

    不同于传统的对称加密算法体系,非对称公私钥密码系统中的加密密钥和解密密钥是相互分开的,加密密钥用于公开给别人加密,而只有持有解密密钥的人才能对信息进行解密.1976年诞生过不少非对称密码算法,但是RS ...

  2. RSA算法 --- 加解密及签名

    目录 1.RSA加密 2.RSA解密 3.RSA数学基础 3.1 互质关系 3.2 欧拉函数φ(n) 3.3 欧拉定理 3.4 模反元素 4.密钥生成过程 5.RSA签名 6.测试 RSA算法是最广为 ...

  3. python语言实现rsa公钥密码算法_python 实现 rsa 算法加解密密码

    python版本:2.7 需要用到的模块:pycrypto 模块下载地址:https://pypi.org/project/pycrypto/#files 私钥和公钥的准备: 在进行RSA加密前,我们 ...

  4. PHP语言的RSA算法加解密程序

    程序来源是GitHub的PHP RSA 公钥私钥不对称加密. Rsa.php程序如下: <?php /*** RSA 公钥 私钥加密 解密 尝试* @author wang <baobei ...

  5. RSA算法加密解密举例

    RSA算法加密解密举例 使用如下数字字母对照表: 明文M="its all greek to me" ,p=47,q=59,e=17,求出其密文以及给出RSA 算法加/解密过程.( ...

  6. rsa大数加密c语言,C语言:基于OpenSSL-RSA实现RSA非对称加解密

    关于OpenSSL的介绍和安装在此不多赘述,可以在网上找到很多相关资料,各位感兴趣可以去了解下(自觉对OpenSSL开源库只是初级使用阶段,也就不在此"秀下限"了),直接进入主题, ...

  7. 【安全算法之base64】base64加解密的C语言源码实现

    最近,有项目中需要用到base64的加解密,所以用C语言实现了一遍,测试效果还不错,代码量和RAM消耗都比较低,可以提供给大家参考下. #include <stdbool.h> #incl ...

  8. RSA的加解密过程--(转自CSDN,学习用)

    RSA的加解密过程  public void StartDemo()  {   //RSA的加解密过程:   //  有 rsa1 和 rsa2 两个RSA对象.   //  现在要 rsa2 发送一 ...

  9. SM2国密算法加解密

    接口安全设计原则的一个点就是数据不能明文传输,除了https这个必须的请求外,接口数据加密也是一个重要的方式,下面介绍一下SM2国密算法加解密的使用方式. 这里我就针对目前前后端分离架构的方式来简单介 ...

最新文章

  1. Linux内存技术分析(下)
  2. python自动开发之(算法)第二十七天
  3. spring-retry----线程内重试
  4. LeetCode14 最长公共前缀
  5. 画图怎么调整速度_初学者画图不流畅,线条毛躁生硬,而且手总抖怎么破?
  6. Python都被用在哪?都有哪些人在用Python呢?
  7. javaweb学习总结(二十一)——JavaWeb的两种开发模式
  8. 搭建一个自己的SVN服务器
  9. hadoop—集群配置历史服务器及访问历史服务器日志
  10. edxp显示未安装_如何在 Centos 8 / RHEL 8 上安装和配置 VNC 服务器
  11. android点击加号,Android仿微信朋友圈点击加号添加图片功能
  12. CCF201912-1 报数
  13. 实战解析丨如何对Mysql连接请求的tcpdump内容进行分析
  14. 【Java】进制转换器的实现
  15. NFT游戏Illuvium获500万美元种子轮融资,Framework Ventures领投
  16. vue spa页面在调用微信jssdk刷新才成功?
  17. 抖音极速版—–青龙面板
  18. 计算机病毒入侵方法,预防电脑病毒入侵的方法
  19. win10镜像文件能直接安装吗
  20. [SDOI 2015] 星际战争

热门文章

  1. Java zxing生成vcard二维码名片
  2. java常用的爬虫框架
  3. 求一个数取log2的较小的整数 Ilog2
  4. ppt打不开,显示发现文件中的内容有问题。可尝试修复此演示文稿
  5. 用java编写一个魔塔地图生成器
  6. 关于常用python编程软件有哪些,你可能还不知道
  7. 白酒营销策划方案,如何通过社群一年做了超过8000万的营业额?
  8. 软件工程-大学体育馆管理系统类图
  9. 叮叮获取所有用户信息_钉钉如何获取员工位置?
  10. 计算机无法读取exe文件,详解EXE文件出错不能打开的修复方法