题目名称: fffffhash
解题思路
下载附件后我们先审题
我们分析一下:
题目给出一个目标值 giao=201431453607244229943761366749810895688
程序接收一个16进制输入,转换为bytes
giaogiao函数的运算过程:
初始值 base_num = 0x6c62272e07bb014262b821756295c58d
x = 0x0000000001000000000000000000013b
对每个输入字节进行操作:
base_num = (base_num * x) & (MOD - 1)
base_num ^= i
解题思路:
这是一个逐字节运算的过程
每一步都可以逆向:
XOR运算的逆运算还是XOR
乘法在模2^128下可以用扩展欧几里得求逆元
可以从最后的giao值开始,逐字节反向计算:
对每一步:
先XOR掉当前字节
再乘以x的模逆元
我们使用sage运行,这是使用格基规约(Lattice Reduction)的解法
将问题转化为寻找短向量问题(SVP)
使用BKZ算法进行格基规约
通过构造特殊的格来找到原始输入序列
找到规约后的短向量
通过迭代计算恢复原始字节序列
将结果转换为十六进制字符串
即可获得交互的值