【问题标题】:Caesar Cipher in C Encryption & Decryption, ASCII values too highC 加密和解密中的凯撒密码,ASCII 值太高
【发布时间】:2020-04-18 07:21:11
【问题描述】:

我正在为 C 编写加密/解密代码。 虽然我的代码加密和解密足够好,但仍然存在一些错误。 我希望用户输入介于“!”之间(ASCII 值 32)和 '~'(ASCII 值 126),但是,当用户输入具有相当高的偏移量/键值的字符(例如 '~')时,输出在扩展的 ASCII 字符范围内。有什么方法可以强制输出不在扩展字符范围内并且仍然正确解密/加密?

我已经搞砸了更改“密码”的值,但没有太大帮助。

下面是我的代码

    void Encryption(char* OriginalText, int offset) {
    int i = 0;
    int cipher;
    char encrypt;
    printf("Encrypted string: \n");
    while (OriginalText[i] != '\0') {
        if (OriginalText[i] == ' ') {
            encrypt = ' ';
            printf("%c", encrypt);
            i = i + 1;
        }

        cipher = ((int)OriginalText[i] + (offset % 26) % -26);
        encrypt = (char)(cipher);
        printf("%c", encrypt);

        i = i + 1;
    }
    printf("\n");
}

【问题讨论】:

  • 通常的策略是只移动字母并保留所有其他字符。 (顺便说一句,你的if 不应该有一个else 吗?)你也可以在更大的范围内旋转;例如,从 '!' 转移到 '~' 就是 rot47 所做的。在这种情况下,一些字母会变成符号,反之亦然。如果范围是[min, min + n),如果是0 ≤ offset < n,那么new = min + (old - min + offset) % n
  • 您的cipherCaesar cipher 不匹配
  • 这不是你的问题,但代码有缓冲区溢出,例如如果 OriginalText 是"hello "

标签: c encryption caesar-cipher


【解决方案1】:

“%”运算符的优先级高于“+”。 因此,它首先应用于表达式offset % 26 的结果,然后添加到OriginalText[i]

为了解决这个问题,您应该在密码赋值中添加另一对括号:

cipher = (((int)OriginalText[i] + (offset % 26)) % -26);

此外,当您处理 ASCII 字符时,为了安全起见并防止烦人和不需要的错误,您应该将 I/O 视为无符号字符,因此:

unsigned char cipher;
unsigned char encrypt;
...
cipher = ((OriginalText[i] + (offset % 26)) % 26);
encrypt = cipher;

【讨论】:

    【解决方案2】:

    您应该首先将您的字符转换为介于零和字母大小(不包括)之间的索引,即 ABC 的从 0 到 25。然后才进行模加/减。最后,转换回来。最好的方法是简单地执行character - 'a'(当然是在小写字符的情况下)。不要对 ASCII 值本身执行模运算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      相关资源
      最近更新 更多