由于这似乎是一项作业,因此我不会在 C# 中为您提供答案。我将解释算法并用 Python 给出解决方案。
凯撒密码通过移动字母“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 使用普通字母移位,因此可以通过频率分析找出生成的密文,就像普通字母一样。
在英语中,字母“E”最常出现。按理说,密文中最常出现的字母很有可能是对应于“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
这将输出以下解密文本:
这是最好的电脑练习器
我故意遗漏了一些东西,例如如何在第二个算法中硬编码“14”的地方实际进行计算。有些项目需要留给执行任务的人。可能还有一种更快、更简单的方法来完成我所做的一些事情;我这样做是为了好玩。