c# - 凯撒密码如何同时替换多个字母?

标签 c# encryption replace caesar-cipher

我目前正在开发一个程序,通过用自定义预设字母替换特定字母来加密(使用凯撒密码)用户输入的字符串。比如A=R, B=T, C=O等

当前程序:

using System;
class Program
{
    static void Main(string[] args)
    {
        String decryptedInput = Console.ReadLine().ToUpper();
        String encryptedOutput = decryptedInput.Replace("A", "R")
                                        .Replace("B", "B")
                                        .Replace("C", "T")
                                        .Replace("D", "O")
                                        .Replace("E", "P")
                                        .Replace("F", "M")
                                        .Replace("G", "Z")
                                        .Replace("H", "S")
                                        .Replace("I", "J")
                                        .Replace("J", "K")
                                        .Replace("K", "I")
                                        .Replace("L", "Y")
                                        .Replace("M", "P")
                                        .Replace("N", "G")
                                        .Replace("O", "L")
                                        .Replace("P", "V")
                                        .Replace("Q", "C")
                                        .Replace("R", "X")
                                        .Replace("S", "N")
                                        .Replace("T", "E")
                                        .Replace("U", "H")
                                        .Replace("V", "F")
                                        .Replace("P", "A")
                                        .Replace("X", "U")
                                        .Replace("Y", "Q")
                                        .Replace("Z", "D");
        Console.WriteLine(encryptedOutput);
        Console.ReadKey();
    }
}

我确实得到了输出,但是有一些加密错误。问题是,由于代码行彼此相继运行,因此已经转换的字母会再次转换。

例如:字母“A”被加密/转换为“R”。当程序到达字母“R”时,该字母再次被加密/转换并最终成为“X”,稍后在代码中被转换为“U”。几乎每个字母都会发生这种情况,然后我得到一个我永远无法解密的加密文本。

有没有什么办法可以同时替换所有字母,或者你会推荐我使用另一个函数吗?

最佳答案

就像其他人提到的那样,您多次替换了一些字符。这可能不是期望的行为:

eg: A -> R -> X -> U

此外,这些行似乎有错字:

.Replace("V", "F")
.Replace("P", "A")   // should this be W->A ?
.Replace("X", "U")

所有这些都可能导致了您的问题。

为了防止这种情况,只需进行一次替换字符串即可:

// build up character mappings for decryption
const string EncryptedLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const string DecryptedLetters = "RBTOPMZSJKIYPGLVCXNEHFAUQD";
var decryptionMapping = EncryptedLetters.Zip(DecryptedLetters, Tuple.Create)
    .ToDictionary(x => x.Item1, x => x.Item2);

// decrypt the message
var encryptedMessage = "CTHC";
var decryptedMessage = encryptedMessage
    .Select(x => decryptionMapping[x])
    .Aggregate(new StringBuilder(), (sb, x) => sb.Append(x), sb => sb.ToString());

关于c# - 凯撒密码如何同时替换多个字母?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53842269/

相关文章:

c# - 不能声明主体,因为它被标记为抽象

c# - "File in use"写入文本文件时出错

security - SSL:客户端如何解密来自服务器的消息

ruby - 作为 NodeJS 用户,如何使用 ruby​​ OpenSSL 库进行加密?

r - 数据框的部分替换/更新

c# - 迭代集合并删除我不想要的集合

python - 我的 Python 凯撒密码程序在 30 后停止移动

JavaScript 正则表达式替换字符串的所有部分,但包含特定字符串的部分除外

r - 尝试替换数据帧列中向量的值时如何避免回收

C# 反射 - 将两个对象合并在一起