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

时间:2014-04-04 00:23:38

标签: c vigenere

我试图在C中制作一个Vigenere密码并且我做了一些错误的事情我无法修复它...如何理解出错的地方?好吧,我有一些像Vigenere密码的关键字和结果密码的例子,如

  • keyword:bacon
  • text: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(&#34; \ n&#34);

返回0; }

2 个答案:

答案 0 :(得分: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); ,然后仅在纯文本包含字母字符时才会递增。以下行将计算关键字的正确索引。

i

唯一的区别是kk取代而{{1}}仅在纯文字具有字母字符时递增。

答案 1 :(得分:0)

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

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

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