包括凯撒密码中的所有可打印字符(ascii 32-126)

Include all printable characters in caesar cipher (ascii 32-126)

我正在寻找包含常见 ASCII 可打印字符(字符代码 32-126)的凯撒密码。

我当前的代码:

private static char Cipher(char ch, int key)
{
    if (!char.IsLetter(ch))
        return ch;

    char offset = char.IsUpper(ch) ? 'A' : 'a';
    return (char)((((ch + key) - offset) % 26) + offset);
}
public static string Encipher(string input, int key)
{
    string output = string.Empty;
    foreach (char ch in input)
        output += Cipher(ch, key);

    return output;
}
public static string Decipher(string input, int key) {return Encipher(input, 26 - key);}

(来源:https://www.programmingalgorithms.com/algorithm/caesar-cipher/

我想我至少需要改变

if (!char.IsLetter(ch)) *and* return Encipher(input, 26 - key);

if (char.IsControl(ch)) *and* return Encipher(input, 94 - key);

并将模数 26 更改为 94(?) 但还需要做什么?我假设随机数生成器(这是一次性一密实现)也需要更改为 0-93(或者 ??)。然而,测试这给了我错误并且没有使输出与输入相同。也许我还需要进行 isLetter 检查,因此 isUpper 检查不会因非字母而失败。我还缺少什么?

private static char Cipher(char ch, int key)
        {
            if (char.IsControl(ch))
                return ch;

            char offset = ' ';
            return (char)((((ch + key) - offset) % 95) + offset);
        }
        public static string Encipher(string input, int key)
        {
            string output = string.Empty;

            foreach (char ch in input)
                output += Cipher(ch, key);

            return output;
        }

        public static string Decipher(string input, int key)
        {
            return Encipher(input, 95 - key);
        }