包装操作麻烦

时间:2012-10-19 03:46:14

标签: c

我很难理解如何让包装器使用这些加密程序。我有一个Caesar密码程序来加密和解密,现在我正在研究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然后一个26 mod -63给我负面11.这显然是不对的因为等于54当你添加65和负11时。

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

1 个答案:

答案 0 :(得分: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

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

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