C# 中的凯撒密码
本文关键字:密码 凯撒 | 更新日期: 2023-09-27 18:17:42
如果我想编写凯撒密码C#,我必须经历每个案例吗?转换为 ASCII 或 UTF 对我来说没有意义(可能是因为我不明白它是如何工作的(。我只需要一个正确的方向。
我应该为每个字母分配数字 1-26 吗?
您可以将每个字母放入数组并使用数组索引(在末尾换行(,或者您可以简单地使用字母的 asccii 值并在到达最后一个字母时换行到第一个。这里的诀窍是所有字符都连续排序,从 A=0x41 开始
对于传统的凯撒密码,您需要检查字符是否在 [a-z] 或 [A-Z] 范围内,否则只需将其传递即可。
另一种方法是以相同的方式处理所有字符,因此不仅 a 变成 b,而且μ变成 ¶,并且在 U+10FFFF(Unicode 中最高的代码点(处的包装变为 U+0000(前者是非字符,后者是空字符,但没有理由string
不能将它们传输到另一个地方。
介于这两者之间,是作用于 UTF-16。也就是说,您只需在每个char
的值上加 1,然后将 U+FFFF 包装为 U+0000。输出可能会成为无效的 UTF-16 字符串(因为它可能有不匹配的代理项,但这不会阻止您在string
中传递它,然后再次解密它。毕竟,现代加密也不会产生有效的字符串。
也许删除提示会有所帮助 - 你说你不想复制或被告知答案:
- 考虑 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',...};
这是我
的方法。
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));
}
附言
仅适用于大写字母。
阅读维基百科文章:凯撒密码