鱼C论坛

 找回密码
 立即注册
查看: 2444|回复: 11

[技术交流] 用C语言写的RSA

[复制链接]
发表于 2014-12-18 10:35:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

比较垃圾  分享一下八
#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 int  CheckE (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 int  CalculateD(long int  f_n ,long  int e)     //辗转相除
{
        int i , j = 1 , t1 , t2= 1 , k = 0  , m ;

        int arry_1[30] = {f_n,e} ,arry_2[30] ={0} ;
        printf(" the Calculation:\n") ;
        for (i=1 ; (arry_1[i] != 0 )&&( arry_1[i] != 1); i ++)
        {
                arry_1[i+1] =arry_1[i-1]%arry_1[i] ;
                arry_2 [i-1] = arry_1[i-1]/arry_1[i] ;
                printf(" %d = %d*%d+%d\n",arry_1[i-1],arry_1[i],arry_2[i-1],arry_1[i+1] ) ; 
        }
        t1 = 1 ;
        t2 = -arry_2[i-2] ;
        while((i -2)!= k )
        {
                m = t1 ;
                t1 = t2  ;
                if (j%2 != 0)
                        t2 = (abs(m)+arry_2[i-3]*abs(t2) );
                else
                        t2 = -(abs(m)+arry_2[i-3]*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[20] ,str2[20] ;

 while(e)
 {
  str1[i] = e%2 ;
  e = e/2 ;
   i++ ;
 }
 i -- ;
 printf("The binary is :");
 for (length = 0 ; i>=0 ; length ++)
 {
 str2[length] = str1[i] ;
 printf("%d",str2[length]);
 i -- ;
 }
 return str2 ;
 
 }
 int  Encrypt(int m , int e , int n)  //平方乘法
 {
         int  c =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 ;
}

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
~风介~ + 3 + 3 + 3 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-18 11:44:59 | 显示全部楼层
亲,你有c写的des的代码吗?或者说你可以写一个吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-18 13:03:50 | 显示全部楼层
RSA?这不是腾讯的 经典算法的么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-18 18:55:16 | 显示全部楼层
~风介~ 发表于 2014-12-18 11:44
亲,你有c写的des的代码吗?或者说你可以写一个吗?

期末了在做密码学   我选的这个  你要的话可以帮你问问其他同学的。然后给你分享一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-18 18:55:53 | 显示全部楼层
Angel丶L 发表于 2014-12-18 13:03
RSA?这不是腾讯的 经典算法的么?

但是我写的这个容易溢出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

ok!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-19 18:56:59 | 显示全部楼层
我是来打酱油的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-23 07:52:45 | 显示全部楼层
:lol: 我是来看你们打酱油的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-1 21:53:57 | 显示全部楼层
挺好的丫泡姐~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-2 09:54:20 | 显示全部楼层
~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-1-11 22:40:05 | 显示全部楼层
复制粘贴了,报错了:call:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-11 22:56:13 | 显示全部楼层
桃花飞舞 发表于 2015-1-11 22:40
复制粘贴了,报错了

哪里报错了 可能是编译器的原因 不同编译器对函数的至此不一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 03:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表