康小泡 发表于 2014-12-18 10:35:56

用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 ;
}

~风介~ 发表于 2014-12-18 11:44:59

亲,你有c写的des的代码吗?或者说你可以写一个吗?{:7_139:}

Angel丶L 发表于 2014-12-18 13:03:50

RSA?这不是腾讯的 经典算法的么?

康小泡 发表于 2014-12-18 18:55:16

~风介~ 发表于 2014-12-18 11:44
亲,你有c写的des的代码吗?或者说你可以写一个吗?

期末了在做密码学   我选的这个你要的话可以帮你问问其他同学的。然后给你分享一下{:9_237:}

康小泡 发表于 2014-12-18 18:55:53

Angel丶L 发表于 2014-12-18 13:03
RSA?这不是腾讯的 经典算法的么?

{:9_240:}但是我写的这个容易溢出。

~风介~ 发表于 2014-12-18 20:11:41

kklloo 发表于 2014-12-18 18:55
期末了在做密码学   我选的这个你要的话可以帮你问问其他同学的。然后给你分享一下

ok! {:7_139:}

皓月长空 发表于 2014-12-19 18:56:59

我是来打酱油的

yzsqz001 发表于 2014-12-23 07:52:45

:lol: 我是来看你们打酱油的

小甲鱼 发表于 2015-1-1 21:53:57

挺好的丫泡姐~

丸子酱1016 发表于 2015-1-2 09:54:20

~~~~

桃花飞舞 发表于 2015-1-11 22:40:05

复制粘贴了,报错了:call:

康小泡 发表于 2015-1-11 22:56:13

桃花飞舞 发表于 2015-1-11 22:40
复制粘贴了,报错了

哪里报错了 可能是编译器的原因 不同编译器对函数的至此不一样。
页: [1]
查看完整版本: 用C语言写的RSA