gpt4 book ai didi

c - 包装机操作麻烦

转载 作者:行者123 更新时间:2023-11-30 14:23:20 25 4
gpt4 key购买 nike

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

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 = negative 63,所以 -63 的 26 mod 得到负 11。这显然是不对的,因为它等于 54当你加上 65 并负 11 时。

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

最佳答案

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

  • 当按键和当前字母组合产生超过 26 的值时,您的字母不会环绕,并且
  • 当要加密的单词长度超过 key 长度时,您将读取超过 key 末尾的内容。

修复方法如下:将 key 复制到 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

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

一旦弄清楚最后一个公式的工作原理,您应该能够修改它以解码该单词。

关于c - 包装机操作麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12967098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com