我很难理解如何让包装器使用这些加密程序。我有一个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”。我显然做错了什么,但我一直在研究解决方案一段时间,并不断提出相同的结果。
答案 0 :(得分:2)
您的计划中有两个“环绕”问题:
以下是修复方法:将密钥复制到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
这将使输出看起来“正常”。
一旦你弄清楚最后一个公式是如何工作的,你应该能够修改它来解码这个词。