2016-05-15 16 views
2

Wie kann ich die alphabetische Reihenfolge während der Verschlüsselung anstelle von ASCII-Tabellennummern verwenden? Zum Beispiel, wenn ich eine Zeitblockverschlüsselung (Text + Schlüssel) modulo26 verwenden möchte, scheint es ASCII-Nummer zu nehmen. habe ich versucht, die folgende in C-Sprache:Verwendung der lokalen alphabetischen Bestellnummer anstelle von ASCII

encrypted[i] = (text[i]+key[i])%26 

Aber die cmd mir viele Fragezeichen anstelle eines Chiffretext angezeigt wird. Hier ist meine komplette Code:

#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; 
    texte=texte-'a'; 
    cle=cle-'a'; 
    while(texte[i]!='\0' && cle[i]!='\0'){ 
     encrypted[i]='a'+(texte[i]+cle[i])%26; 
     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'){ 
     decrypted[i]=(encrypted[i]-cle[i])%26; 
     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 
     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); 
     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; 
} 
+1

So char% 26 – stark

+1

verwenden ich geschrieben habe char% 26 – user105453

+1

Könnten Sie eine Tabelle oder Tupeln verwenden? '{{a, 1}, {b, 2} ...' Oder nur ein Array, in dem Sie den Index verwenden. –

Antwort

2

Unter der Annahme, dass Sie nur mit Kleinbuchstaben arbeiten, können Sie die ascii-Offset und wandeln den Text und Schlüssel auf einen Wert zwischen 0-25 und dann den Verschlüsselungsprozess zu tun subtrahieren und addiere den Offset am Ende.

text = text - 'a'; 
key = key - 'a'; 
char encrypt = 'a' + (text + key) % 26 

Und auch in Ihrem Code haben Sie nicht Speicher für die 2 Zeichen Zeiger zugewiesen.

char *encrypted = (char*)malloc(100); 

char *decrypted = (char*)malloc(100); 
+1

danke. Wo sollte ich diese Codezeilen platzieren? – user105453

+1

In Ihrer Verschlüsselungsfunktion? –

+1

Ich habe es versucht, es gibt mir immer @ – user105453