swuforce

[워게임 공부] XOR과 실습 코드

범호야 2025. 11. 12. 13:13

XOR

입력이 서로 다른 경우에만 참인 논리 연산 

암호화에서의 응용

메시지를 암복호화 하는데 사용될 수 있다. 메세지를 키와 XOR 연산하면 같은 키로 XOR 연산을 수행하여 원래 메세지를 복원할 수 있다. 

혼돈과 확산을 구현할 수 있다. 

활용 사례

- One Time Pad

- 스트림 암호

- 블록 암호 내부 구조 

- 해시 함수 및 MAC

- 디지털 서명, 난수 생성기 내부 

한계

단독으로는 매우 약한 암호화 방식 -> 같으 키 재사용 시 패턴이 노출되므로 난수 키 생성기, 블럭 암호 구조, 패딩 등과 함꼐 사용해아 한다. 

실습코드 

import sys
sys.stdout.reconfigure(encoding='utf-8')

def xor_byte(data, byte):
    return data ^ byte

def main():
    hex_string = "54586b6458754f7b215c7c75424f21634f744275517d6d"
    hex_list = [int(hex_string[i:i+2], 16) for i in range(0, len(hex_string), 2)]

    for xor_value in range(256):
        result_data = [xor_byte(h, xor_value) for h in hex_list]
        result_string = ''.join([format(x, '02X') for x in result_data])

        # ASCII로 변환하되, 출력 가능한 문자만 표시
        ascii_result = ''.join([chr(x) if 32 <= x <= 126 else '.' for x in result_data])

        print(f"XOR 0x{xor_value:02X} Result: {result_string}, ASCII: {ascii_result}")

if __name__ == "__main__":
    main()

1. 인코딩 설정

2. XOR 연산 함수

3. 메인 함수 - 복호화할 암호문 삽입 

4. 16진수를 정수 리스트로 변환 - hex_string을 두 자리씩 잘라서 각 조각을 16진수에서 10진수로 변환

5. 모든 XOR 키에 대해 시도 - 바이트 단위이기 때문에 0~155 에 대해 모두 시도

6. 각 바이트에 XOR 적용 - 각 원소에 xor_value를 XOR

7. 결과를 16진수로 표시

8. 아스키로 변환 - 출력 가능한 문자만 

9. 결과 출력

10. 프로그램 실행