0

我很难理解如何让包装器与这些加密程序一起工作。我得到了一个凯撒密码程序来加密和解密,现在我正在研究一个 Vigenere 密码。我的程序可以运行,但是当我使用会导致字母环绕的键时,我会得到奇怪的结果。这是我正在使用的代码:

int main(int argc, char *argv[])
{
    char s2[25];
    strcpy(s2, argv[1]);
    printf("Please enter a string of text to be encrypted!\n");
    string p = GetString();
    for (int i = 0, n = strlen(p); i < n; i++)
    {
        if (isupper(p[i])){

        char c = (p[i] - 'A' + s2[i]);
        printf("%c", c);
        }
    }
    printf("\n");

}

如果命令行输入是./program BACON并且我为要加密的文本输入 BLAH,则此代码将起作用。例如,如果我./program ZZZZZ用作键,那么我会得到各种奇怪的结果,因为它不会回绕。我已经尝试使用模数运算符并将其从我刚刚发布的代码中删除,因为我仍然无法使用它来包装它。我刚开始学习编程。

更新

也许您可以帮助我更好地理解数学;您的代码运行良好,但我一直试图在计算器上手动解决这个问题,只是为了看看发生了什么。这是我到目前为止所拥有的:

./program HHHHH

在我的理解中,keyLen 应该等于 5,所以如果我给 p[i] 一个值“H”

keyLen= 5
p[i]= H   //or 72 in ASCII 
int sum = (p[i] - 'A') + (s2[i % keyLen] - 'A'); //sum = (72 - '65') + ([72 % 5] - '65');
char c = 'A' + sum%26; // c = 65 + -11

也许我的数学很差,因为当我按顺序做事时,我认为它们应该完成 sum = 负 63 和 -63 的 26 mod,这给了我负 11。这显然是不正确的,因为当你添加时等于 54 65 和负 11。

即使我将负 11 设为 11 的正整数并加上 65,我也会得到 76,即 ASCII 字符“L”,但正确答案是“O”。我显然做错了什么,但我一直在研究解决方案一段时间,并不断得出相同的结果。

4

1 回答 1

2

您的程序中有两个“环绕”问题:

  • 当键和当前字母组合产生超过 26 的值时,您的字母不会环绕,并且
  • 当被加密的单词的长度超过密钥的长度时,您会读到密钥的末尾。

以下是您修复它的方法:在将密钥复制到 之后s2,立即执行以下操作:

int keyLen = strlen(s2);

现在在你的循环中这样做:

int sum = (p[i] - 'A') + (s2[i % keyLen] - 'A'); // Calculate the sum of key+word
char c = 'A' + sum%26; // Wrap around at 26, the number of letters in the alphabet

这将使输出看起来“正常”。

一旦你弄清楚最后一个公式是如何工作的,你应该能够修改它来解码这个词。

于 2012-10-19T03:56:45.907 回答