만드는 중입니다

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

DeCSS 2

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

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

보통10점 중 6점

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

문제

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

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

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

  1. 피드백 위치에 있는 비트들의 XOR을 구하여 출력 비트 bb로 삼는다. 그 값이 짝수이면 bb는 0이고, 홀수이면 bb는 1이다.
  2. 모든 상태 비트를 왼쪽으로 한 칸 옮긴다. b1b_1 비트는 버리고, bb를 마지막 위치에 놓는다. 새 상태는 b2,b3,…,bm,bb_2, b_3, \ldots, b_m, b이다.

LFSR의 한 단계는 8사이클로 이루어지며, 결과는 1 byte이다. 사이클의 출력 비트를 차례로 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이다. 초기 상태는 키의 비트 k1k_1부터 k17k_{17}까지를 차례로 채운다.
  • LFSR25는 25비트이고, 피드백 위치는 1, 4, 5, 13이다. 초기 상태는 키의 비트 k18k_{18}부터 k42k_{42}까지를 차례로 채운다.

그림 1: 키 스트림 생성

키 스트림 T(K)T(K)는 다음과 같이 생성한다.

  1. LFSR17과 LFSR25를 키 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을 빼고 cc를 1로 놓는다. 그렇지 않으면 cc를 0으로 놓는다.
    5. 키 스트림의 다음 byte는 zz이다.

일부 byte만 알려진 키 스트림이 주어진다. 위 방식으로 생성했을 때 주어진 키 스트림과 맞는 키 KK를 하나 구하라.

입력

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

출력

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

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

힌트

다음 표는 첫 번째 예제에서 키 스트림의 처음 네 byte가 생성되는 과정을 보여준다. 첫 줄은 초기 상태이고, 나머지 줄은 해당 사이클 또는 단계가 끝난 직후의 상태이다. 각 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