2025Parloo杯密码学方向题解
1.循环锁链
已知密文前五字节分别为 0x11 0x0D 0x19 0x0E 0x12,对应明文为 "palu{" (ASCII 0x70 0x61 0x6C 0x75 0x7B)。可以尝试计算已知明文字节与相应密文字节之间的异或关系:
0x70 ^ 0x11 = 0x61,得到字符'a'0x61 ^ 0x0D = 0x6C,得到字符'l'0x6C ^ 0x19 = 0x75,得到字符'u'0x75 ^ 0x0E = 0x7B,得到字符'{'
以上计算结果正好是明文的后续字符。换句话说,每次用当前明文字符与对应密文字节异或,会得到下一个明文字符。从已知部分继续下去:
0x7B ^ 0x12 = 0x69,得到字符 'i'
由此可以推断出解密规则:假设明文字节序列为 $P[0],P[1],\dots,P[n-1]$,密文字节序列为 $C[0],C[1],\dots,C[n-1]$。观察到有规律的关系是
P[i]⊕C[i]=P[i+1]P[i] \oplus C[i] = P[i+1]P[i]⊕C[i]=P[i+1]
对以上等式变形可得
C[i]=P[i]⊕P[i+1] .C[i] = P[i] \oplus P[i+1],.C[i]=P[i]⊕P[i+1].
这说明每个密文字节都是相邻两明文字节按位异或的结果。由于题目提示“每个字节都被锁在了一个无尽的循环中,只有找到起点才能解开”,可推测加密是循环的,即最后一个明文字节与第一个明文字节也按同样规律异或形成最后一个密文字节:
C[n−1]=P[n−1]⊕P[0] .C[n-1] = P[n-1] \oplus P[0],. C[n−1]=P[n−1]⊕P[0].
根据上述规则,只要已知任意一个明文字节(这里已知 P[0]='p'),就可以通过迭代恢复全体明文(考虑循环闭合关系)zh.wikipedia.orgblog.csdn.net。具体解密过程为:
初始化:设
P[0] = 'p' (0x70)。迭代解密:根据关系
P[i+1] = P[i] XOR C[i],依次计算:P[1] = 0x70 ^ 0x11 = 0x61(‘a’),与已知a一致。P[2] = 0x61 ^ 0x0D = 0x6C(‘l’)。P[3] = 0x6C ^ 0x19 = 0x75(‘u’)。P[4] = 0x75 ^ 0x0E = 0x7B(‘{’)。P[5] = 0x7B ^ 0x12 = 0x69(‘i’)。
依次类推,使用每个新的P[i]和密文C[i]求得下一个P[i+1]。
循环闭合:恢复到序列末尾时,通过
P[n-1] ^ P[0]应当等于最后的C[n-1],以验证假设。计算得到P[36]='}' (0x7D)与P[0]='p' (0x70)异或得到0x0D,恰好与给定最后一个密文字节一致,证明了循环关系。
综上,加密逻辑为“循环异或相邻明文字节”,即 C[i] = P[i] XOR P[(i+1) mod n]。利用这一规则和已知起始明文,我们逐字节还原出完整明文。最终恢复出的明文为:
palu{iC7uDoJJMAWnIhkkCNiIoCZZVmiPrk9}