RSA加解密算法c语言实现

c语言实现代码如下:

#include<stdio.h>
#include<string.h>
void jiami(int e,int n,int len,int *zminw,int *miw)//加密算法
{
	int e1=e;
	for(int i=0;i<len;i++){
int r=1;
    e=e+1;
while(e!=1)
{
    r=zminw[i]*r;
    r=r%n;
    e--;
}
miw[i]=r;
e=e1;}
}
void jiemi(int d,int n,int len,int *miw,int *jmw)//解密算法
{
	int d1=d;
	for(int i=0;i<len;i++){
	int r=1;
	d=d+1;
while(d!=1)
{
  r=r*miw[i];
  r=r%n;
  d--;
}
jmw[i]=r;
d=d1;}
}
void mwcf(int *miw,int len,int *bj,int *len2)//将密文转化为个位数的数组
{
	int k=0,j,h=0;
for(int i=0;i<len;i++){
	if(miw[i]>100&&miw[i]<110) 
	{int a=miw[i]/100;int b=0;int c=miw[i]%100;k+=3;
	 for(j=h;j<k;j++) {
      *

```c
if(j==h) bj[j]=a; *斜体样式*
	  if(j==h+1) bj[j]=b;
	  if(j==h+2) bj[j]=c;}
	h=k;
	}
	if(miw[i]<100&&miw[i]>10)  {int a=miw[i]/10;int b=miw[i]%10;k+=2;
	for(j=h;j<k;j++){
    if(j==h) bj[j]=a;
	if(j==h+1) bj[j]=b;}
	h=k;
	}
	if(miw[i]>110){int a=miw[i]/100;int b=(miw[i]%100)/10;
	int c=(miw[i]%100)%10;k+=3;
	for(int j=h;j<k;j++){
	if(j==h) bj[j]=a;
	if(j==h+1) bj[j]=b;
	if(j==h+2) bj[j]=c;}
    h=k;
	}
	if(miw[i]<10) {k+=1;bj[h]=miw[i];h++;}
}
*len2=k;
}
void miwzh(int *bj,char *miw3,int len2)//密文转化为字符串形式
{
for(int i=0;i<len2;i++)
{
miw3[i]=bj[i]+'0';
}
}
int main()//0<minwen<n,也就是说明文M需要大于零,并且小于指数n。
{
int p=7,q=19;int fn,e,d=0,n;
long int minwen,miwen,jmh;//单个数字加密测试
char minw[1000],len,jmw1[1000],miw3[1000];//明文、长度、解密后的明文、密文的字符串表示
int zminw[1000],miw[1000],jmw[1000];//ascall码值、密文、解密后的ascall码值
int bj[1000],srmw[1000],len2;//才分后的密文、输入的带空格式密文、拆分后的长度
char srdmiw[1000];//输入的字符串式密文
n=p*q;    //pq的乘积
fn=(p-1)*(q-1);    //n的欧拉函数φ(n)的值
printf("φ(n)=%d,请输入一个与Φn互为质数且小于φ(n)的数e:",fn);
scanf("%d",&e);
for(int k=1;true;k++)  //计算模反元素d
	{for(;(e*d-1)<=k*fn;d++)
	{if((e*d-1)==k*fn)  break;}
     if((e*d-1)==k*fn)  break;
    }
int t2;int k2;
for(;true;){
printf("1.加密明文       2.解密已加密明文       3.退出\n");
printf("请选择操作:");
scanf("%d",&t2);
if(t2==1)
{printf("请输入要加密的明文(一串字母):");
scanf("%s",minw);
len=strlen(minw);
for(int i=0;i<len;i++)
{zminw[i]=(int)minw[i];}//将明文转化为ascall码值
jiami(e,n,len,zminw,miw);
printf("加密后的密文:");
for(int i=0;i<len;i++)
printf("%d",miw[i]);
putchar('\n');	
mwcf(miw,len,bj,&len2);
printf("拆分后的密文:");
for(int i=0;i<len2;i++)
	printf("%d",bj[i]);
putchar('\n');}
if(t2==2){                              
printf("请输入要解密的密文:");
miwzh(bj,miw3,len2);
getchar();
for(int i=0;i<len2;i++)
	scanf("%c",&srdmiw[i]);
printf("miw3的输出:");
for(int i=0;i<len2;i++)
 printf("%c",miw3[i]);
putchar('\n');
printf("srdmiw的输出:");
for(int i=0;i<len2;i++)
	printf("%c",srdmiw[i]);
putchar('\n');
k2=0;//每一次循环都还回k2的值
for(int i=0;i<len2;i++)
{if(miw3[i]==srdmiw[i]) k2++;}
if(k2==len2)  
{
jiemi(d,n,len,miw,jmw);
printf("解密后的明文(ascall码值):");
for(int i=0;i<len;i++)
	printf("%d",jmw[i]);
putchar('\n');
for(int i=0;i<len;i++)
	jmw1[i]=(char)jmw[i];
printf("解密后的明文原文:");
for(int i=0;i<len;i++)
	printf("%c",jmw1[i]);
putchar('\n');}
else  printf("没有任何明文加密后为此密文。\n");}
if(t2==3)  break;}
return 0;
}
运行结果如下:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201107002115605.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubm0L20wXzUxMTg0MzI3,size_16,color_FFFFFF,t_70#pic_center)


  • 4
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值