首页 > 解决方案 > C 加密和解密中的凯撒密码,ASCII 值太高

问题描述

我正在研究 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");
}

标签: cencryptioncaesar-cipher

解决方案


“%”运算符的优先级高于“+”。因此,它首先应用于表达式的结果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;

推荐阅读