QOJ.ac

QOJ

Type: Editorial

Status: Closed

Posted by: AzusaShirasu

Posted at: 2026-02-21 21:07:50

Last updated: 2026-02-21 22:02:59

Back to Problem

New Editorial for Problem #9872

单轮加密有三个操作:异或(xor)、S 盒(perm)、混合(mix)。前两个操作都是在原地对半个字节进行替换,真正让数据互相影响的是 mix。观察题目能发现输入的左半边 0/1/2/3 去了 0/2/4/6,右半边 4/5/6/7 去了 1/3/5/7,奇偶可以分离,所以从密文往回倒推一轮,偶数位密文只和 $K_0, K_2, K_4, K_6$ 有关,奇数和 $K_1, K_3, K_5, K_7$ 有关,所以是把 32 位密钥拆成两个 16 位密钥去搞。

然后开始爆破密码。这个密码有个零和性质,就是说,如果往里面输入 16 组明文,这组明文只有第 0 个数不一样,并且取值取满 0~15,会发现:

  • 第一轮:0 号位和 2 号位变了;
  • 第二轮,0、2、4、6 变了;
  • 第三轮,所有八个偶数位置都变了,而且每个位置的数据正好都是 0~15 全排列;
  • 第四轮,因为是 xor 出来的,所以任何一个位置的异或和肯定为 0;

要检验爆破的密钥对不对,只需要把这 16 个密文往回倒推到第 4 轮 mix 输出的那个地方,然后把这 16 个结果异或起来。如果是 0 就 crack 成功了。如上爆破过程想多少轮都可以,不过实测会发现不一定能排除到唯一情况,没关系,能把 65536 种情况种的绝大部分排除。最后会出现奇数位的密钥一个备选池、偶数位的密钥一个备选池,然后再枚举两两组合,直接拿去给明文加密看看是不是就行了。

Comments

No comments yet.