2016-05-15 2 views
2

Comment puis-je utiliser l'ordre alphabétique pendant le cryptage au lieu des numéros de table ascii? Par exemple, si je veux utiliser un cryptage à un temps (texte + clé) modulo26, il semble prendre un numéro ASCII. Je essayé ce qui suit en langage C:Comment utiliser le numéro de commande alphabétique local au lieu de ascii

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

Mais le cmd me montre beaucoup de points d'interrogation au lieu d'un texte chiffré. Voici mon code complet:

#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

Il faut donc utiliser ombles% 26 – stark

+1

I Wrote ombles% 26 – user105453

+1

Pouvez-vous utiliser une table ou tuples? '{{a, 1}, {b, 2} ...' Ou même juste un tableau où vous utilisez l'index. –

Répondre

2

En supposant que vous travaillez uniquement avec les minuscules, vous pouvez soustraire le ascii offset et convertir le texte et la clé à une valeur entre 0-25 puis faire le processus de cryptage et ajoutez le décalage à la fin.

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

Et aussi dans votre code vous n'avez pas de mémoire allouée pour les 2 pointeurs de char.

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

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

merci. Où devrais-je placer ces lignes de code ?? – user105453

+1

Dans votre fonction de cryptage? –

+1

J'ai essayé cela, il me donne toujours @ – user105453