异或文件解密

时间:2011-09-04 19:48:19

标签: file encryption passwords xor

因此,我必须解密使用.txt加密的XOR code文件,并使用未知的重复密码,目标是发现该消息。

以下是因为教授而我已经知道的事情:

  1. 首先,我需要找到未知密码的长度

  2. 邮件已更改且没有空格(这可能会增加一点难度,因为空格字符在邮件中的频率最高)

  3. 关于如何解决这个问题的任何想法?

    thx in advanced:)

4 个答案:

答案 0 :(得分:13)

首先,您需要找出密码的长度。您可以通过评估Index of Coincidence或Kappa测试来完成此操作。 XOR密文本身移位1步并计算相同的字符数(值0)。通过将结果除以字符总数减1来获得Kappa值。再移动一次并再次计算Kappa值。根据需要多次移动密文,直到找到密码长度。如果长度为4,你应该看到类似的东西:

Offset             Hits
-------------------------
  1              2.68695%
  2              2.36399%
  3              3.79009%
  4              6.74012%
  5              3.6953%
  6              1.81582%
  7              3.82744%
  8              6.03504%
  9              3.60273%
 10              1.98052%
 11              3.83241%
 12              6.5627%

如您所见,Kappa值在4(4,8和12)的倍数上显着高于其他值。这表明密码的长度为4。

既然你有密码长度,你应该再次对密码文本进行异或,但现在你要移动长度的倍数。为什么?由于密文看起来像这样:

THISISTHEPLAINTEXT    <- Plaintext
PASSPASSPASSPASSPA    <- Password
------------------
EJKELDOSOSKDOWQLAG    <- Ciphertext

当两个相同的值为XOR:ed时,结果为0:

EJKELDOSOSKDOWQLAG        <- Ciphertext
    EJKELDOSOSKDOWQLAG    <- Ciphertext shifted 4.

实际上是:

THISISTHEPLAINTEXT        <- Plaintext
PASSPASSPASSPASSPA        <- Password
    THISISTHEPLAINTEXT    <- Plaintext
    PASSPASSPASSPASSPA    <- Password

这是:

THISISTHEPLAINTEXT        <- Plaintext
    THISISTHEPLAINTEXT    <- Plaintext

当你看到密码“消失”而明文是XOR:ed时自己。

那么我们现在可以做些什么呢?你写道,空格被删除了。这使得获取明文或密码更加困难。但根本不可能。

下表显示了所有英文字符的密文值:

   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
A  0                                                                           
B  3  0                                                                        
C  2  1  0                                                                     
D  5  6  7  0                                                                  
E  4  7  6  1  0                                                               
F  7  4  5  2  3  0                                                            
G  6  5  4  3  2  1  0                                                         
H  9 10 11 12 13 14 15  0                                                      
I  8 11 10 13 12 15 14  1  0                                                   
J 11  8  9 14 15 12 13  2  3  0                                                
K 10  9  8 15 14 13 12  3  2  1  0                                             
L 13 14 15  8  9 10 11  4  5  6  7  0                                          
M 12 15 14  9  8 11 10  5  4  7  6  1  0                                       
N 15 12 13 10 11  8  9  6  7  4  5  2  3  0                                    
O 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0                                 
P 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  0                              
Q 16 19 18 21 20 23 22 25 24 27 26 29 28 31 30  1  0                           
R 19 16 17 22 23 20 21 26 27 24 25 30 31 28 29  2  3  0                        
S 18 17 16 23 22 21 20 27 26 25 24 31 30 29 28  3  2  1  0                     
T 21 22 23 16 17 18 19 28 29 30 31 24 25 26 27  4  5  6  7  0                  
U 20 23 22 17 16 19 18 29 28 31 30 25 24 27 26  5  4  7  6  1  0               
V 23 20 21 18 19 16 17 30 31 28 29 26 27 24 25  6  7  4  5  2  3  0            
W 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24  7  6  5  4  3  2  1  0         
X 25 26 27 28 29 30 31 16 17 18 19 20 21 22 23  8  9 10 11 12 13 14 15  0      
Y 24 27 26 29 28 31 30 17 16 19 18 21 20 23 22  9  8 11 10 13 12 15 14  1  0   
Z 27 24 25 30 31 28 29 18 19 16 17 22 23 20 21 10 11  8  9 14 15 12 13  2  3  0

这意味着什么?如果A和B是XOR:ed,则结果值为3. E和P将导致21.等等。但是这对你有什么帮助?

请记住,明文是XOR:ed,其自身移动了密码长度的倍数。对于每个值,您可以检查上表并确定该位置可能具有的组合。假设值为25,则导致值25的两个字符可以是以下组合之一:(IP),(HQ),(KR),(JS),(MT),(LU),(OV) ),(NW),(AX)或(CZ)。但是哪一个?现在,您可以执行更多移位,并在每个位置再次查找表中的相应值。下次该值可能为7,并且由于您已经有可能的字符组合列表,因此您只需检查它们。在接下来的两个班次中,值为3和1.现在您可以确定该字符是W,因为这是每个班次中唯一的共同字符,(N-W),(P-W),(T-W),(V-W)。你可以为大多数职位做到这一点。

您将无法获得所有明文,但您将获得足够的字符来发现密码。获取已知字符并将它们XOR放在密文中的正确位置。这将产生密码。至少您需要的已知字符数是密码中的字符数,如果它们位于密码的“正确”位置。

祝你好运!

答案 1 :(得分:1)

你应该看看破解vigenere chiffre,特别是在自动关联时。后者将帮助您找出密码的长度,其余的通常只是强制正常的字母分布(最常见的是英文字母e)。

答案 2 :(得分:1)

虽然空格是最常见的字符并且使这样的解密变得容易,但另一个字符也具有不同的频率。例如,see this Wikipedia article。如果您有足够的加密文本并且密码长度不是太大,那么可能只需要找出加密文本中最常见的字节。它们很可能是e的加密版本,其在英文文本中的频率最高。 仅此一项不会为您提供解密文本,但您很可能会找到密码长度和密码本身(部分)。例如,假设最频繁的加密字节是

w x m z y

频率几乎相同,并且在最后一次频率之后频率显着下降。这将告诉你两件事:

  1. 密码长度最有可能是5,因为从统计上来说,所有加密的e都具有相同的可能性。编辑:好的,这是不正确的,它将是 5或以上,因为密码可以多次包含相同的字符。
  2. 密码将是(w x m z y XOR e e e e e)的一些排列 - 您可以使用以密码长度为模的字节偏移量来获得正确的排列。
  3. 编辑:密码中出现的相同字符多次使事情变得更难,但您很可能能够识别这些字符,因为正如我所说,e的加密版本会聚集在频率{{{ 1}} - 现在,如果字符出现f次,则其频率将接近n

答案 3 :(得分:0)

英语中最常见的三字母trigram(假设语言可能是英语)是“the”。将“the”放在密文的所有可能位置,以获得密钥的可能3个字符。在密文上的所有其他可能位置尝试每个可能的密钥片段,看看你得到了什么。例如,“qzg”不太可能是正确的,但“fen”可能是正确的。查看可能位置之间的间距以得出密钥长度。使用密钥长度和密钥片段,您可以放置​​更多密钥。

正如Lars所说,看看解密Vigenère的方法,这实际上就是你所拥有的。