【问题标题】:Caesar encryption program doesn't produce the expected ciphertext凯撒加密程序不会产生预期的密文
【发布时间】:2013-04-24 18:16:45
【问题描述】:

我是 c 新手,我正在编写一个程序,该程序将使用 Caesar cipher 加密文本文件。每当我运行它时,它只会将字母转换为 SOH 字符。

加密.c

char *lowerAlpha= "abcdefghijklmnopqrstuvxxyz";
char *upperAlpha= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int encrypt(int c, int amount)
{
    char* alpha;
    int retVal = c;
    int i;

    if(isalpha(c))
    {
        if(islower(c))
        {
            alpha = lowerAlpha;
            i = (c - 'a' - amount) % 26;
            retVal = alpha[i];

        }
        else if(isupper(c))
        {
            alpha = upperAlpha;
            i = (c -'A' - amount) % 13;
            retVal = alpha[i];
        }
    }
    return retVal;
}

在另一个我使用主要方法的文件中

encryptFile(inputfile, outputfile, 13);

【问题讨论】:

  • 你忘了说“引用-取消引用加密”
  • while( (c = fgetc(inputF)) != EOF)中的建议括号
  • 我在看 13 是否可行,因为 26 行不通。将括号添加到 while 循环摆脱了 SOH,但现在它什么也不写了。
  • 尝试打印 ((-3) % 2) (作为整数)。
  • 我把它放在哪里,我在找什么?

标签: c encryption


【解决方案1】:

您在加密期间减去 'A''a' 以将字符值转移到 0 .. 25 范围内,并且您永远不会添加任何东西来将它们重新转换为字母。

【讨论】:

  • 不会 retVal = alpha[i] 根据以 13 为模式的移位值获取新字符吗?
  • @user2337029 从技术上讲,是的。但是,该“字符”可能超出可打印 ASCII 字符的范围。问问自己这个问题——如果我在看到c - 'a' - amount 时正在使用字符“a”,结果是什么(我认为在你的具体情况下是-13)。确保您了解 C 在给定负数时对 % 运算符的作用——这可能不是您所期望的。而-13 在转换为 8 位无符号字符时将是 243 - 超出 ASCII 范围,但如果您的字符集是 ISO-8859 或其他内容,可能会显示一些内容......
  • 感谢您指出这一点,这让我意识到我的加密算法错误,应该是 c - 'a' + amount
猜你喜欢
  • 1970-01-01
  • 2014-03-07
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多