我正在尝试在编程手册中进行练习,其中一个练习是解密使用Caesar cipher并且移位未知的密文。
这是密文:
HVWGWGHVSPSGHQCADIHSFSLSFQWGSWVOJSSJSFSLDSFWSBQSR
我不知道预期的输出,因为我还没有确定算法。
我已经编写了以下算法来尝试使用Caesar密码对其进行解密,但这是我已经得到的。如何在C#中解密?
string s = "HVWGWGHVSPSGHQCADIHSFSLSFQWGSWVOJSSJSFSLDSFWSBQSR";
int[] freq = new int[26];
for (int i = 0; i < s.Length; i++)
{
// converting
string temp = s.Substring(i, 1);
// converting to an array
int itemp = (int)temp.ToCharArray()[0];
freq[itemp - 65]++;
}
for (int i = 0; i < 26; i++)
{
Console.WriteLine(i + " " + freq[i]);
}
答案 0 :(得分:5)
由于这似乎是一项任务,我不打算在C#中给你答案。我将解释算法并在Python中提供解决方案。
Caeser Cipher通过移动字母“N”个空格来工作。如果您在数组中设置了字母:
array = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
这是操纵字母表以查看不同变化的简单方法。
接下来要做的是计算密码中每个字母的出现次数:
count = {}
encrypted_string = "HVWGWGHVSPSGHQCADIHSFSLSFQWGSWVOJSSJSFSLDSFWSBQSR"
for s in encrypted_string:
if count.has_key(s):
count[s]+=1
else:
count[s] = 1
most_occured = 1
last_found = ""
for key in count:
if count[key] > most_occured:
last_found = key
most_occured = count[key]
这很重要,因为Ceasar Cipher使用了正常的字母移位,所以可以通过频率分析计算得到的密文,就像普通字母一样。
用英语the letter "E" appears most often。按理说,在你的密文中最常出现的字母很可能是一个与“E”相对应的移位字母。
由于S
最常出现在您的密文中(共13次),并且我们知道E
最常出现在英语中,因此我们知道S
可能是E
。
鉴于我们知道这是一个凯撒密码,我们可以假设其余的字母移位就像S
被移位一样。并且E
是第5个字母,我们可以进行以下数学运算:
密码文本中最常出现的字母的字母位置 - 字母表中最常出现的字母的位置=要将密文转换为解密的位置数
或者,更简洁:
“S”的位置 - “E”的位置= 14:
19 - 5 = 14
这意味着每个字母应该左移14个位置:
decrypted_string = ""
for s in encrypted_string:
decrypted_string += array[array.index(s)-14]
print decrypted_string
这将输出以下解密文本:
THISISTHEBESTCOMPUTEREXERCISEIHAVEEVEREXPERIENCED
我故意留下一些东西,例如如何实际进行计算,我在第二个算法中硬编码“14”。有些项目需要由执行任务的人员完成。还有一种更快更容易的方法可以做我做的一些事情;我这样做是为了好玩。
答案 1 :(得分:3)
Caesar cypher有多少可能的钥匙?提示:不是很多。给定一台计算机,完全可以依次尝试所有键。然后,您必须考虑从输出数据中识别正确密钥的方法。人眼是另一种选择。
该技术有时被称为“沿着字母表运行”。它包含在维基百科的文章中。