c语言 - 我的Vigenere密码无法正常工作?



我正在尝试用 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 charactersn");
                return 1;
            }
        }
    }
    //todo
    printf("Enter Plain Textn");
    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[])

{ 字符串关键字;

 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 charactersn");
            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("");

返回 0;}

代码中有两个问题。

首先是关键字中大写字母的处理。 请注意,在一种情况下,代码从 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

因此,不能直接从i计算k

keyWordWrapper = i % strlen(keyWord);

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

keyWordWrapper = k % strlen(keyWord);

唯一的区别是i被替换为k,并且k仅在纯文本具有字母字符时才递增。

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

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

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

最新更新