2017-09-17 2 views
-1

나는 내 친구에게서 도전을 받았습니다. 그는 기능을 바꾸어야한다고 말했고 입력 사항을 찾아야합니다. 하지만 몇 시간 동안 논리를 생각하고 코드에서 생각하는 것을 작성하는 방법에 매달 렸습니다.암호문 블록 체인 XOR "암호 해독"암호 해독

def hash_cbc(input): 
    initial = 'a' 
    key = 'netsos' 

    output = [ord(initial)] 

    def enc(c, key, i): 
     z = key[i % len(key)] 
     return (c + ord(z))^ord(z) 

    for i in range(len(input)): 
     prev_char = output[i] 
     next_char = enc(prev_char, key, i)^ord(input[i]) 
     output.append(next_char) 

    return output 

이 알고리즘의 출력이되어야합니다 : 나는 그래서 입력을 얻을 수있는 기능을 전환 할 필요가

97, 194, 299, 411, 533, 654, 768, 873, 965, 1066, 1164, 1272, 1399, 1512, 1603, 1706, 1792, 1895, 1994, 2110, 2215, 2310, 2404, 2517, 2645, 2762 

그는 나에게이 알고리즘을했다. 입력은 문자열이어야합니다.

제발 도와주세요, 몇 시간 동안 아무런 결과가 없었습니다. XOR 함수를 뒤집을 생각 이었지만 실제로 쓰는 방법을 혼란스럽게 만들었습니다.


내가하고이 알고리즘을 생각이

enc(prev_char, key, i)^1st ordinal input = 1st output 
enc(prev_char, key, i)^2nd ordinal input = 2nd output 
enc(prev_char, key, i)^3rd ordinal input = 3rd output 
하지만 루프

에 내가 "ENC (prev_char, 키가 있기 때문에 반대하는 방법을 잘 아니라고하고

등, i) "나를 혼란스럽게하는 부분

나 자신의 리버스 코드를 만들려고했다.

def enc(c, key, i): 
Awalan = input("Insert numbers: ") 
Awalan_split = Awalan.split (', ') 
Awalan_len = len(Awalan_split) 

initial = 'a' 
key = 'netsos' 
output = [ord(initial)] 
z = key[i % len(key)] 
return (c + ord(z))^ord(z) 

for i in range(Awalan_len): 
    prev_char = output[i] 
    next_char = int(Awalan_split[i])^enc(prev_char, key, i) 
    char_convert = chr(next_char) 
    return(char_convert) 

print(char_convert) 

행운은 없지만 출력이 부족합니다. 내 코드에 어떤 문제가 있습니까?

+0

그리고이 문제를 해결하도록 시도에 정확히 도움이 필요 하신가요? –

+0

나는 XOR (^) 함수를 되 돌리려고했지만 운이 없다. 어쩌면 당신은 나에게 알고리즘 제안을 줄 수있다. –

+0

주어진 일을하는 프로그램을 작성하는 것은 우리가 여기서하는 일이 아니다. StackOverflow는 Q & A 기술 자료가 될 수 있습니다 - 표준 질문 모음 (다른 사람이 직면 할 수 있음)과 답변. 더 광범위하게 적용 할 수있는 잠재적 인 잠재력이있는 질문을 찾을 수 있다면 해당 질문의 주변 요소를 제거하여 해당 적용 가능성을 더욱 명확하게 만들 수 있습니다. (그리고 * 해당 질문에 제목을 집중 시키십시오. 노력하고있어) 도움이 될 것입니다. –

답변

0

XOR 자체가 뒤집습니다. A^B = C, C^B = A. 예 :

>>> 123^456 
435 
>>> 435^456 
123 

결과, 194의 2 값이므로 원래 값을 생성한다 enc() 기능 다시 194 배타적 논리합의 enc() 함수의 결과에 미지의 오리지널 캐릭터를 XOR 연산에 의해 계산 하였다.

>>> 194^enc(ord('a'),'netsos',0) 
99 
>>> chr(99) 
'c' 

결과, 299의 3 값, 이전 값을 사용하여 암호화 기능을 약하게되었다 : initial'a'하고 enc의 마지막 매개 변수는 현재 원래 문자열에 인덱스, 그래서 0 것을 기억 그래서 암호화 기능 XOR 연산 시퀀스의 다음 문자가 다시 생성해야

>>> 299^enc(194,key,1) # index (last parm) incremented 
105 
>>> chr(105) 
'i' 

이 패턴에 따라, 다음 암호화되지 않은 기능은 다음과 같아야

,536,913,632 10
output = [] 
for i in range(len(inp) - 1): # original will be one shorter. 
    prev_char = inp[i] 
    next_char = enc(prev_char, key, i)^inp[i+1] 
    output.append(next_char) 

그럼 그냥 문자로 다시 생성 된 서수 변환 :

여기
return ''.join(chr(n) for n in output) 

모든 것을 함께 묶여를 :

# factor out common stuff 
initial = 'a' 
key = 'netsos' 
def enc(c, key, i): 
    z = key[i % len(key)] 
    return (c + ord(z))^ord(z) 

def hash_cbc(inp): 
    output = [ord(initial)] 

    for i in range(len(inp)): 
     prev_char = output[i] 
     next_char = enc(prev_char, key, i)^ord(inp[i]) 
     output.append(next_char) 

    return output 

def unhash_cbc(inp): 
    output = [] 
    for i in range(len(inp) - 1): 
     prev_char = inp[i] 
     next_char = enc(prev_char, key, i)^inp[i+1] 
     output.append(next_char) 

    return ''.join(chr(n) for n in output) 

expected_result = [97, 194, 299, 411, 533, 654, 768, 873, 965, 1066, 1164, 1272, 1399, 1512, 1603, 1706, 1792, 1895, 1994, 2110, 2215, 2310, 2404, 2517, 2645, 2762] 

u = unhash_cbc(expected_result) 
h = hash_cbc(u) 
print(h == expected_result) 
print(u) 

출력 :

True 
cipheringblockingchaining 
+0

감사합니다! 매우 유익하고 자세한 설명 : D –