我很难理解如何让包装器与这些加密程序一起工作。我得到了一个凯撒密码程序来加密和解密,现在我正在研究一个 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”。我显然做错了什么,但我一直在研究解决方案一段时间,并不断得出相同的结果。