개념 설명
https://cryptohack.org/courses/intro/xor1/
지난 과제에서는 XOR이 비트 수준에서 어떻게 동작하는지 보았다.
여기서는 XOR 작업의 속성을 다루고 플래그를 암호화한 일련의 작업을 무력화하는데 사용할 것이다.
이것이 어떻게 작동하는지에 대한 직관을 얻는 것은 나중에 특히 블록 암호 범주에서 실제 암호 시스템을 공격할 떄 크게 도움이 될 것이다.
XOR 연산자를 사용하여 문제를 해결할 때 고려해야 할 네 가지 주요 특성은 다음과 같다.
교환법칙(Commutative)
결합법칙(Associative)
항등식(Identity) (항등원은 0)
역원(Self-Inverse) (자기 자신을 역원으로 가진다: Self-Inverse)
이걸 분석해보자. 교환법칙(Commutative)은 XOR 작업의 순서가 중요하지 않음을 의마한다. 결합법칙(Associative)은 일련의 작업을 순서 없이 수행할 수 있음을 의미한다.(우리는 괄호를 걱정할 필요가 없다.) 항등원이 0이므로 0과 XOR하는 것은 "아무것도 하지 않는다" 라고 하며, 마지막으로 자기 자신을 XOR 연산하면 0을 반환한다.
예제
이제 이걸 실행에 옮기자.
다음은 플래그와 함께 3개의 임의 키가 XOR된 것이다. 위 속성을 사용하여 마지막 줄의 암호화를 무력화하여 플래그를 가져온다.
KEY1 = a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
KEY2 ^ KEY1 = 37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e
KEY2 ^ KEY3 = c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1
FLAG ^ KEY1 ^ KEY3 ^ KEY2 = 04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf
! 이러한 개체를 XOR 하기 전에 16진수에서 바이트로 디코딩해야 한다.
key2 ^ key3에 key1을 xor하면 key1 ^ key2 ^key3을 구할 수 있다. (교환 법칙에 의해)
자기 자신이 역원인 특성을 이용하여
FLAG ^ key1 ^ key2 ^ key3 에 key1 ^ key2 ^ key3 을 xor 하면
FLAG를 얻을 것이다.
from Crypto.Util.number import *
key23 = 0xc1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1
key1 = 0xa6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
flag_key123 = 0x04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf
key123 = key23 ^ key1
flag = flag_key123 ^ key123
print(long2str(flag))
key123을 구하고 정수 형태의 flag를 얻어서 PyCryptodome 모듈을 사용하여(Crypto.Util.number) 문자열로 출력