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