C# 解密否定特殊字符,如“!@$%”^&*()";

C# 解密否定特殊字符,如“!@$%”^&*()";,c#,encryption,C#,Encryption,我想知道我如何才能否定这个特殊的角色。 例如,当我为解密文本输入aaa密钥并将3个空格移到后面时,它显示的是^^^^而不是www。我的编码有什么问题吗? 这是我在c语言中的所有代码# static void Main(字符串[]args) { 字符串UserInput=“”; int移位; 换档OBSHIFT=新换档(); Console.WriteLine(“欢迎来到Ceasar轮班计划:”); Console.WriteLine(“******************************

我想知道我如何才能否定这个特殊的角色。 例如,当我为解密文本输入aaa密钥并将3个空格移到后面时,它显示的是^^^^而不是www。我的编码有什么问题吗? 这是我在c语言中的所有代码#

static void Main(字符串[]args)
{
字符串UserInput=“”;
int移位;
换档OBSHIFT=新换档();
Console.WriteLine(“欢迎来到Ceasar轮班计划:”);
Console.WriteLine(“*******************************************”);
WriteLine(“键入要加密的字符串:”);
UserInput=Console.ReadLine();
WriteLine(“您希望转换多少个字符?:”;
shift=int.Parse(Console.ReadLine());
Write(“您的加密字符串是:”);
Console.WriteLine(OBSHIFT.Decrypt(UserInput,-shift));
Console.Read();
}
班次
{
公共字符串解密(字符串密码字符串,int-shift)
{
字符串userOutput=“”;
char[]a=cipherString.ToCharArray();
for(int i=0;i='A'&&c='A'&&c='A'&&c'Z')| |(c>='A'&&c'Z'))
温度=温度+26;
其他的
temp=(int)(a[i]+(shift));
}
其他的
温度=c;
用户输出+=(字符)温度;
}
返回用户输出;
}
}

问题在于这段代码执行实际换档:

if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
{
    temp = (int)(a[i] + shift);
    if ((c >= 'A' && c <= 'Z' && temp > 'Z') || (c >= 'a' && c <= 'z' && temp > 'z'))
        temp = temp + 26;
    else
        temp = (int)(a[i] + (shift));
}
现在,“稍后排序”中的位更容易处理。对于a-z零件,例如:

public string ShiftText(string input, int shift)
{
    // This makes sure the shift is *always* in the range 0-25.
    shift = ((shift % 26) + 26) % 26;

    StringBuilder output = new StringBuilder();
    foreach (char c in input)
    {
        if (c >= 'a' && c <= 'z')
        {
            // We'll sort this later
        }
        else if (c >= 'A' && c <= 'Z')
        {
            // We'll sort this later
        }
        else
        {
            output.Append(c);
        }
    }
    return output.ToString();
}
int shifted = c + shift;
if (shifted > 'z')
{
    shifted -= 26;
}
output.Append((char) shifted);

。。。然后A-Z也是一样,但测试时使用的是“Z”而不是“Z”。是的,这实际上是重复的代码-但它只存在两次,我认为复制比提取更简单。

我建议使用这种类型的代码:

public class Shift
{
    public string Decrypt(string cipherString, int shift)
    {
        var alphabet =
            Enumerable
            .Concat(
                Enumerable.Range((int)'a', 26),
                Enumerable.Range((int)'A', 26))
            .Select(i => (char)i)
            .ToArray();

        var map =
            alphabet
                .Zip(
                    alphabet.Concat(alphabet).Concat(alphabet).Skip(alphabet.Length + shift),
                    (c0, c1) => new { c0, c1 })
                .ToDictionary(x => x.c0, x => x.c1);

        return String.Join("", cipherString.Select(x => map.ContainsKey(x) ? map[x] : x));
    }
}

这三个部分完全不同。(1) 将生成
字母表
。它可以包含任意数量的字符,只要没有重复。(1) 
map
只是一个字典,它通过将字母表映射到通过
shift
字符移位的字母表来构建。(3) 返回由键所在的映射映射映射的输入
cypherString

如果您能提供完整的示例,将非常有用。您几乎已经获得了它,但是添加足够多的内容,以便我们可以复制/粘贴/编译/运行,这将使您更容易获得帮助。
public class Shift
{
    public string Decrypt(string cipherString, int shift)
    {
        var alphabet =
            Enumerable
            .Concat(
                Enumerable.Range((int)'a', 26),
                Enumerable.Range((int)'A', 26))
            .Select(i => (char)i)
            .ToArray();

        var map =
            alphabet
                .Zip(
                    alphabet.Concat(alphabet).Concat(alphabet).Skip(alphabet.Length + shift),
                    (c0, c1) => new { c0, c1 })
                .ToDictionary(x => x.c0, x => x.c1);

        return String.Join("", cipherString.Select(x => map.ContainsKey(x) ? map[x] : x));
    }
}