2016-05-15 5 views
2

asciiテーブル番号の代わりに暗号化中にアルファベット順を使用するにはどうすればよいですか?たとえば、タイムパッドの暗号化(テキスト+キー)をmodulo26で1つ使用したい場合、ASCII番号を取っているようです。 私はC言語で、次を試してみました:asciiの代わりにアルファベット順のローカル番号を使用する方法

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

しかし、cmdは私の代わりに、暗号文の多くの疑問符を示しています。ここで は私の完全なコードです:

#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

だから、char型の26% – stark

+1

を使用し、私は26 – user105453

+1

文字%を書いたあなたは、テーブルまたはタプルを使用してもらえますか? '{{a、1}、{b、2} ...'またはインデックスを使用する配列さえあります。 –

答えて

2

あなたは下ケースのみを使用していると仮定すると、あなたは0-25の間の値にテキストとキーをオフセットして変換アスキーを減算して、暗号化処理を行うことができますし、最後にオフセットを追加します。

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

そして、あなたのコードでは、2つのcharポインタのためのメモリが割り当てられていません。

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

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

私はこれらのコード行をどこに置くべきですか? – user105453

+1

あなたの暗号化機能では? –

+1

私はそれを試しました、それは常に私に与えます@ – user105453

関連する問題