file - 异或文件解密

标签 file encryption passwords xor

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

以下是由于教授而我已经知道的事情:

  • 首先我需要找到未知密码的长度
  • 消息已被更改并且没有空格(这可能会增加一点难度,因为空格字符在消息中的频率最高)

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

    thx 先进 :)

    最佳答案

    首先,您需要找出密码的长度。您可以通过评估 Index of Coincidence 来做到这一点。或 Kappa 测试。将密文与自身移动 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
    

    当两个相同的值进行异或运算时,结果为 0:
    EJKELDOSOSKDOWQLAG        <- Ciphertext
        EJKELDOSOSKDOWQLAG    <- Ciphertext shifted 4.
    

    现实中是:
    THISISTHEPLAINTEXT        <- Plaintext
    PASSPASSPASSPASSPA        <- Password
        THISISTHEPLAINTEXT    <- Plaintext
        PASSPASSPASSPASSPA    <- Password
    

    这是:
    THISISTHEPLAINTEXT        <- Plaintext
        THISISTHEPLAINTEXT    <- Plaintext
    

    如您所见,密码“消失”并且明文与自身进行了异或运算。

    那么我们现在能做什么呢?您写道,空格已被删除。这使得获取明文或密码变得有点困难。但并非完全不可能。

    下表显示了所有英文字符的密文值:
       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 的两个字符可能是以下组合之一:(I-P)、(H-Q)、(K-R)、(J-S)、(M-T)、(L-U)、(O-V) )、(N-W)、(A-X) 或 (C-Z)。但是哪一个?现在您进行更多类次并再次在表中查找每个位置的相应值。下一次该值可能是 7,并且由于您已经有可能的字符组合列表,您只需检查它们。在接下来的两个类次中,值是 3 和 1。现在您可以确定字符是 W,因为这是每个类次中唯一常见的字符,(N-W)、(P-W)、(T-W)、(V-W)。您可以对大多数职位执行此操作。

    你不会得到所有的明文,但你会得到足够的字符来发现密码。取已知字符并将它们异或到密文中的正确位置。这将产生密码。您至少需要的已知字符数是密码中的字符数,如果它们位于密码的“正确”位置。

    祝你好运!

    关于file - 异或文件解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7301725/

    相关文章:

    javascript - 如何隐藏通过 JavaScript 对话框提示输入的密码?

    asp.net-core - 在 .net Core 中像表单例份验证一样加密密码

    java - 下载多种文件类型

    c++ - ofstream::open 创建文件,但随后崩溃(locale::getloc() 中的错误指针?)

    php - 有什么软件可以做文件(PHP源码)对比

    java - 在计数器模式下使用 AES 生成一次性 key

    Java AES解密: random chars & message at the end

    php - 有没有办法直接从 cPanel 文件管理器中的 URL 上传文件

    c++ - 使用加密 key 进行简单加密

    php - 在 PHP 中生成符合密码策略的随机固定长度密码