如何编写算法来破解Caesar Cipher?

时间:2013-07-17 00:01:57

标签: c# encryption

我正在尝试在编程手册中进行练习,其中一个练习是解密使用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]);
}

2 个答案:

答案 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有多少可能的钥匙?提示:不是很多。给定一台计算机,完全可以依次尝试所有键。然后,您必须考虑从输出数据中识别正确密钥的方法。人眼是另一种选择。

该技术有时被称为“沿着字母表运行”。它包含在维基百科的文章中。