2017-01-26 10 views
1

Challenge #6내가 현재 일하고이 Cryptopals 도전에서 반복-키 XOR 암호

Challenge File

속보. 정확한 해밍 함수와 가능한 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

다시 쓴 읽기 :

는 두 개의 문자열

사이의 서로 다른 비트의 수는

코드에서 수행중인 작업의 총 개수는 자입니다.비트 대신 두 문자열간에 서로 다릅니다.

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 –