RSA算法的C语言代码(欢迎高手指教)

#include<stdio.h>
#include<math.h>

 //对于输入的两个数进行素数判断
int Sqrt(long a)          
{
 int i;
 double k;
 k=sqrt(a);
 for(i=2;i<=k;i++)
  if(a%i==0)
   break;
  if(i>k)
   return 1;
  else
  {
   printf("illegal!");
   return -1;
  }
}

 //验证e(从1到r中选择)和r=(p-1)*(q-1)是否互素
int **(long e,long r)     
{
 int a[1000],b[1000],i;
 a[0]=r,a[1]=e,b[1]=r/e,a[2]=r%e;
 if(a[2]==0)
  return -1;
 else
  for(i=1;;i++)
  {
   a[i+1]=a[i-1]%a[i];
   b[i]=a[i-1]/a[i];
   if(a[i]==1)
   {
    return 1;
    break;
  }
 }
}

//私钥d,(e,r)
long key(long e,long r)       
{
 long d=2;
 while(d<r)
 {
  if((d*e)%r==1)
   break;
  else
   d++;
 }
 return d;
}

//加解密结果,(加密指数e,解密指数d;摸n=p*q,待处理数据s)
long result(long e,long n,long s)   
{
 long a[100];
 long i,b=0,c=1;
 while(e>0)
 {
  a[b++]=e%2;
  e=e/2;
 }
 for(i=0;i<b;i++)
 {
  if(a[i]==1)
  {
   c=(c*s)%n;
   s=(s*s)%n;
  }
  else
  {
   c=c;
   s=(s*s)%n;
  }
 }
 return c;
}

void main()
{
 long p,q,e,n,r,c,d,i,s,o;
 //素数p、q,指数e,摸n,r=(p-1)*(q-1),私钥d,数据s
 printf("**************************/n");
 printf("        RSA算法/n");
 printf("**************************/n");
 printf("请输入两个四位以上的素数:");
 for(i=0;;i++)
 {
  scanf("%ld%ld",&p,&q);
  if(Sqrt(p)!=1||Sqrt(q)!=1)
   printf("数据输入不合要求,请重新输入!/n");
  else
   break;
 }
 n=p*q;    //摸n
 r=(p-1)*(q-1);                                
 printf("请从1到%d的范围内选择一个数e:",r);
 for(i=0;;i++)
 {
  scanf("%ld",&e);
  if(**(e,r)==1)
   break;
  else
   printf("e不满足与%d互素的条件,请重新选择!/n",r);
 }
 d=key(e,r);           //私钥
 for(i=0;;i++)
 {
  printf("选择加密请输0,解密请输1,退出请输2:");
  scanf("%d",&c);
  if(c==0)
  {
   printf("请输入待加密的数据:");
   scanf("%ld",&s);
   o=result(e,n,s);
   //(指数e,摸n,待加密数据Data)
   printf("加密后为:%ld/n",o);
  }
  else if(c==1)
  {
   printf("请输入待解密的数据:");
   scanf("%ld",&s);
   o=result(d,n,s);
   //(私钥d,摸n,待解密数据Data)
   printf("解密后为:%ld/n",o);           
  }
  else
   break;
 }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值