아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

배낭 암호 체계

시간 제한3초메모리 제한512 MB

요약
q = 2^64인 Merkle-Hellman 배낭 암호에서 공개키와 암호문이 주어질 때, 알려진 모듈러스를 이용해 원래 메시지 비트를 복원한다.
난이도

어려움10점 중 8점

유형
정수론, 완전 탐색, 비트 연산, 수학
정답자
아직 제출이 없습니다

문제

머클-헬만 배낭 암호 체계는 가장 이른 시기의 공개 키 암호 방식 가운데 하나다. 랄프 머클과 마틴 헬만이 1978년에 발표했다. 방식은 다음과 같다.

앨리스는 모든 ii에 대해 ai>∑j=1i−1aja_i > \sum_{j=1}^{i-1} a_j를 만족하는 양의 정수 nn개 a1,…,ana_1, \dots, a_n과, a1+⋯+ana_1 + \dots + a_n보다 큰 양의 정수 qq, 그리고 qq와 서로소인 양의 정수 rr를 고른다. 이 n+2n + 2개의 정수가 앨리스의 개인 키다.

이어서 앨리스는 bi=(ai⋅r) mod qb_i = (a_i \cdot r) \bmod q를 계산한다. 이 nn개의 정수가 앨리스의 공개 키다.

밥은 공개 키만 알아도 앨리스에게 nn비트짜리 메시지를 보낼 수 있다. 밥은 자기 메시지의 ii번째 자리가 1인 인덱스 ii의 bib_i를 모두 더해 ss를 계산한다. 이 값 ss가 암호문이다.

공개 키와 암호문을 아는 도청자 이브는 원래 메시지를 알아내려면 어렵다고 알려진 배낭 문제를 풀어야 한다. 반면 앨리스는 ss를 받은 뒤 선형 시간에 원래 메시지를 복원한다.

이 문제에서 다루는 구현에서 앨리스는 속도를 위해 q=264q = 2^{64}로 정하고 이 사실을 공개했다. 모두가 qq를 알고 있으므로, 앨리스는 통신을 간단히 하려고 밥에게 ss를 2642^{64}로 나눈 나머지를 보내달라고 한다.

이 구현을 깨라. 공개 키와 암호문이 주어지면 원래 메시지를 복원하면 된다.

입력

첫째 줄에 정수 nn이 주어진다 (1≤n≤641 \le n \le 64).

다음 nn개 줄에 정수 bib_i가 한 줄에 하나씩 주어진다 (1≤bi<2641 \le b_i < 2^{64}).

마지막 줄에 암호문을 qq로 나눈 나머지 s mod qs \bmod q가 주어진다 (0≤s mod q<2640 \le s \bmod q < 2^{64}).

주어지는 수열 b1,…,bnb_1, \dots, b_n은 위 구현의 올바른 공개 키이고, 주어지는 값은 올바른 암호문이다.

출력

원래 메시지의 비트를 순서대로 한 줄에 nn개 출력한다. 각 문자는 0 또는 1이다.

a1,…,ana_1, \dots, a_n에서 고른 부분집합의 합이 서로 모두 다르므로, 입력과 맞는 메시지는 하나뿐이다.

예제4

  1. 예제 1

    입력
    5
    10
    20
    50
    140
    420
    440
    
    예상 출력
    01001
    
  2. 예제 2

    입력
    1
    912305779442463498
    0
    
    예상 출력
    0
    
  3. 예제 3

    입력
    1
    15896681328832863091
    15896681328832863091
    
    예상 출력
    1
    
  4. 예제 4

    입력
    2
    11359365954229918514
    16673425955450702548
    16673425955450702548
    
    예상 출력
    01