/*************************************************************************
> 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));
}