用C语言写的RSA
{:9_230:}比较垃圾分享一下八#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int length = 0 ;
bool JudgeP (int prime) //判断是不是素数
{
int i=0;
long double temp=0 ;
if (prime == 0||prime == 2)
return false;
else
{
temp =sqrt((float)prime);
for (i=2;i<=temp;i++)
{
if (prime%i == 0)
return false; //输入的不是素数
}
return true ; //输入的数是素数
}
}
long int InputP ( ) //直到输入素数
{
int num;
scanf_s("%d",&num);
while (!JudgeP(num))
{
printf("您输入的的不是素数,请重新输入!\n");
scanf_s("%d",&num);
}
return num ;
}
int gcd(int a , int b){
return b==0?a:gcd(b,a%b);
}
long intCheckE (long int f_n ) //判断e是否符合要求1<e <f_n且e 与f_n互素
{
long int e ;
int k ;
printf("please enter e(1<e<f_n) :");
scanf_s("%d",&e );
while (e > f_n || e<= 1) //确定e的范围
{
printf("e is't fit ,enter again!(1<e<f_n)");
scanf_s("%d",&e );
}
k =gcd(f_n,e) ;
while (k != 1)
{
printf("e with f_n relatively prime,enter again!");
scanf_s("%d",&e);
k =gcd(f_n,e) ;
}
return e ;
}
long intCalculateD(long intf_n ,longint e) //辗转相除
{
int i , j = 1 , t1 , t2= 1 , k = 0, m ;
int arry_1 = {f_n,e} ,arry_2 ={0} ;
printf(" the Calculation:\n") ;
for (i=1 ; (arry_1 != 0 )&&( arry_1 != 1); i ++)
{
arry_1 =arry_1%arry_1 ;
arry_2 = arry_1/arry_1 ;
printf(" %d = %d*%d+%d\n",arry_1,arry_1,arry_2,arry_1 ) ;
}
t1 = 1 ;
t2 = -arry_2 ;
while((i -2)!= k )
{
m = t1 ;
t1 = t2;
if (j%2 != 0)
t2 = (abs(m)+arry_2*abs(t2) );
else
t2 = -(abs(m)+arry_2*abs(t2) );
i -- ;
j++ ;
}
while(t2 < 0)
{
t2 = f_n + t2 ;
}
k = t2 ;
while(t2 = t2/f_n)
{
k = t2%f_n ;
}
printf("k = %d\n",k);
return k ;
}
int * Dec2Bin(int e ) //转换为二进制
{
int i = 0 ;
int str1 ,str2 ;
while(e)
{
str1 = e%2 ;
e = e/2 ;
i++ ;
}
i -- ;
printf("The binary is :");
for (length = 0 ; i>=0 ; length ++)
{
str2 = str1 ;
printf("%d",str2);
i -- ;
}
return str2 ;
}
intEncrypt(int m , int e , int n)//平方乘法
{
intc =1, i ;
int *p =Dec2Bin(e) ;
for (i = 0; i < length;i ++)
{
c = c %n;
c =c*c%n ;
if (*(p+i) == 1)
{ c =c%n;
c =c*m%n;
}
}
return c ;
}
int main(void)
{
long int p,q ,n,f_n ,e ,d,m,c,l;
printf("please enter p:");//p,q输入
p = InputP();
printf("please enter q ");
q = InputP();
n = p*q ; //计算n,f_n
f_n =(p-1)*(q-1);
e = CheckE(f_n ); //计算e
d=CalculateD(f_n,e); //计算d
printf("please enter m ");
scanf_s("%d",&m) ;
c =Encrypt(m,e,n);
printf("c is %d\n",c );
l=Encrypt(c,d,n);
printf("l is %d\n",l );
system("pause");
return 0 ;
}
亲,你有c写的des的代码吗?或者说你可以写一个吗?{:7_139:} RSA?这不是腾讯的 经典算法的么? ~风介~ 发表于 2014-12-18 11:44
亲,你有c写的des的代码吗?或者说你可以写一个吗?
期末了在做密码学 我选的这个你要的话可以帮你问问其他同学的。然后给你分享一下{:9_237:} Angel丶L 发表于 2014-12-18 13:03
RSA?这不是腾讯的 经典算法的么?
{:9_240:}但是我写的这个容易溢出。 kklloo 发表于 2014-12-18 18:55
期末了在做密码学 我选的这个你要的话可以帮你问问其他同学的。然后给你分享一下
ok! {:7_139:} 我是来打酱油的 :lol: 我是来看你们打酱油的 挺好的丫泡姐~ ~~~~ 复制粘贴了,报错了:call: 桃花飞舞 发表于 2015-1-11 22:40
复制粘贴了,报错了
哪里报错了 可能是编译器的原因 不同编译器对函数的至此不一样。
页:
[1]