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. 프로그램 실행