加密 - 解密错误(一次性密码加密)

时间:2016-05-14 20:04:08

标签: c security encryption xor password-encryption

我修复了旧代码的一些问题。现在的问题是,当用我的程序解密已加密的密文时,它会给出一个字母与原始字母不同的字;所以word->加密...然后加密 - >解密给出解密的!=单词,甚至在纸上,密文应该与我得到的密文不同。 另一件事:我尝试{...} 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;
}

2 个答案:

答案 0 :(得分:1)

问题是scanf在第一个fgets遇到的缓冲区中留下了一个换行符。不要使用scanf进行键盘输入;那种方式就是疯狂。

此外,这一行

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

是错误的。考虑一下你想要做什么。也许如下:

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';

使用相同的解密更改。通常,这些天允许加密文本可打印是个坏主意,但是......

编辑:添加 - 'A'和 - 'a'到cle [i]

答案 1 :(得分:0)

您每次都会覆盖加密数据的价值&#39; i&#39;变化。您可以通过将加密声明为指针或表来解决此问题:char encrypted[100];

您的代码应该成为:

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';`

如果您计划使用XOR,它将会变成这样:

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';`

我使用了一些额外的括号来澄清。

希望这会有所帮助。