Liny_@NotePad

沉迷ACG中

C的RSA密码算法实现

YOYO posted @ 2009年4月25日 00:26 in 【算法】与【数据结构】 with tags RSA 加密 解密 , 2828 阅读

C写的,囧,网络课本上看过,对于我这种数学白痴怎么可能会?拖住wekooo要了公式,随便写写……

对于转ascii码的时候太囧,char最大到127,超过就变负数了,经常出乱码,太郁闷,后面改成unsigned char,在p=11,q=13的情况下可以成功转换a-z0-9的内容……

  1. #include<stdio.h>
  2.  
  3. int gcd(int a, int b){
  4.         return b==0?a:gcd(b,a%b);
  5. }
  6.  
  7. int getE(int t, int n){
  8.         int e = 2;
  9.         while(e<n&&gcd(e,t)!=1)e++;
  10.         return e;
  11. }
  12.  
  13. int getD(int t, int e){
  14.         int d = 1;
  15.         while(((e*d)%t)!=1)d++;
  16.         return d;
  17. }
  18.  
  19. int pow(int x, int e, int n){
  20.         int s = 1;
  21.         while(e--){
  22.                 s*=x;
  23.                 s%=n;
  24.         }
  25.         return s;
  26. }
  27.  
  28. unsigned char rsa(unsigned char c, int e, int n){
  29.         return pow(c, e, n);
  30. }
  31.  
  32. int main(){
  33.         int p,q;
  34.         int n;
  35.         int e,d;
  36.         int i;
  37.         char filePath[100];
  38.         unsigned char word[1000], en_word[1000], de_word[1000];
  39.         FILE *fp,*fc;
  40.  
  41.         printf("Input Two Primes: ");
  42.         scanf("%d%d",&p,&q);
  43.  
  44.         n = p*q;
  45.  
  46.         e = getE((p-1)*(q-1),n);
  47.         printf("Public Key: %d, %d\n", e,n);
  48.  
  49.         d = getD((p-1)*(q-1),e);
  50.         printf("Private Key: %d, %d\n", d,n);
  51.  
  52.         printf("Input PlainText File: ");
  53.         scanf("%s",filePath);
  54.  
  55.         fp=fopen(filePath, "r");
  56.         fc=fopen("encrypted.txt", "w");
  57.  
  58.         while(fscanf(fp,"%s",word)!=EOF){
  59.                 for(i=0; word[i]!='\0'; i++) en_word[i] = rsa(word[i], e, n);
  60.                 en_word[i] = '\0';
  61.                 fprintf(fc,"%s", en_word);
  62.         }
  63.         fclose(fp);
  64.         fclose(fc);
  65.        
  66.         fp=fopen("encrypted.txt", "r");
  67.         fc=fopen("decrypted.txt", "w");
  68.         while(fscanf(fp,"%s",word)!=EOF){
  69.                 for(i=0; word[i]!='\0'; i++) de_word[i] = rsa(word[i], d, n);
  70.                 de_word[i] = '\0';
  71.                 fprintf(fc,"%s", de_word);
  72.         }
  73.         fclose(fp);
  74.         fclose(fc);
  75.  
  76.         return 0;
  77. }
 

wekooo大牛说e一般是选的3,如果(p-1)*(q-1)不为3的倍数的话。
这里且先不管 = =。p、q输入质数且128<p*q<256为佳……

不然会出bug 囧rz ……


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter