2011-12-14 137 views
5

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

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

回答

2

你可以把每个字母到一个数组,并使用数组索引(缠绕在后)或到达最后一个时,你可以简单地使用字母的asccii价值,换到第一位。这里的技巧是,所有的人物都coninuously排序,起始于A = 0×41

+0

谢谢!这对我有意义,我没有意识到我可以做到这一点(我是一个完整的初学者!)。 –

1

对于一个传统的凯撒塞浦路斯,你会检查一个字符在[a-z]或[A-Z]范围内,并且只是通过它否则。

另一种方法是以相同的方式处理所有字符,所以不仅a变为b,而且μ变成¶并且在U + 10FFFF(Unicode中最高的编码点)处环绕变为U + 0000(前者是一个非字符,后者是一个空字符,但没有理由为什么一个string不能让他们传输到另一个地方。

在这两者之间,是作用于UTF-16。 ,你只需在每个char的值上加1,然后将U + FFFF换成U + 0000即可。输出可能成为一个无效的UTF-16字符串(因为它可能不匹配surrogates,但这不会阻止你从string中传递出去,然后再次解密。毕竟,现代加密不会导致有效的字符串。

+0

这是我不明白,如果我想解码一个简单的句子,我将其转换为代码,我可以限制的范围内,这样,当我想“Z”,以比如'b',我是否总是必须来回走动,我能不能把它变成类似于一个车轮?并感谢您的答案。 –

+0

这是规范,而不是工作的事(可悲的是,大多数现实生活中的并发症都是这样过,编程比上班什么客户真正想要更容易)。我会说第一个*可能*是什么意图。 你是什么意思“没有类似于车轮”的意思,撒暗号的任何变种类似于车轮。 –

+0

我的意思是包装 - 正如我从另一个答案=)中发现的那样 - 我应该写下_不能让它变成类似的。我仍然习惯这些条款。 –

2

或许给出提示将是有益的 - 你说你不想复制或被告知的答案:

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

也是一个很好的帮助,谢谢! –

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