您应该编写一个方法来接受
char
数组,并获取高级索引处的元素。你可以使用模(
%
)操作员推进和包裹,例如。
private static char GetCharWithStepAndWrap(char[] chars, char ch, int step)
{
var index = Array.IndexOf(chars, ch);
index += step;
index %= chars.Length;
return chars[index];
}
添加
step
值将推进索引,可能超过数组的末尾。然后,模将把索引除以
Length
并使用余数。这意味着,如果索引在数组中开始,它将停留在原来的位置,如果它超过了数组的末尾,则实际上减去了
长
从开始到结束。
然后,您可以将该方法与
烧焦
数组来自
a
到
z
加密,然后简单地反转数组进行解密,例如。
static void Main(string[] args)
{
var chars = Enumerable.Range(Convert.ToInt32('a'), 26).Select(Convert.ToChar).ToArray();
var plainText = "Dinindu-12Z";
var encryptedText = string.Empty;
for (var i = 0; i < plainText.Length; i++)
{
var ch = plainText[i];
if (char.IsLetter(ch))
{
var isUpper = char.IsUpper(ch);
ch = char.ToLower(ch);
ch = GetCharWithStepAndWrap(chars, ch, 5);
if (isUpper)
{
ch = char.ToUpper(ch);
}
}
encryptedText += ch;
}
Console.WriteLine(encryptedText);
Array.Reverse(chars);
var decryptedText = string.Empty;
for (var i = 0; i < plainText.Length; i++)
{
var ch = encryptedText[i];
if (char.IsLetter(ch))
{
var isUpper = char.IsUpper(ch);
ch = char.ToLower(ch);
ch = GetCharWithStepAndWrap(chars, ch, 5);
if (isUpper)
{
ch = char.ToUpper(ch);
}
}
decryptedText += ch;
}
Console.WriteLine(decryptedText);
}
如果您尝试该代码,您会注意到正确的加密文本是“Insnsiz-12E”。