만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

DeCSS 9

시간 제한1초메모리 제한1024 MB

요약
두 LFSR(17비트, 25비트)와 자리올림 c로 만들어지는 키스트림에서 알려진 바이트와 일치하는 42비트 키 하나를 찾습니다.
난이도

어려움10점 중 8점

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

문제

Content Scramble System(CSS)은 DVD 매체의 콘텐츠를 암호화하는 방식으로, 라이선스를 받은 기기만 콘텐츠에 접근할 수 있게 한다. 이 문제에서 다루는 CSS 변형에서 키 KK는 정확히 42비트 k1,k2,…,k42k_1, k_2, \ldots, k_{42}로 이루어진 수열이고, 콘텐츠는 nn바이트로 이루어진 수열이다. 암호화할 때는 먼저 키로부터 키 스트림 T(K)T(K)를 만든다. 키 스트림도 nn바이트 수열이다. 그다음 콘텐츠의 각 바이트와 대응하는 키 스트림 바이트에 비트 단위 배타적 논리합(XOR)을 적용한다.

암호문과 콘텐츠의 일부 바이트를 알고 있다면, 그에 대응하는 키 스트림 바이트를 구할 수 있다. 일부만 알려진 키 스트림 T(K)T(K)를 바탕으로, 그것을 만들어 낼 수 있는 키 KK 하나를 구하라.

키 스트림은 Linear-feedback shift register(LFSR)라는 논리 회로로 생성된다. LFSR의 상태는 mm개의 비트 b1,b2,…,bmb_1, b_2, \ldots, b_m으로 이루어지며, 피드백 위치들의 집합이 정해져 있다. LFSR은 한 사이클마다 출력 비트 하나를 내보내고, 상태를 다음과 같이 바꾼다.

  1. 피드백 위치에 있는 비트들을 더한다. 합이 짝수이면 b=0b=0, 홀수이면 b=1b=1로 둔다. 즉 bb는 피드백 위치 비트들의 배타적 논리합이다.
  2. 상태의 모든 비트를 왼쪽으로 한 칸씩 옮기고, b1b_1은 버린다. 그리고 bb를 맨 끝 위치에 넣는다. 새 상태는 b2,b3,…,bm,bb_2, b_3, \ldots, b_m, b이다.

LFSR 한 단계는 8사이클로 이루어지며, 결과는 한 바이트이다. 사이클들의 출력 비트를 차례로 i1,i2,…,i8i_1, i_2, \ldots, i_8이라 하면, 결과는 이진수 (i8i7…i1)2(i_8 i_7 \ldots i_1)_2로 표현되는 0 이상 255 이하의 정수이다.

CSS는 이런 회로를 두 개 쓴다.

  • LFSR17은 17비트이며, 위치 1과 15가 피드백 위치이다. 초기 상태는 키의 비트 k1,k2,…,k17k_1, k_2, \ldots, k_{17}을 차례로 놓은 것이다.
  • LFSR25는 25비트이며, 위치 1, 4, 5, 13이 피드백 위치이다. 초기 상태는 키의 비트 k18,k19,…,k42k_{18}, k_{19}, \ldots, k_{42}를 차례로 놓은 것이다.

그림 1: 키 스트림 생성

키 스트림 T(K)T(K)는 다음 순서로 만든다.

  1. 위에서 설명한 방식대로 키 KK를 이용해 LFSR17과 LFSR25를 초기 상태에 놓는다.
  2. 변수 cc를 0으로 둔다.
  3. 다음 과정을 nn번 반복한다.
    1. LFSR17을 한 단계 진행하고, 그 결과를 xx라고 한다.
    2. LFSR25를 한 단계 진행하고, 그 결과를 yy라고 한다.
    3. z=x+y+cz = x + y + c를 계산한다.
    4. z≥256z \geq 256이면 zz에서 256을 빼고 cc를 1로 둔다. 아니면 cc를 0으로 둔다.
    5. 다음 키 스트림 바이트는 zz이다.

키 스트림의 일부 바이트는 알려져 있고 나머지는 알려져 있지 않다. 주어진 바이트와 일치하는 키 KK 하나를 구하라. 그 키로 위 방식의 키 스트림을 만들었을 때, 알려진 바이트들이 모두 맞아야 한다.

입력

첫 줄에는 주어진 키 스트림의 길이를 나타내는 자연수 nn이 주어진다. 둘째 줄에는 키 스트림의 바이트를 차례로 나타내는 정수 t1,t2,…,tnt_1, t_2, \ldots, t_n이 주어진다. kk번째 바이트를 모르면 tk=−1t_k = -1이고, 알면 0≤tk≤2550 \leq t_k \leq 255이다.

출력

첫 줄에 구한 키의 비트 k1,k2,…,k42k_1, k_2, \ldots, k_{42}를 공백 없이 출력한다.

참고: 답은 항상 존재하지만, 유일하지 않을 수 있다.

힌트

첫 번째 예시를 설명한다. 아래 표는 키 스트림의 처음 네 바이트가 만들어지는 과정을 보여 준다. 첫 행은 초기 상태이고, 나머지 행은 각 사이클 또는 단계가 끝난 직후의 상태이다. 원문 표에서는 피드백 위치를 회색으로, 그 사이클의 출력 비트인 마지막 비트를 밑줄로 표시하였다.

단계사이클LFSR17LFSR25xycz
초기 상태0 1100 0110 0101 00101 1001 1000 0000 0000 0011 10110
11 1000 1100 1010 01001 0011 0000 0000 0000 0111 0110
21 0001 1001 0100 10000 0110 0000 0000 0000 1110 1101
30 0011 0010 1001 00010 1100 0000 0000 0001 1101 1011
40 0110 0101 0010 00101 1000 0000 0000 0011 1011 0110
50 1100 1010 0100 01001 0000 0000 0000 0111 0110 1101
61 1001 0100 1000 10010 0000 0000 0000 1110 1101 1011
71 0010 1001 0001 00110 0000 0000 0001 1101 1011 0110
80 0101 0010 0010 01110 0000 0000 0011 1011 0110 1101
12281821154
90 1010 0100 0100 11110 0000 0000 0111 0110 1101 1011
101 0100 1000 1001 11110 0000 0000 1110 1101 1011 0111
110 1001 0001 0011 11100 0000 0001 1101 1011 0110 1110
121 0010 0010 0111 11010 0000 0011 1011 0110 1101 1101
130 0100 0100 1111 10100 0000 0111 0110 1101 1011 1011
140 1000 1001 1111 01000 0000 1110 1101 1011 0111 0110
151 0001 0011 1110 10010 0001 1101 1011 0110 1110 1101
160 0010 0111 1101 00110 0011 1011 0110 1101 1101 1010
220391139
170 0100 1111 1010 01100 0111 0110 1101 1011 1011 0100
180 1001 1111 0100 11010 1110 1101 1011 0111 0110 1001
191 0011 1110 1001 10111 1101 1011 0110 1110 1101 0010
200 0111 1101 0011 01111 1011 0110 1101 1101 1010 0100
210 1111 1010 0110 11111 0110 1101 1011 1011 0100 1000
221 1111 0100 1101 11110 1101 1011 0111 0110 1001 0001
231 1110 1001 1011 11101 1011 0110 1110 1101 0010 0010
241 1101 0011 0111 11001 0110 1101 1101 1010 0100 0101
3621620225
251 1010 0110 1111 10000 1101 1011 1011 0100 1000 1011
261 0100 1101 1111 00011 1011 0111 0110 1001 0001 0110
270 1001 1011 1110 00111 0110 1110 1101 0010 0010 1101
281 0011 0111 1100 01100 1101 1101 1010 0100 0101 1011
290 0110 1111 1000 11001 1011 1011 0100 1000 1011 0111
300 1101 1111 0001 10011 0111 0110 1001 0001 0110 1111
311 1011 1110 0011 00100 1110 1101 0010 0010 1101 1110
321 0111 1100 0110 01011 1101 1010 0100 0101 1011 1101
4166189199

예제1

  1. 예제 1

    입력
    7
    154 39 225 99 151 145 -1
    
    예상 출력
    011000110010100101100110000000000000111011