P11304 [COTS 2016] 破译 DeCSS

题目背景

译自 [Izborne Pripreme 2016 (Croatian IOI/CEOI Team Selection)](https://hsin.hr/pripreme2016/) D1T1。 提交答案时,采用文件名为 $\texttt{decss-*.out}$。

题目描述

**这是一道提交答案题。** 输入文件可以在附件中下载。 ### 基本定义 **内容扰乱系统**(Content Scramble System,CSS)是一种对 DVD 进行加密的技术,以期保护版权。为了方便做题,此题对 CSS 进行了一定的简化。 **密钥** $k$ 是一个长度为 $42$ 的 $\texttt{01}$ 序列 $k_1,k_2,\cdots,k_{42}$。 **明文**、**密文**是由 $n$ 个字节组成的序列。 **密钥流** $T(k)$ 同样是由 $n$ 个字节组成的序列。 加密时,首先基于密钥 $k$ 生成密钥流 $T(k)$,然后将密钥流与明文按位异或,即得到密文。如果已知密文和部分明文,即可得到部分密钥流。 在本题中,你需要基于部分密钥流 $T(k)$ 确定一个可能的密钥 $k$。 --- ### LFSR 从密钥生成密钥流使用了线性反馈移位寄存器(LFSR)。 LFSR 的状态由 $m$ 位二进制位 $b_1\sim b_m$ 组成。定义**反馈位置集** $S\subseteq \{1,2,\cdots,m\}$,它控制输出时会基于哪些位进行运算。 在一个**周期**内,LFSR 会做如下的事情: - 输出 $\displaystyle b=\bigoplus_{i\in S} b_i$,其中 $\oplus$ 表示按位异或运算。 - 对于 $1\le i\lt m$,**同时**令 $b_i\gets b_{i+1}$,并让 $b_m\gets b$。 LFSR 的一**步**由 $8$ 个周期组成,一步输出一个字节。令这 $8$ 个周期输出的位为 $i_1\sim i_8$,则该步输出的字节为 $(\overline{i_8i_7i_6i_5i_4i_3i_2i_1})_2$。 CSS 使用的 LFSR 有: | 名称 | $m=$ | $S=$ | 初始状态 | | :--: | :--: | :--: | :--: | | LFSR17 | $17$ | $\{1,15\}$ | $k_1,k_2,\cdots,k_{17}$ | | LFSR25 | $25$ | $\{1,4,5,13\}$ | $k_{18},k_{19},\cdots,k_{42}$ | ------ ### 生成密钥流 接下来介绍 $T(k)$ 的生成方法。 1. 用 $k$ 将 LFSR17 和 LFSR25 初始化; 2. $c\gets 0$; 3. 重复以下操作 $n$ 次: - 令 $x$ 为 LFSR17 执行一步的结果; - 令 $y$ 为 LFSR25 执行一步的结果; - 令 $z\gets x+y+c$; - $c\gets \lfloor z/256\rfloor,z\gets z\bmod 256$; - 将 $z$ 新增到密钥流的末尾。 给定部分密钥流,确定一个可能的密钥 $k$,使得它能够生成符合条件的密钥流。

输入格式

第一行,一个正整数 $n$。 第二行,$n$ 个整数 $t_1,t_2,\cdots,t_n$,描述一个密钥流。 - 如果 $t_i=-1$,表示 $t_i$ 未知。否则 $t_i\in [0,256)$。

输出格式

输出一行一个长度为 $42$ 的 $\texttt{01}$ 串,表示密钥 $k$。 **数据保证有解。** 输出任意一组合法解均可。

说明/提示

#### 评分方式 对于 $100\%$ 的数据,保证 $1\le n\le 500$,**保证有解**。 令 $m$ 表示已知的密钥流中元素的个数。 | 输入文件名 | $n\le $ | $m\le $ |得分 | | :--: | :--: | :--: | :--: | | $\texttt{decss-1.in}$ | $ 20 $ | $20$ | $ 8 $ | | $\texttt{decss-2.in}$ | $ 25 $ | $21$ | ^ | | $\texttt{decss-3.in}$ | $ 20 $ | $8$ | ^ | | $\texttt{decss-4.in}$ | $ 30 $ | $10$ | ^ | | $\texttt{decss-5.in}$ | $ 31 $ | $8$ | $ 9 $ | | $\texttt{decss-6.in}$ | $ 30 $ | $20$ | ^ | | $\texttt{decss-7.in}$ | $ 200 $ | $9$ | $ 12 $ | | $\texttt{decss-8.in}$ | $ 300 $ | $12$ | ^ | | $\texttt{decss-9.in}$ | $ 500 $ | ^ | $ 13 $ | | $\texttt{decss-10.in}$ | ^ | ^ | ^ | #### 样例解释 | 步数 | 周期 | LFSR17 | LFSR25 | $x$ | $y$ | $c$ | $z$ | | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | 初态 | | 1 1100 0110 0101 0010 | 1 1001 1000 0000 0000 0011 1011 | | | $0$ | | | | 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 | | | | $228$ | $182$ | $1$ | $154$ | | | 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 | | | | $203$ | $91$ | $1$ | $39$ | | | 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 | | | | $62$ | $162$ | $0$ | $225$ | | | 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 | | | | $166$ | $189$ | $1$ | $99$ |