배낭 암호 체계
시간 제한3초메모리 제한512 MB
q = 2^64인 Merkle-Hellman 배낭 암호에서 공개키와 암호문이 주어질 때, 알려진 모듈러스를 이용해 원래 메시지 비트를 복원한다.
문제
머클-헬만 배낭 암호 체계는 가장 이른 시기의 공개 키 암호 방식 가운데 하나다. 랄프 머클과 마틴 헬만이 1978년에 발표했다. 방식은 다음과 같다.
앨리스는 모든 에 대해 를 만족하는 양의 정수 개 과, 보다 큰 양의 정수 , 그리고 와 서로소인 양의 정수 를 고른다. 이 개의 정수가 앨리스의 개인 키다.
이어서 앨리스는 를 계산한다. 이 개의 정수가 앨리스의 공개 키다.
밥은 공개 키만 알아도 앨리스에게 비트짜리 메시지를 보낼 수 있다. 밥은 자기 메시지의 번째 자리가 1인 인덱스 의 를 모두 더해 를 계산한다. 이 값 가 암호문이다.
공개 키와 암호문을 아는 도청자 이브는 원래 메시지를 알아내려면 어렵다고 알려진 배낭 문제를 풀어야 한다. 반면 앨리스는 를 받은 뒤 선형 시간에 원래 메시지를 복원한다.
이 문제에서 다루는 구현에서 앨리스는 속도를 위해 로 정하고 이 사실을 공개했다. 모두가 를 알고 있으므로, 앨리스는 통신을 간단히 하려고 밥에게 를 로 나눈 나머지를 보내달라고 한다.
이 구현을 깨라. 공개 키와 암호문이 주어지면 원래 메시지를 복원하면 된다.
입력
첫째 줄에 정수 이 주어진다 ().
다음 개 줄에 정수 가 한 줄에 하나씩 주어진다 ().
마지막 줄에 암호문을 로 나눈 나머지 가 주어진다 ().
주어지는 수열 은 위 구현의 올바른 공개 키이고, 주어지는 값은 올바른 암호문이다.
출력
원래 메시지의 비트를 순서대로 한 줄에 개 출력한다. 각 문자는 0 또는 1이다.
에서 고른 부분집합의 합이 서로 모두 다르므로, 입력과 맞는 메시지는 하나뿐이다.