RSA实现输出公钥和私钥 linuxc实现



/*************************************************************************
    > File Name: 1.c
    > Author: wolf
    > Description:  
    > Created Time: 2015年05月07日 星期四 09时11分40秒
 ************************************************************************/
#include
#include
#include
#include
//RSA
// 公钥对(e,N)  加密方法:  明文^e mod N=秘文
// 私钥对(d,N)  解密方法: 秘文^d mod N=明文
// 我们要计算出 e  d  N 的值
//N = p*q (q和p为两个素数) 
//L= (p-1)和(q-1)的最小公倍数,L用来生成e 和 d
//e为一个素数 这个素数和L的最大公约数为1
// e*d mod L = 1 (d满足此公式)

//过程综述
//1.如何生成随机素数
//  生成两个素数(在这作实验使用小的素数1000以内) p 和 q
//  (如何判断一个数是素数)
//2.求两个书的最小公倍数
//   先求出两个数的最大公约数(辗转相除) 
//   再用两个数的乘机除以最大公约数就是最小公倍数
// 
#define PRIME_RANGE_LEFT  5 
#define PRIME_RANGE_RIGHT 20  //素数范围


int gcd(int d1,int d2);  //生成两个数的最大公约数
int match(int e,int L); //匹配e和L的最大公约数为1
int isnprime(int d);
int prime(void); //产生素数
int lcm(int d1,int d2);//计算最小公倍数
int cal_e(int d);  //求出公钥中的 e
int cal_d(int e,int L); //求出私钥的d

int main(int argc,char *argv[])
{
 int p,q;
 int N,L;
 int e;
 int d;

 srand(time(NULL));

  p = prime();
  q = prime();
 
  N = q*p;
  L = lcm(p-1,q-1);
  e = cal_e(L);  
  d = cal_d(e,L);

  //printf("%d--%d--%d--%d--%d--%d\n",p,q,N,L,e,d);
 
  printf("公钥(%d,%d)\n",e,N);
  printf("私钥(%d,%d)\n",d,N);
  return 0;
}

//判断是否为素数
int isnprime(int d)
{
 int nu;
 int i;

 nu = (int)sqrt(d)+1;
 if(nu==2)
  return 0;

 for(i=2;i  {
  if(d%i==0)
   break;
 }
 if(i>=nu && i!=2)
  return 0;

 return 1;
}


int gcd(int d1,int d2)  //生成两个数的最大公约数
{
 int r;

 if(d1  {
  r=d1^d2;
  d1 = r^d1;
  d2 = r^d1;
 }

 //计算最大公约数
 r = d1%d2;
 while(r!=0)
 {
  d1 = d2;
  d2 = r;
  r = d1%d2;
 }

 return d2;
}

int match(int e,int L) //匹配e和L的最大公约数为1
{
 int number;

 number = gcd(e,L);
 if(number==1)
  return 1;
 else
  return 0;
}

int cal_e(int L)
{
 int e;
 int stop=0;
    
 while(!stop)
 {
  do
  {
   e = rand()%15+2;
  }while(isnprime(e)); //判断是否为素数
  
  if(match(e,L)) //找e和L最大公约数为1的e
   return e;  
 } 
 return 0; //错误时返回0 
}

//求吃私钥中的d
int cal_d(int e,int L)
{
 int d;
 for(d=1;d<=L;d++)
 {
  if((e*d)%L==1)
   return d;
 }

 return 0;  //没找到返回0 
}

int prime(void)
{
 int number;

 do
 {
  number = rand()% PRIME_RANGE_RIGHT+PRIME_RANGE_LEFT; 
 }while(isnprime(number));

 return number;
}

int lcm(int d1,int d2) //最小公倍数
{
 int number;

 number  = d1*d2;
 return (number / gcd(d1,d2));
}

你可能感兴趣的:(密码学,linux,c软件开发)