2017-01-26 7 views
1

Challenge #6私が現在働いている。このCryptopalsチャレンジ中の繰り返しキーXOR暗号

Challenge File

を破ります。私は正しいHamming関数と実現可能な(おそらく間違っている)FindKey関数とXOR関数を持っています。


これまでのところ、私はこのコードを持っている...

import base64 

def binary(n): 
    return '{0:08b}'.format(n) 

def Hamm(s1, s2): 
    d = 0 
    for c1, c2 in zip(s1, s2): 
     if c1 != c2: 
      b1 = binary(c1) 
      b2 = binary(c2) 
      for a, b in zip(b1, b2): 
       if a != b: 
        d += 1 
    return(d) 

def FindKey(b64_s): 
    key_dict = {} 
    low = 9999 
    previous = 0 
    for size in range(2, 40): 
     ham1 = b64_s[previous : size + 1] 
     ham2 = b64_s[size + 1 : size * 2 + 1] 
     low = Hamm(ham1, ham2)/size 
     key_dict = {low : size} 
     previous = size 
    return(key_dict[low]) 

def XOR(byte_string): 
    result = '' 
    key = max(byte_string, key=byte_string.count)^ord('e')\ 
    for b in byte_string: 
     result += chr(b^key) 
    print(result) 

# get base64 file 
b64_string = '' 
with open("TestFile_Challenge06_CSIS463.txt") as f: 
    for line in f: 
     b64_string = b64_string + str(line) 

XOR(base64.b64decode(b64_string)) 

答えて

2

は、あなたが再び書いたものを読む:

それは二つの文字列

の間で異なるビットの数であります

コード内で何をしているのかは、合計文字の文字数をとっていますは、ビットではなく、2つの文字列の間で異なります。

def Hamm(s1, s2): 
    d = 0 
    for ch1, ch2 in zip(s1, s2): 
     c1 = ord(ch1) 
     c2 = ord(ch2) 
     while c1 or c2: 
      b1 = c1 & 1 
      b2 = c2 & 1 
      d += b1^b2 
      c1 >>= 1 
      c2 >>= 1 
    return d 
+0

私は私の問題を更新:

は、私は少しそれを修正するようにコードを変更しました。もう一度見てもらえますか? @ Shakkhar –

関連する問題