#P11304. [COTS 2016] 破译 DeCSS

    ID: 10785 Type: RemoteJudge 1000ms 512MiB Tried: 0 Accepted: 0 Difficulty: (None) Uploaded By: Tags>2016提交答案Special Judge构造COCI(克罗地亚)

[COTS 2016] 破译 DeCSS

题目背景

译自 Izborne Pripreme 2016 (Croatian IOI/CEOI Team Selection) D1T1。

「不要忘记,在某个角落始终有个人,为你而战。只要你记住她,你就不是孤身一人。」

提交答案时,采用文件名为 decss-*.out\texttt{decss-*.out}

题目描述

这是一道提交答案题。 输入文件可以在附件中下载。

基本定义

内容扰乱系统(Content Scramble System,CSS)是一种对 DVD 进行加密的技术,以期保护版权。为了方便做题,此题对 CSS 进行了一定的简化。

密钥 kk 是一个长度为 424201\texttt{01} 序列 k1,k2,,k42k_1,k_2,\cdots,k_{42}

明文密文是由 nn 个字节组成的序列。

密钥流 T(k)T(k) 同样是由 nn 个字节组成的序列。

加密时,首先基于密钥 kk 生成密钥流 T(k)T(k),然后将密钥流与明文按位异或,即得到密文。如果已知密文和部分明文,即可得到部分密钥流。

在本题中,你需要基于部分密钥流 T(k)T(k) 确定一个可能的密钥 kk


LFSR

从密钥生成密钥流使用了线性反馈移位寄存器(LFSR)。

LFSR 的状态由 mm 位二进制位 b1bmb_1\sim b_m 组成。定义反馈位置集 S{1,2,,m}S\subseteq \{1,2,\cdots,m\},它控制输出时会基于哪些位进行运算。

在一个周期内,LFSR 会做如下的事情:

  • 输出 b=iSbi\displaystyle b=\bigoplus_{i\in S} b_i,其中 \oplus 表示按位异或运算。
  • 对于 1i<m1\le i\lt m同时bibi+1b_i\gets b_{i+1},并让 bmbb_m\gets b

LFSR 的一88 个周期组成,一步输出一个字节。令这 88 个周期输出的位为 i1i8i_1\sim i_8,则该步输出的字节为 (i8i7i6i5i4i3i2i1)2(\overline{i_8i_7i_6i_5i_4i_3i_2i_1})_2

CSS 使用的 LFSR 有:

名称 m=m= S=S= 初始状态
LFSR17 1717 {1,15}\{1,15\} k1,k2,,k17k_1,k_2,\cdots,k_{17}
LFSR25 2525 {1,4,5,13}\{1,4,5,13\} k18,k19,,k42k_{18},k_{19},\cdots,k_{42}

生成密钥流

接下来介绍 T(k)T(k) 的生成方法。

  1. kk 将 LFSR17 和 LFSR25 初始化;
  2. c0c\gets 0
  3. 重复以下操作 nn 次:
    • xx 为 LFSR17 执行一步的结果;
    • yy 为 LFSR25 执行一步的结果;
    • zx+y+cz\gets x+y+c
    • cz/256,zzmod256c\gets \lfloor z/256\rfloor,z\gets z\bmod 256
    • zz 新增到密钥流的末尾。

给定部分密钥流,确定一个可能的密钥 kk,使得它能够生成符合条件的密钥流。

输入格式

第一行,一个正整数 nn

第二行,nn 个整数 t1,t2,,tnt_1,t_2,\cdots,t_n,描述一个密钥流。

  • 如果 ti=1t_i=-1,表示 tit_i 未知。否则 ti[0,256)t_i\in [0,256)

输出格式

输出一行一个长度为 424201\texttt{01} 串,表示密钥 kk

数据保证有解。 输出任意一组合法解均可。

7
154 39 225 99 151 145 -1
011000110010100101100110000000000000111011

提示

评分方式

对于 100%100\% 的数据,保证 1n5001\le n\le 500保证有解

mm 表示已知的密钥流中元素的个数。

输入文件名 nn\le mm\le 得分
decss-1.in\texttt{decss-1.in} 20 20 2020 8 8
decss-2.in\texttt{decss-2.in} 25 25 2121
decss-3.in\texttt{decss-3.in} 20 20 88
decss-4.in\texttt{decss-4.in} 30 30 1010
decss-5.in\texttt{decss-5.in} 31 31 88 9 9
decss-6.in\texttt{decss-6.in} 30 30 2020
decss-7.in\texttt{decss-7.in} 200 200 99 12 12
decss-8.in\texttt{decss-8.in} 300 300 1212
decss-9.in\texttt{decss-9.in} 500 500 13 13
decss-10.in\texttt{decss-10.in}

样例解释

步数 周期 LFSR17 LFSR25 xx yy cc zz
初态 1 1100 0110 0101 0010 1 1001 1000 0000 0000 0011 1011 00
1 1 1000 1100 1010 0100 1 0011 0000 0000 0000 0111 0110
2 1 0001 1001 0100 1000 0 0110 0000 0000 0000 1110 1101
3 0 0011 0010 1001 0001 0 1100 0000 0000 0001 1101 1011
4 0 0110 0101 0010 0010 1 1000 0000 0000 0011 1011 0110
5 0 1100 1010 0100 0100 1 0000 0000 0000 0111 0110 1101
6 1 1001 0100 1000 1001 0 0000 0000 0000 1110 1101 1011
7 1 0010 1001 0001 0011 0 0000 0000 0001 1101 1011 0110
8 0 0101 0010 0010 0111 0 0000 0000 0011 1011 0110 1101
1 228228 182182 11 154154
9 0 1010 0100 0100 1111 0 0000 0000 0111 0110 1101 1011
10 1 0100 1000 1001 1111 0 0000 0000 1110 1101 1011 0111
11 0 1001 0001 0011 1110 0 0000 0001 1101 1011 0110 1110
12 1 0010 0010 0111 1101 0 0000 0011 1011 0110 1101 1101
13 0 0100 0100 1111 1010 0 0000 0111 0110 1101 1011 1011
14 0 1000 1001 1111 0100 0 0000 1110 1101 1011 0111 0110
15 1 0001 0011 1110 1001 0 0001 1101 1011 0110 1110 1101
16 0 0010 0111 1101 0011 0 0011 1011 0110 1101 1101 1010
2 203203 9191 11 3939
17 0 0100 1111 1010 0110 0 0111 0110 1101 1011 1011 0100
18 0 1001 1111 0100 1101 0 1110 1101 1011 0111 0110 1001
19 1 0011 1110 1001 1011 1 1101 1011 0110 1110 1101 0010
20 0 0111 1101 0011 0111 1 1011 0110 1101 1101 1010 0100
21 0 1111 1010 0110 1111 1 0110 1101 1011 1011 0100 1000
22 1 1111 0100 1101 1111 0 1101 1011 0111 0110 1001 0001
23 1 1110 1001 1011 1110 1 1011 0110 1110 1101 0010 0010
24 1 1101 0011 0111 1100 1 0110 1101 1101 1010 0100 0101
3 6262 162162 00 225225
25 1 1010 0110 1111 1000 0 1101 1011 1011 0100 1000 1011
26 1 0100 1101 1111 0001 1 1011 0111 0110 1001 0001 0110
27 0 1001 1011 1110 0011 1 0110 1110 1101 0010 0010 1101
28 1 0011 0111 1100 0110 0 1101 1101 1010 0100 0101 1011
29 0 0110 1111 1000 1100 1 1011 1011 0100 1000 1011 0111
30 0 1101 1111 0001 1001 1 0111 0110 1001 0001 0110 1111
31 1 1011 1110 0011 0010 0 1110 1101 0010 0010 1101 1110
32 1 0111 1100 0110 0101 1 1101 1010 0100 0101 1011 1101
4 166166 189189 11 9999