来自Spectre代码的字节混合方程及其逆函数探究
关于Spectre代码中字节混合置换的发现与逆函数推导
嘿各位,最近我在Spectre的代码里挖到一个挺有意思的字节混合方程,它居然是个完美的字节置换函数——能把0-255的所有字节值无重复、无遗漏地重新映射到0-255区间,相当于给单字节做了个彻底的“洗牌”操作。
正向混合方程
这个方程有两种常见写法:
// 通用编程语言写法 MixedByte = ((ByteToMix * 167) + 13) & 0xFF
// 类VB风格写法 MixedByte = BITAND((ByteToMix * 167) + 13, 255)
它能实现完美置换的核心原因是:乘数167和256的最大公约数为1,这种带常数偏移的线性变换(仿射变换)在模256的有限域中是双射函数,自然不会出现重复或遗漏的映射结果。
逆函数的推导过程
说实话我数学基础不算扎实,一开始没想着从数论角度直接推导逆元,而是靠反复试错、调整参数,最后偶然找到了对应的逆函数:
// 恢复原始字节的逆函数 OriginalByte = ((MixedByte - 13) * 23) & 0xFF
OriginalByte = BITAND((MixedByte - 13) * 23, 255)
后来翻资料才明白,这个逆函数其实有严谨的推导逻辑:对于仿射变换 y = (a*x + b) mod 256,逆变换就是 x = a⁻¹*(y - b) mod 256,其中a⁻¹是a在模256下的乘法逆元。这里167的逆元是23,因为167 * 23 = 3841,而3841 mod 256 = 1,刚好满足逆元的定义。
内容的提问来源于stack exchange,提问作者Walter
相关产品推荐
相关产品推荐

