2017-01-07 5 views
-2

Ich habe Probleme, meine Hausaufgaben zu machen.
Ich mache eine RSA-Anwendung, die verschlüsseln und entschlüsseln kann.RSA-Verschlüsselung C-Code

Das Problem ist, dass nachdem ich Dinge eingeben, um die Ergebnisse zu verschlüsseln, sind seltsam und ich kann nichts entschlüsseln. Das ist, weil, als ich die Ergebnisse der Verschlüsselung kopierte, die Symbole sind, habe ich mehr seltsame Sachen.

Ich vermute, es hat etwas damit zu tun, dass meine Formel negative ASCIIs als Ergebnis erhält.

Unten ist das, was ich versuchte, und, um zu verstehen, was ich komisch gemeint, nur kompilieren und probieren Sie es aus (ich einige nicht verwendete Stoffe, die ich noch nicht entfernt haben):
Ausgang:


Encrypting kevin After Copying encrypted kevin to decrypt

-Code:

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

} 

Antwort

0

Die encrypt Option hat diese drei Aussagen nacheinander

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

und die letzte von denen, wird c im Bereich 0..(n-1) verlassen.

Abgesehen davon gibt es keine else Klausel und int c;uninitialised bleiben kann.

Also alles in allem ist es unvermeidlich, dass, wenn Sie c Werte als Zeichen drucken, Sie "seltsame" Ergebnisse bekommen werden.

Wie für negative Werte, char encrypted[100]; ist wahrscheinlich signed char so dass jeder ganzzahlige Wert im Bereich 128..255 diejenigen zugewiesen, obwohl undefiniertes Verhalten, möglicherweise als eine negative Zahl erscheinen, weil die signed char zurück zu int gefördert wird, wenn übergeben, wie Format %d zu printf.

1

Sie haben ein allgemeines Verständnisproblem. Ihre Konsole kann nur 96 Zeichen korrekt darstellen (bekannt als druckbare 7-Bit-ASCII-Zeichen, 0x20 bis 0x7F), aber ein Byte kann 255 verschiedene Werte enthalten. Ihr Verschlüsselungsalgorithmus kümmert sich nicht um diesen begrenzten Bereich, er verschlüsselt jeden Wert im Bereich [0..255] in einen anderen Wert im Bereich [0..255]. Daher werden Ihre ASCII-Eingabezeichen höchstwahrscheinlich in Werte verschlüsselt, die von Ihrer Konsole nicht korrekt dargestellt werden können. Kopieren Sie & Vergangenheit wird nicht korrekt für nicht druckbare Zeichen (wie 0x0B, die eine Registerkarte ist) funktionieren.

Aber jetzt werden Sie sich fragen: Warum funktioniert das für z.B. E-Mails? Einfach: Weil diese Zeichen in eine ASCII-Darstellung konvertiert werden. Bitte google ein bisschen nach Base64-Kodierung.

Alternativ können Sie Ihre verschlüsselten Zeichen immer in eine Datei streamen und später davon zurücklesen. Auf diese Weise umgehen Sie die Einschränkungen Ihrer Konsole.

Btw: Bitte werfen Sie einen Blick auf die Dokumentation von printf() und Sie werden wissen, warum Sie diese negativen Werte erhalten.

Verwandte Themen