我目前正在开发一个程序,通过用自定义预设字母替换特定字母来加密(使用凯撒密码)用户输入的字符串。比如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/