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

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

DeCSS 4

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

요약
일부만 알려진 CSS 키 스트림이 주어졌을 때, 알려진 모든 바이트를 재현하는 42비트 키를 하나 찾습니다.
난이도

어려움10점 중 8점

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

문제

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

암호화된 텍스트와 내용의 일부 바이트를 알고 있으면, 키 스트림의 대응하는 바이트를 구할 수 있다. 일부만 알려진 키 스트림 T(K)T(K)가 주어졌을 때, 위 방식으로 주어진 스트림과 일치하는 키 스트림을 만들어 내는 키 KK 하나를 구하라.

키 스트림 T(K)T(K)는 LFSR(Linear-feedback shift register)을 바탕으로 생성된다. LFSR의 상태는 mm개의 비트 b1,b2,…,bmb_1, b_2, \ldots, b_m이며, 귀환 위치의 집합이 정해져 있다. 한 사이클에서 LFSR은 다음 순서로 출력 비트 하나를 만들고 상태를 바꾼다.

  1. 귀환 위치의 비트를 모두 더한다. 합이 짝수이면 출력 비트 bb는 0이고, 홀수이면 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: 키 스트림 생성

키 스트림은 다음 순서로 생성된다.

  1. 두 LFSR을 키 KK로 정해지는 초기 상태에 둔다.
  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을 뺀 값을 zz로 하고 cc를 1로 둔다. 그렇지 않으면 cc를 0으로 둔다.
    5. 키 스트림의 다음 바이트는 zz이다.

키 스트림의 일부 바이트는 알려져 있고 나머지는 알려져 있지 않다. 알려져 있지 않은 바이트는 -1로 주어진다. 위 과정으로 주어진 키 스트림과 일치하는 스트림을 만드는 키 KK를 하나 찾으라.

입력

첫 줄에는 주어진 키 스트림의 길이 nn을 나타내는 자연수가 주어진다. 둘째 줄에는 키 스트림의 바이트 t1,t2,…,tnt_1, t_2, \ldots, t_n이 순서대로 주어진다. k번째 바이트를 모르면 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