c - 维吉尼亚密码《黑鹰坠落》

标签 c cs50 vigenere

我不明白为什么这个东西不能正确打乱。我读了一些关于这个密码的其他帖子,据我所知,我使用的算法与它们完全相同......

注释掉的区域是我试图确保一切都正确通过的测试。我相信一切都会正确完成,然后在算法中失败。

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

string get_message(void);
string scramble(string key, string message);

int main(int argc, string argv[])
{
    if(argc == 2)
    {
        string key;
        string message;

        key = argv[1]; 
        //printf("KEY: %s<<",key); 
        message = get_message();
        scramble(key, message);
    }
    else
    {
        printf("Please enter 2 arguments.\n");
        return 1;
    }
}

string get_message(void)
{   
    string message = "";
    do
    {
        message = GetString();
    }
    while(strlen(message) < 1);
    return message;
}

string scramble(string key,string message)
{       
    for(int i = 0, len = strlen(message), key_len = strlen(key); i < len; i++)
    {   
        int letter = message[i];
        //int Tkey = atoi(key[i % key_len]); 
        //printf("KEY: %d<<\n",Tkey);

        if(islower(letter))
        {
            //printf("KEY(%d)",(key[i % key_len]-97));
            letter = (((letter - 97) + (key[i % key_len])) % 26 + 97);
            //printf("(%d)",(letter - 97) + (key[i % key_len])%26);
            printf("%c",letter);
        }       
        else if(isupper(letter))
        {
            //printf("(%d)", key[i]);
            //printf("(%c)",letter); WE HAVE CORRECT LETTER
            letter = (((letter - 65) + (key[i % key_len])) % 26 + 65);
            printf("%c",letter);
        }
    }
    printf("\n");
    return 0;
}

最佳答案

我认为你的计算是错误的:

您目前拥有

encryptedLetter = (letter - firstLetterOffset) + key[position % keyLength] % 26 + firstLetterOffset

通过检查 C operator precedence table我们注意到 %-+ 之前计算,这意味着您的代码实际上意味着:

encryptedLetter = (letter - firstLetterOffset) + ( key[position % keyLength] % 26 ) + firstLetterOffset

你想要的地方:

encryptedLetter = ( (letter - firstLetterOffset) + key[position % keyLength] ) % 26 + firstLetterOffset

结论:您需要添加更多括号来指定计算表达式的顺序。

<小时/>

此外,您获取了文本字符的字母数字,但没有获取 key 的字母数字!

正确表达

encryptedLetter = ( (letter - firstLetterOffset) + key[position % keyLength] - firstLetterOffset ) % 26 + firstLetterOffset

Demonstration in javascript

关于c - 维吉尼亚密码《黑鹰坠落》,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29319393/

相关文章:

c - 如果 vector 太大,我的程序会崩溃吗?

c - 在 Windows 控制台中更新一行

C - 我的贪婪算法不起作用 CS50x

c - 维吉尼亚密码逻辑错误

CS50 维吉尼亚密码给出错误的输出

C - 开始一个大项目。文件/目录结构和名称。需要好的例子

c - 警告 : initialisation from incompatible pointer type via function table in c

c - 即使在代码的前面声明了变量,也会出现“未声明的标识符”错误

c - 如何在不循环打印 "error"消息的情况下运行它

c++11 - c++ 中的 vigenere 密码