Time Limit: 3s
Memory Limit: 128MB
여기 암호화해서 전송하고싶은 데이터가 32bit unsigned int 8개 형태로 주어져있다.
N1 N2 N3 ... N8
우선 이 데이터가 올바른 데이터인지 확인해주는 checksum을 구해서 9번째 데이터로 추가해줬다. (checksum은 데이터의 무결성을 확인하는데 자주 사용되는 방식이다.)
N9 = sigma(Ni) mod 2^32
그다음 특정 32bit 키값 K를 이용해서 이 9개의 숫자를 암호화하려고 한다. 암호화는 XOR 연산을 통해 이루어진다고 보자. (XOR은 데이터의 암호화를 위해 자주 사용되는 연산자다.)
M1 = N1 ^K, M2 = N2 ^ K ... M9 = N9 ^ K
이렇게 해서 만들어진 M1 ~ M9 9개의 데이터를 전송하면 K값을 알고있는 사람은 원래 데이터 N1 ~ N8을 알아낼 수 있다. 그리고 K값을 모르는 사람은 원래 데이터 N1 ~ N8을 알아낼 수.....있다!
놀랍게도 위의 방식에는 취약점이 존재한다. 취약점을 발견해서 9개의 정수 M1 ~ M9 가 16진수 형태로 주어졌을 때, 키값 K를 구하는 프로그램을 작성해보자.
입력의 첫째 줄에는 테스트데이터의 개수 T가 주어진다. T는 1000을 넘지 않는다.
그 다음 각 테스트데이터마다 9개의 정수 M1 ~ M9 가 16진수 형태로 주어진다. 16진수는 '0' ~ '9' 그리고 소문자로만 이루어져 있고, 불필요한 0은 들어오지 않는다. 9개의 숫자가 한 줄에 모두 입력되지 않을 수도 있다.
각 테스트데이터마다 한줄에 하나씩 키값 K를 소문자 16진수 형태로 출력한다. 불필요한 0은 출력하지 않는다.
8 1 1 1 1 1 1 1 1 8 3 2 3 2 3 2 3 2 6 3 4 4 7 7 b a 2 2e e1 13 ce 28 ca 6 ab 46 a6d b08 49e2 6128 f27 8cf2 bc50 7380 7fe1 723b 4eba eb4 a352 fd14 6ac1 eed1 dd06 bb83 392bc ef593c08 847e522f 74c02b9c 26f3a4e1 e2720a01 6fe66007 7a4e96ad 6ee5cef6 3853cd88 60202fb8 757d6d66 9c3a9525 fbcd7983 82b9571c ddc54bab 853e52da 22047c88 e5524401
0 2 6 1c6 4924afc7 ffff95c5 546991d 901c4a16
Regionals 2004, Asia - Ehime