鱼C论坛

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

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

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

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

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

x

比较垃圾  分享一下八
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4. int length = 0 ;
  5. bool JudgeP (int prime)             //判断是不是素数
  6. {
  7.         int i=0;
  8.         long double temp=0 ;
  9.         if (prime == 0||prime == 2)
  10.                 return false;
  11.         else
  12.         {
  13.         temp =sqrt((float)prime);
  14.         for (i=2;i<=temp;i++)
  15.         {
  16.                 if (prime%i == 0)
  17.                                 return false;       //输入的不是素数        
  18.         }
  19.         return true ;                                        //输入的数是素数
  20.         }

  21. }
  22. long int InputP ( )        //直到输入素数
  23. {
  24.         int num;
  25.                 scanf_s("%d",&num);
  26.         while (!JudgeP(num))
  27.         {
  28.                 printf("您输入的的不是素数,请重新输入!\n");
  29.                 scanf_s("%d",&num);
  30.         }
  31.         return num ;
  32. }
  33. int gcd(int a , int b){
  34.         return b==0?a:gcd(b,a%b);
  35. }
  36. long int  CheckE (long int f_n )                //判断e是否符合要求  1<e <f_n且e 与f_n互素
  37. {
  38.         long int e ;
  39.         int k ;
  40.         printf("please enter e(1<e<f_n) :");
  41.         scanf_s("%d",&e );
  42.         while (e > f_n || e<= 1)                                                //确定e的范围
  43.         {
  44.                 printf("e is't fit ,enter again!(1<e<f_n)");
  45.                 scanf_s("%d",&e );
  46.         }
  47.         k =gcd(f_n,e) ;
  48.         while (k != 1)
  49.         {               
  50.                 printf("e with f_n relatively prime,enter again!");
  51.                 scanf_s("%d",&e);
  52.                 k =gcd(f_n,e) ;
  53.         }
  54.         return e ;
  55. }
  56. long int  CalculateD(long int  f_n ,long  int e)     //辗转相除
  57. {
  58.         int i , j = 1 , t1 , t2= 1 , k = 0  , m ;

  59.         int arry_1[30] = {f_n,e} ,arry_2[30] ={0} ;
  60.         printf(" the Calculation:\n") ;
  61.         for (i=1 ; (arry_1[i] != 0 )&&( arry_1[i] != 1); i ++)
  62.         {
  63.                 arry_1[i+1] =arry_1[i-1]%arry_1[i] ;
  64.                 arry_2 [i-1] = arry_1[i-1]/arry_1[i] ;
  65.                 printf(" %d = %d*%d+%d\n",arry_1[i-1],arry_1[i],arry_2[i-1],arry_1[i+1] ) ;
  66.         }
  67.         t1 = 1 ;
  68.         t2 = -arry_2[i-2] ;
  69.         while((i -2)!= k )
  70.         {
  71.                 m = t1 ;
  72.                 t1 = t2  ;
  73.                 if (j%2 != 0)
  74.                         t2 = (abs(m)+arry_2[i-3]*abs(t2) );
  75.                 else
  76.                         t2 = -(abs(m)+arry_2[i-3]*abs(t2) );
  77.                
  78.                 i -- ;   
  79.                 j++ ;
  80.         }
  81.        
  82.         while(t2 < 0)
  83.         {
  84.                 t2 = f_n + t2 ;
  85.         }
  86.     k = t2 ;
  87.         while(t2 = t2/f_n)
  88.         {
  89.                 k = t2%f_n          ;
  90.         }
  91.     printf("k = %d\n",k);
  92.        
  93.         return k ;
  94. }
  95. int * Dec2Bin(int e ) //转换为二进制
  96. {
  97.   int i = 0 ;
  98. int str1[20] ,str2[20] ;

  99. while(e)
  100. {
  101.   str1[i] = e%2 ;
  102.   e = e/2 ;
  103.    i++ ;
  104. }
  105. i -- ;
  106. printf("The binary is :");
  107. for (length = 0 ; i>=0 ; length ++)
  108. {
  109. str2[length] = str1[i] ;
  110. printf("%d",str2[length]);
  111. i -- ;
  112. }
  113. return str2 ;

  114. }
  115. int  Encrypt(int m , int e , int n)  //平方乘法
  116. {
  117.          int  c =1  , i ;
  118.         int *p =  Dec2Bin(e) ;
  119.        
  120.          for (i = 0  ; i < length;i ++)
  121.          {
  122.                  c = c %n;
  123.                  c =c*c%n ;
  124.                   if (*(p+i) == 1)
  125.                  { c =c%n;
  126.                   c =c*m%n;
  127.                   }
  128.          }
  129.          return c ;
  130. }
  131. int main(void)
  132. {
  133.         long int p,q ,n,f_n ,e ,d,m,c,l;
  134.         printf("please enter p:");  //p,q输入
  135.         p = InputP();   
  136.         printf("please enter q ");
  137.         q = InputP();

  138.         n = p*q ;                                        //计算n,f_n
  139.         f_n =(p-1)*(q-1);

  140.         e = CheckE(f_n );                    //计算e
  141.         d=CalculateD(f_n,e);                //计算d

  142.         printf("please enter m ");
  143.         scanf_s("%d",&m) ;
  144.         c =Encrypt(m,e,n);
  145.         printf("c is %d\n",c );
  146.         l=Encrypt(c,d,n);
  147.         printf("l is %d\n",l );
  148. system("pause");
  149. return 0 ;
  150. }
复制代码


评分

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

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-12-18 11:44:59 | 显示全部楼层
亲,你有c写的des的代码吗?或者说你可以写一个吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-18 13:03:50 | 显示全部楼层
RSA?这不是腾讯的 经典算法的么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

期末了在做密码学   我选的这个  你要的话可以帮你问问其他同学的。然后给你分享一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

但是我写的这个容易溢出。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

ok!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-19 18:56:59 | 显示全部楼层
我是来打酱油的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-23 07:52:45 | 显示全部楼层
:lol: 我是来看你们打酱油的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-1 21:53:57 | 显示全部楼层
挺好的丫泡姐~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-2 09:54:20 | 显示全部楼层
~~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-1-11 22:40:05 | 显示全部楼层
复制粘贴了,报错了:call:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

哪里报错了 可能是编译器的原因 不同编译器对函数的至此不一样。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-24 08:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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