C#中的凯撒密码

时间:2011-12-14 08:32:23

标签: c# encryption

如果我想写一个Caesar密码C#,我必须经历每一个案例吗?转换为ASCII或UTF对我来说没有意义(可能是因为我不明白它是如何工作的)。我只需要一个正确的方向点。

我应该为每个字母分配数字1-26吗?

4 个答案:

答案 0 :(得分:2)

您可以将每个字母放入一个数组并使用数组索引(在末尾包装),或者您可以简单地使用字母的asccii值并在到达最后一个时将其换行到第一个。这里的诀窍是所有字符都是连续排序的,从A = 0x41

开始

答案 1 :(得分:2)

也许删除提示会有所帮助 - 你说你不想复制或被告知答案:

  • 考虑C#以模数运算符为特征,形式为a = b%c - 即b的余数除以c。当c = n且b = n时,a = 0.当c = n且b = n + 1时,a = 1.试验该算子的行为。
  • 您可以使用初始化工具在C#中静态声明数组:char[] chars = new char[]{'a', 'b',...};

答案 2 :(得分:1)

对于传统的凯撒Cypher,你要检查一个字符在[a-z]或[A-Z]范围内,否则只是通过它。

另一种方法是以相同的方式处理所有字符,因此不仅a变为b,而且μ变为¶并且你在U + 10FFFF(Unicode中的最高代码点)环绕变为U + 0000(前者是非字符,后者是空字符,但没有理由string无法将它们传送到另一个地方。

在这两者之间,是对UTF-16采取行动。也就是说,您只需将1添加到每个char的值,并将U + FFFF包装到U + 0000。输出可能会成为无效的UTF-16字符串(因为它可能与surrogates不匹配,但这不会阻止您在string中传递它,然后再次对其进行解密。所有,现代加密也不会产生有效的字符串。

答案 3 :(得分:1)

这是我的方法。

    public static string Encrypt(string str, int n)
    {
        return string.Join("", str.Select(x => Encrypt(x, n)));
    }

    public static string Decrypt(string str, int n)
    {
        return string.Join("", str.Select(x => Decrypt(x, n)));
    }

    public static char Encrypt(char chr, int n)
    {
        int x = chr - 65;

        return (char)((65) + ((x + n) % 26));
    }

    public static char Decrypt(char chr, int n)
    {
        int x = chr - 65;

        return (char)((65) + ((x - n) % 26));
    }

P.S。

仅适用于大写字母。

阅读维基百科文章:Caesar cipher