我解決了一些與舊代碼有關的問題。現在的問題是解密已經用我的程序加密的密文時,它給出的字母與原始字母不同;因此字 - >加密...然後加密 - >解密給出解密!=字,甚至在紙上密文應該與我得到的不同。 還有一件事:我試過{...} while(strlen(...,...)!= 0),但它不工作,並試圖比較sizeof也無法正常工作。我應該如何比較關鍵字與單詞的長度?加密解密錯誤(一次性密碼加密)
這是我的新代碼使用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;
}
*請考慮使用合適的代碼格式標準。你的代碼很難閱讀。谷歌「C編碼標準」,如果你想要一些想法。如果你正在運行Linux,你可以使用'indent'命令(見'man indent')在事實之後自動縮進你的代碼。遵循良好的標準將幫助您遵循自己的代碼,這有助於調試和修改。請注意,Stackoverflow.com問題區域不支持標籤。建議使用空格。 – lurker
我剛剛在你的代碼上運行'indent'。 :) – lurker
非常感謝你lurker :) – user105453