2017-01-07 18 views
-2

私は宿題をするのに苦労しています。
私は暗号化と復号化ができるRSAアプリケーションをやっています。RSA暗号化Cコード

問題は、結果を暗号化するために入力する項目が奇妙で、何も解読できないということです。これは、シンボルである暗号化の結果をコピーしたとき、私はより奇妙なものを得たからです。

私は負のASCIIを結果として得る数式に何か関係があると推測しています。
出力:以下

だけでコンパイルして(私はまだ削除していないいくつかの未使用のstuffsを持っている)、それを試してみて、私は奇妙なことで何を意味するのか理解するために、私が試したものです、と。


Encrypting kevin After Copying encrypted kevin to decrypt

コード

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <math.h> 
#define boolean int 
#define true 1 
#define false 0 
//===================================================// 
int p = 0; 
int q = 0; 
int n = 0; 
int m = 0; 
int divider = 2; 
int tempdivider = 2; 
int initial = 0; 
int x = 0; 
int y = 0; 
char msg[100]; 
char alphabet[27]; 
//===================================================// 
void cls(); 
void menu(); 
void init(); 
void reinit(); 
void inputencrypt(); 
//int encrypt(int num); 
void encrypt(); 
char decrypt(char text[]); 
int fpb(int num); 
int d(int num); 
int primecheck(int a); 
boolean checkdigit(char text[]); 
//===================================================// 

int main() { 
    frontpage(); 
    init(); 
    menu(); 
    getchar(); 
    return 0; 
} 
//===================================================// 
void cls() { 
    for (int i = 0;i < 25;i++) { 
     printf("\n"); 
    } 
} 
//===================================================// 
boolean checkdigit(char text[]) { 
    int len = strlen(text); 
    for (int i = 0;i < len;++i) { 
     if (text[i]<'0' || text[i]>'9') { 
      return false; 
     } 
    } 
    return true; 
} 
int primecheck(int a) { 
    if (a == 1) { 
     return false; 
    } 
    for (int i = 2;i < a;i++) { 
     if (a%i == 0) { 
      return false; 
     } 
    } 
    return true; 
} 
//===================================================// 
void reinit() { 
    for (int i = 1;i < 27;i++) { 
     alphabet[i] = 'a' + i - 1; 
    } 
    p = 0; 
    q = 0; 
    n = 0; 
    m = 0; 
    divider = 2; 
    tempdivider = 2; 
    initial = 120; 
    x = 0; 
    y = 0; 
} 
void init() { 
    reinit(); 
    do { 
     printf("p = "); 
     scanf("%d", &p);fflush(stdin); 
     if (!primecheck(p)) { 
      printf("must be prime number! \n"); 
     } 
    } while (!primecheck(p)); 
    do { 
     printf("q = "); 
     scanf("%d", &q);fflush(stdin); 
     if (!primecheck(q)) { 
      printf("must be prime number! \n"); 
     } 
    } while (!primecheck(q)); 
    n = p*q; 
    m = (p - 1)*(q - 1); 
    initial = m; 
    x = fpb(m); 
    y = d(m); 
    printf("n = %d\n", n); 
    printf("m = %d\n", m); 
    printf("e = %d\n", x); 
    printf("d = %d\n", y); 
    system("pause"); 
} 
//===================================================// 
void menu() { 
    char input[2]; 
    int input1 = 0; 
    do { 
     do { 
      cls(); 
      printf("main menu\n"); 
      printf("================\n"); 
      printf("1. encrypt\n"); 
      printf("2. decrypt\n"); 
      printf("3. exit\n"); 
      printf(">> "); 
      scanf("%s", input);fflush(stdin); 
      if (checkdigit(input)) { 
       input1 = atoi(input); 
      } 
     } while (!checkdigit(input)); 

     switch (input1) { 
     case 1: 
      int c; 
      char encrypted[100]; 
      char word[100]; 
      printf("input word to encrypt : "); 
      scanf(" %[^\n]", word);fflush(stdin); 


      for (int i = 0;i < strlen(word);i++) { 

       if (word[i] == ' ') { 
        encrypted[i] = ' '; 
        //i++; 
       } 
       else { 
        for (int j = 1;j < 27;j++) { 
         if (word[i] == alphabet[j]) { 
          c = 0; 
          c = pow(j, x); 
          c = c%n; 
          encrypted[i] = c; 
          break; 
         } 
        } 
       } 
      } 
      printf("\n\nWord ASCII  [ "); 
      for (int i = 0;i < strlen(word);i++) { 
       //printf("%d", c); 
       printf("%d ", word[i]); 
      } 
      printf(" ]\n"); 


      printf("\n\nEncrypted ASCII  [ "); 
      for (int i = 0;i < strlen(word);i++) { 
       //printf("%d", c); 
       printf("%d ", encrypted[i]); 
      } 
      printf(" ]\n"); 
      printf("\n\nEncrypted  [ "); 
      for (int i = 0;i < strlen(word);i++) { 
       //printf("%d", c); 
       printf("%c", encrypted[i]); 
      } 
      printf(" ]"); 
      printf("\n\n\n"); 
      system("pause"); 
      break; 
     case 2: 
      int temp[100]; 
      char decrypted[100]; 
      char wordx[100]; 
      int h; 
      printf("input word to decrypt : "); 
      scanf(" %[^\n]", wordx);fflush(stdin); 
      for (int i = 0;i < strlen(wordx);i++) { 
       temp[i] = wordx[i]; 
       //temp[i] -= 97; 
       //printf("%d ::: %c\n", temp[i], temp[i]); 
      } 
      for (int i = 0;i < strlen(wordx);i++) { 
       if (wordx[i] == ' ') { 
        decrypted[i] = ' '; 
       } 
       else { 
        h = 0; 
        h = pow(temp[i], y); 
        h = h%n; 
        decrypted[i] = h; 
        for (int j = 1;j < 27;j++) { 
         if (decrypted[i] == j) { 
          decrypted[i] = alphabet[j]; 
         } 
        } 
       } 
      } 
      printf("\n\nWord ASCII  [ "); 
      for (int i = 0;i < strlen(wordx);i++) { 
       //printf("%d", c); 
       printf("%d ", wordx[i]); 
      } 
      printf(" ]\n"); 
      printf("\n\nDecrypted ASCII  [ "); 
      for (int i = 0;i < strlen(wordx);i++) { 
       //printf("%d", c); 
       printf("%d ", decrypted[i]); 
      } 
      printf(" ]\n"); 
      printf("\n\nDecrypted  [ "); 
      for (int i = 0;i < strlen(wordx);i++) { 
       //printf("%d", decrypted[i]); 
       printf("%c", decrypted[i]); 
      } 
      printf(" ]"); 
      printf("\n\n\n"); 
      system("pause"); 
      break; 
     } 
    } while (input1 != 3); 
} 
//===================================================// 
int fpb(int num) { 
    if (!primecheck(num)) { 
     if (num%divider == 0) { 
      num = num/divider; 
      divider = 2; 
     } 
     else { 
      divider++; 
     } 
     fpb(num); 
    } 
    else if (primecheck(num)) { 
     if (!primecheck(num + divider)) { 
      tempdivider++; 
      divider = tempdivider; 
      num = initial; 
      fpb(num); 
     } 
     else { 
      return num + divider; 
     } 
    } 
} 
int d(int num) { 
    for (int i = 1;i < num;i++) { 
     if ((x*i) % num == 1) { 
      return i; 
     } 
    } 

} 

答えて

0

暗号化オプションは、これらの3つの文を連続

c = 0; 
c = pow(j, x); 
c = c%n; 

と範囲0..(n-1)cを残して、それらの最後を持っています。

は、それとは別に、何else句が存在しないとint c;初期化されていないを残すことができます。

したがって、文字としてcの値を印刷すると、「奇妙な」結果が得られることは避けられません。負の値として

char encrypted[100];はおそらくsigned charあるとして渡されたときにsigned charintにバック促進されるので、その結果に割り当てられた範囲128..255内の任意の整数値は、未定義の動作が、おそらく負の数として表示することができますフォーマット%dprintf

1

あなたは一般的な理解の問題があります。あなたのコンソールは96文字(印字可能な7ビットASCII文字、0x20から0x7F)を正しく表すことができますが、1バイトには255の異なる値を格納できます。あなたの暗号化アルゴリズムはこの制限された範囲を気にせず、[0..255]の範囲の値を[0..255]の範囲の別の値に暗号化します。したがって、ASCII入力文字は、コンソールで正しく表現できない値に暗号化される可能性が非常に高いです。コピー&過去(タブである0x0Bなど)は、印刷できない文字に対して正しく機能しません。

しかし今、あなたは疑問に思うでしょう。電子メール?単純に:これらの文字はASCII表現に変換されるためです。 Base64エンコーディングのために少しGoogleをしてください。

暗号化された文字をファイルにストリーミングして後で読むことができます。これにより、コンソールの制限を回避できます。

Btw:printf()のドキュメントをご覧になると、その負の値が得られる理由がわかります。