什么与我的Vigenere密码无法正常工作?

问题描述 投票:-1回答:2

我正在尝试用C制作一个Vigenere密码,我做了一些错误的事情,我无法修复它......怎么理解出错了?好吧,我有一些关于Vigenere密码的关键字和结果密码的例子

  • 关键字:bacon
  • 文字:Meet me at the park at eleven am
  • 正确的结果:Negh zf av huf pcfx bt gzrwep oz
  • 我的代码结果使用相同的文本和关键字:Tegh ne og tjs qaty bt syfvgb bm

码:

int main(int argc, string argv[])
{
    string keyWord;

    if( argc != 2  )
    {
        printf("Wrong Argument");
        return 1;
    }
    else
    {
        keyWord = argv[1]; 
        //check if argument is 
        //only alphabetical characters
        for(int i = 0; i < strlen(keyWord); i++)     
        {
            char c = keyWord[i];
            if( !isalpha(c) )
            {
                printf("Your Keyword Must Contain Only alphabetical characters\n");
                return 1;
            }
        }
    }
    //todo
    printf("Enter Plain Text\n");
    string plainText = GetString(); 
    for(int i = 0; i < strlen(plainText); i++) 
    {
        char c = plainText[i];
        int keyWordWrapper;
        char keyC;
        if(isalpha(c))
        {
            keyWordWrapper = i % strlen(keyWord);
            keyC = keyWord[keyWordWrapper];

            if(islower(c))
            {
                int key = keyC - 'a';
                c = (c - 'a'  + key) % 26 + 'a'; 
            }
            if(isupper(c))
            {
                int key = keyC - 'A';
                c = (c - 'A'  + key) % 26 + 'A'; 
            }
        }
        printf("%c",c);
    }
    printf("\n");
    return 0;
}

GetString()在标题中声明并在我正在使用的库中定义(就像scanf)。

这是更新的代码

int main(int argc, string argv[])

{string keyWord;

 if( argc != 2  )
{
    printf("Wrong Argument");
    return 1;

}
else
{
    keyWord = argv[1]; 

    //check if argument is 
    //only alphabetical characters
    for(int i = 0; i < strlen(keyWord); i++)     
    {
        char c = keyWord[i];
        if( !isalpha(c) )
        {
            printf("Your Keyword Must Contain Only alphabetical characters\n");
            return 1;
        }  


    }
}

string plainText = GetString(); 

int j;
for(int i = 0; i < strlen(plainText); i++) 
{
    j++;
    char c = plainText[i];
    int keyWordWrapper;
    char keyC;

    if(j > strlen(keyWord))
        j = 0;


    if(isalpha(c))
        {
            keyWordWrapper = i % strlen(keyWord);
            keyC = keyWord[keyWordWrapper];
            int key;
            tolower(c);

            if(islower(keyC))
             key = keyC - 'a';

            if(isupper(keyC))
             key = keyC - 'A';


            c = (c - 'a'  + key) % 26 + 'a'; 




        } 

    printf("%c",c);

}

printf(“en”);

返回0; }

c vigenere
2个回答
2
投票

代码中有两个问题。

首先是关键字中大写字母的处理。请注意,在一种情况下,代码从keyC中减去a,并在其他A中减去。但这是基于纯文本字符的情况。该减法需要基于关键字中字母的大小写。

其次,代码前进到纯文本中每个字符的关键字中的下一个字符。如果纯文本字符是space字符,则“正确结果”不会前进到关键字的下一个字符。

这是我正在讨论的第二个问题的一个例子

text  Meet me at
keyC  baco nb ac
i     0123456789    i must always increment to the next char in plain text
k     0123 40 12    index into the keyword does not increment on non-alpha

因此k不能直接从i用线计算

keyWordWrapper = i % strlen(keyWord);

相反,k需要初始化为0,然后仅在纯文本包含字母字符时才递增。以下行将计算关键字的正确索引。

keyWordWrapper = k % strlen(keyWord);

唯一的区别是ik取代,而k仅在纯文本具有字母字符时递增。


0
投票

您应该将键转换为全部小写(或全部大写),然后在两个shift块中使用相同的表达式:

int key = keyC - 'a';  // Or 'A' if you convert to upper

你应该从strlen(plainText)循环的条件中删除for;它将线性算法转换为二次算法。

© www.soinside.com 2019 - 2024. All rights reserved.