2016-05-14 26 views
-1

Ich habe einige Probleme mit meinem alten Code behoben.Das Problem ist jetzt, wenn ein Chiffretext entschlüsselt bereits verschlüsselt mit meinem Programm gibt es ein Wort mit einem anderen Buchstaben als das Original, also Wort -> verschlüsselt ... dann verschlüsselt-> entschlüsselt gibt entschlüsselt! = Wort, und selbst auf dem Papier sollte der Geheimtext anders sein als der, den ich bekomme. Und eine andere Sache: Ich versuchte, do {...} while (strlen (..., ...)! = 0), aber es funktioniert nicht und versuchte zu vergleichen sizeof funktioniert auch nicht. Wie sollte ich die Länge des Schlüssels mit dem Wort vergleichen?Verschlüsselung-Entschlüsselung-Fehler (eine Zeit-Pad-Verschlüsselung)

Hier ist mein neuer Code xor:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#define clear_buffer while(getchar()!='\n'); 
char* encrypt(char texte[],char cle[]){ 
    char *encrypted; 
    int i=0; 
    while(texte[i]!='\0' && cle[i]!='\0'){ 
    if (texte[i] >= 'A' && texte[i] <= 'Z') 
    encrypted[i] = ((texte[i] - 'A')^(cle[i] - 'A')) % 26 + 'A'; 
else if (texte[i] >= 'a' && texte[i] <= 'z') 
    encrypted[i] = ((texte[i] - 'a')^(cle[i] - 'a')) % 26 + 'a'; 
     i++; 
    } 
    encrypted[i+1]='\0'; 
    return encrypted; 

    } 
char* decrypt(char encrypted[],char cle[]){ 
    char *decrypted; 
    int i=0; 

    while(encrypted[i]!='\0' && cle[i]!='\0'){ 
    if (encrypted[i] >= 'A' && encrypted[i] <= 'Z') 
    decrypted[i] = ((encrypted[i] - 'A')^(cle[i] - 'A')) % 26 + 'A'; 
else if (encrypted[i] >= 'a' && encrypted[i] <= 'z') 
    decrypted[i] = ((encrypted[i] - 'a')^(cle[i] - 'a')) % 26 + 'a'; 
     i++; 
    } 
    decrypted[i+1]=0; 
    return decrypted; 

} 
int main() 
{ 
    char reponse,texte[100],cle[100],encrypted[100]; 
    int i=0; 

    do{ 
     printf("Voulez vous crypter ou decrypter un texte?(Ecrire C pour crypter et D pour decrypter)\n"); 
     scanf("%c",&reponse); 
    }while (reponse!='C'&& reponse!='D'&& reponse!='c'&& reponse!='d');//controle pour obliger l'utilisateur à donner c ou d 
    if(reponse=='C'||reponse=='c'){ 
      clear_buffer;//vider le buffer apres le scanf de la reponse 
       //do{ 
     printf("Donner un texte a crypter\n"); 
     fgets(texte,100,stdin); 
     while(texte[i]!=0) 
      i++; 
     if (i>0 && texte[i-1]!='\n') 
      clear_buffer; 
     printf("Donner une cle de meme taille\n"); 
     fgets(cle,100,stdin); 
      //}while(sizeof texte!=sizeof cle); 
     i=0; 
     while(cle[i]!=0) 
      i++; 
     if (i>0 && cle[i-1]!='\n') 
      clear_buffer; 
     printf("Le texte crypte est:%s\n",encrypt(texte,cle)); 
    }else{ 
      clear_buffer;//vider le buffer apres le scanf de la reponse 
     // do{ 
     printf("Donner un texte (deja crypte) à decrypter\n"); 
     fgets(encrypted,100,stdin); 
     i=0; 
     while(encrypted[i]!=0) 
      i++; 
     if (i>0 && encrypted[i-1]!='\n') 
      clear_buffer; 
     printf("Donner la cle (deja utilisee pour crypter\n"); 
     fgets(cle,100,stdin); 
     i=0; 
     while(cle[i]!=0) 
      i++; 
     if (i>0 && cle[i-1]!='\n') 
      clear_buffer; 
     //}while(sizeof encrypted!=sizeof cle); 
     printf("Le texte decrypte est:%s\n",decrypt(encrypted,cle)); 
    } 
    system("pause"); 
    return 0; 
} 
+2

* Bitte * erwägen Sie die Verwendung von Code-Formatierungsstandards, indem Sie Ihren Code entsprechend einrücken. Ihr Code ist sehr schwer zu lesen. Google "C Coding Standards", wenn Sie ein paar Ideen haben möchten. Wenn Sie Linux ausführen, können Sie den Code mit dem 'Einzug'-Befehl (siehe' man indent') nach dem Faktum automatisch einrücken. Durch die Einhaltung guter Standards können Sie auch Ihrem eigenen Code folgen, der das Debuggen und Modifizieren erleichtert. Beachten Sie, dass die Stackoverflow.com-Fragebereiche Registerkarten nicht sehr gut unterstützen. Leerzeichen werden stattdessen empfohlen. – lurker

+1

Ich habe gerade 'Einzug' auf Ihrem Code für Sie ausgeführt. :) – lurker

+0

Vielen Dank lurker :) – user105453

Antwort

1

Das Problem ist Scanf eine neue Zeile in dem Puffer für die ersten fgets links zu begegnen. Verwenden Sie scanf nicht für die Tastatureingabe. So liegt der Wahnsinn.

Auch diese Linie

encrypted = (texte[i] + cle[i]) % 26; 

ist Art und Weise falsch. Überlegen Sie, was Sie zu tun versuchen. Vielleicht folgendes:

if (texte[i] >= 'A' && texte[i] <= 'Z') 
    encrypted = (texte[i] - 'A' + cle[i] - 'A') % 26 + 'A'; 
else if (texte[i] >= 'a' && texte[i] <= 'z') 
    encrypted = (texte[i] - 'a' + cle[i] - 'a') % 26 + 'a'; 

Mit der gleichen Änderung für entschlüsselt. Normalerweise ist es eine schlechte Idee verschlüsselter Text zu ermöglichen bedruckbaren in diesen Tagen zu sein, aber ...

EDIT: Hinzugefügt - ‚A‘ und - ‚a‘ sowohl cle [i]

+0

Danke. Ich habe meinen Code geändert. aber immer noch zeigt Programm nicht reagiert :( – user105453

+0

Sie haben wahrscheinlich mehr Probleme. Verwenden printf liberal, um herauszufinden, wo es aufhängt. – Joshua

0

Sie überschreiben die Wert der verschlüsselten Daten jedes Mal, wenn sich "i" ändert. Sie können das Problem beheben, indem als Zeiger oder eine Tabelle verschlüsselt Deklarieren:

if (texte[i] >= 'A' && texte[i] <= 'Z') 
    encrypted[i] = (texte[i] - 'A' + cle[i] - 'A') % 26 + 'A'; 
else if (texte[i] >= 'a' && texte[i] <= 'z') 
    encrypted[i] = (texte[i] - 'a' + cle[i] - 'a') % 26 + 'a';` 

und wenn Sie planen, XOR zu verwenden, wird es so geworden: char encrypted[100];

Code werden sollte

if (texte[i] >= 'A' && texte[i] <= 'Z') 
    encrypted[i] = ((texte[i] - 'A')^(cle[i] - 'A')) % 26 + 'A'; 
else if (texte[i] >= 'a' && texte[i] <= 'z') 
    encrypted[i] = ((texte[i] - 'a')^(cle[i] - 'a')) % 26 + 'a';` 

Ich habe einige zusätzliche Klammern zur Verdeutlichung verwendet.

Hoffentlich würde das helfen.

+0

Vielen Dank :) – user105453

+0

Ich ersetzte den alten Code mit dem neuen. Es gibt jetzt lesbare Buchstaben. Aber wenn Sie versuchen, ein verschlüsseltes Wort zu entschlüsseln, gibt es nicht das ursprüngliche Wort (es gibt etwas anderes: Btw es verwendet auch Symbole nicht nur Buchstaben) – user105453

+0

Ihre Methode der Verschlüsselung und Entschlüsselung ist nicht optimal. Versuchen Sie nicht, die (text + key) und (text - key) Technik zu verwenden, sondern den Xor. Es funktioniert wie folgt: Klartext^Schlüssel = verschlüsselter Text und verschlüsselter Text^Schlüssel = Klartext. Wenn Sie immer noch Fehler bekommen, versuchen Sie es mit printf nach jeder Befehlszeile, damit Sie Schritt für Schritt prüfen können. – Mincer