0

我正在尝试在编程书中做一个练习,其中一个练习是解密使用具有未知移位的凯撒密码的密文。

这是密文:

HVWGWGHVSPSGHQCADIHSFSLSFQWGSWVOJSSJSFSLDSFWSBQSR

我不知道预期的输出,因为我还没有确定算法。

我编写了以下算法来尝试使用凯撒密码对其进行解密,但这是我所得到的。如何在 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]);
}
4

2 回答 2

6

由于这似乎是一项作业,因此我不会在 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”的地方实际进行计算。有些项目需要留给执行任务的人。可能还有一种更快、更简单的方法来完成我所做的一些事情;我这样做是为了好玩。

于 2013-07-17T01:32:11.413 回答
3

凯撒密码有多少个可能的密钥?提示:不是一个很大的数字。给定一台计算机,完全有可能依次尝试所有键。然后,您必须想办法从输出数据中识别正确的密钥。人眼是一种选择。

该技术有时被称为“运行字母表”。它在 Wikipedia 文章中有所介绍。

于 2013-07-17T15:13:56.583 回答