만드는 중입니다

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

DeCSS 6

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

요약
두 LFSR과 올림수로 만든 키스트림이 알려진 바이트와 일치하는 42비트 키 하나를 찾습니다.
난이도

어려움10점 중 8점

유형
비트 연산, 완전 탐색, 시뮬레이션
정답자
아직 제출이 없습니다

문제

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

암호문과 내용의 일부 바이트를 알고 있다면 대응하는 키 스트림 바이트를 구할 수 있다. 과제는 부분적으로 알려진 키 스트림 T(K)T(K)로부터 가능한 키 KK 하나를 찾는 것이다.

키 스트림 함수 T(K)T(K)는 선형 귀환 시프트 레지스터(LFSR)에 기반한다. LFSR은 mm비트 상태 b1,b2,…,bmb_1, b_2, \ldots, b_m과 귀환 위치 집합으로 정의된다. 한 사이클마다 LFSR은 출력 비트 하나를 만들고 다음과 같이 상태를 바꾼다.

  1. 귀환 위치에 있는 비트를 모두 더한다. 합이 짝수이면 출력 비트 bb는 0이고, 홀수이면 1이다. 즉 bb는 귀환 위치 비트들의 XOR이다.
  2. 상태의 모든 비트를 왼쪽으로 한 칸 옮긴다. b1b_1은 버리고, bb를 마지막 위치에 놓는다. 새 상태는 b2,b3,…,bm,bb_2, b_3, \ldots, b_m, b이다.

LFSR의 한 스텝은 8사이클로 이루어지며, 결과는 0에서 255 사이의 정수 하나이다. 사이클의 출력 비트를 차례로 i1,i2,…,i8i_1, i_2, \ldots, i_8이라 하면, 결과는 이진수 (i8i7…i1)2(i_8 i_7 \ldots i_1)_2로 표기되는 정수이다.

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 \ge 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 \le t_k \le 255이다.

출력

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

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

힌트

아래 표는 첫 번째 입력에 대해 키 스트림의 처음 네 바이트를 만드는 과정을 자세히 보여 준다. 첫 행은 초기 상태이고, 나머지 행은 각 사이클이나 스텝이 끝난 직후의 상태이다. 표에서 각 LFSR의 귀환 위치와 사이클의 마지막 출력 비트를 확인할 수 있다.

단계사이클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