Vigenere-cipher错误输出

时间:2016-03-27 17:50:45

标签: c cryptography vigenere

我必须编写Vigenere密码,但我的输出看起来有点不同。

输入: Po treti raz sa ohlasi 关键: euhwa

输出:TI ANEXC YWZ WU VDLEMP 我得到了什么: TI ANEDM LHV SK SBSWSS

你能帮我找一下,为什么它不能正常工作?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char* vigenere_encrypt(const char* key, const char* text) 
{
    if(key==NULL || text==NULL)
        return NULL;

    int i,k,t,j=0;
    t = strlen(text);
    k = strlen(key);

    char* copy=(char*)malloc(strlen(text)+1);
    char* enc=(char*)malloc(strlen(text)+1);
    char* copykey=(char*)malloc(strlen(key)+1);

    for (i=0;i<k;i++)
    {
        copykey[i]=toupper(key[i]);
    }

    for (i=0;i<k;i++)
    {
        if(!(isalpha(copykey[i])))
        {
            free(copy);
            free(copykey);
            free(enc);
            return NULL;
        }
    }

    for (i=0;i<=t;i++)
    {
        copy[i]=toupper(text[i]);
    }

    for (i=0;i<=t;i++)
    {
        if (isupper(copy[i]))
        {
            enc[i]=(copy[i]+copykey[j])%26+'A';
            j++;
            if (j>k)
                j=0;
        }
        else enc[i]=copy[i];
    }

    free(copy);
    free(copykey);
    return enc;
}

int main()
{
    char* encrypted;
    encrypted = vigenere_encrypt("euhwa","Po treti raz sa ohlasi!");
    printf("%s\n",encrypted);
    free(encrypted);
}

1 个答案:

答案 0 :(得分:0)

问题在于你如何处理:

  

“嘿,我已经完成了密钥,让我们把j带回零”

现在,代码非常混乱,不是双重复制/粘贴(可能会发生),而是因为它可以(并且应该)优化一点......

无论如何,您的问题的解决方案很简单:

jj >=时,您应将k设为零。重要的是equal部分,因为当你达到密钥的长度时你希望它为0。你这样做的方式(只测试greater than)意味着当你到达密钥的末尾时,你会做一个使用无效copykey值的额外循环..如果密钥长度等于5你应该停在copykey[4]但是额外的循环copykey[5]无效......而且(不)幸运的是它不会segfault你到地狱。

for (i=0;i<=t;i++)
{
    if (isupper(copy[i]))
    {
        enc[i]=(copy[i]+copykey[j])%26+'A';
        j++;
        if (j >= k)
            j=0;
    }
    else enc[i]=copy[i];
}