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

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

DeCSS 7

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

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

어려움10점 중 8점

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

문제

Content Scramble System(CSS)은 DVD 미디어의 콘텐츠를 암호화해서 라이선스가 있는 기기만 접근할 수 있게 하는 방식이다. 이 문제에서 다루는 변형에서 키 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사이클로 이루어진다. 결과는 각 사이클의 출력 비트를 오른쪽에서 왼쪽으로 읽어 만든 1바이트이다. 사이클의 출력 비트가 차례로 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 \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}를 공백 없이 한 줄에 출력한다.

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

첫 번째 예시 설명

다음 표는 키 스트림의 처음 네 바이트가 만들어지는 과정을 보여준다. 첫 행은 초기 상태이고, 나머지 행은 각 사이클 또는 단계가 끝난 직후의 상태이다.

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