我最近遇到了这个有趣的等式(来自幽灵代码)混合了一个字节的值:
MixedByte = ((ByteToMix * 167) + 13) & 0xFF
或
MixedByte = BITAND((ByteToMix * 167) + 13, 255)
每个值0-255返回一个混合值0-255,没有重复或缺少值。 IE浏览器。重新排序值。
由于我的数学不是很好,所以我试着找出反函数的方程式。
通过追踪和错误,我最终偶然发现了解决方案:
OriginalByte = (MixedByte * 23 + 213) & 0xFF
或
OriginalByte = BITAND(MixedByte * 23 + 213, 255)
任何人都可以解释如何在不使用跟踪和错误的情况下确定正确的反函数吗?
答案 0 :(得分:3)
这并非真正有点操纵。它是模数运算。
"并且"使用255与mod 256相同。
每个mod 256的整数都有一个multiplicative inverse。它可以用modified version of Euclid's algorithm计算。但那已经为你完成了。
检查167 here的模数逆。您将找到它的结果23. x
的乘法逆的定义是一个数字,当乘以x
时会生成1.您可以验证(167 * 23) mod 256
是1.所以你在做生意。
然后一个简单的代数......解决b ...的这个等式。
a = 167 * b + 13 (mod 256)
像这样......
a - 13 = 167 * b (mod 256)
23 * (a - 13) = (23 * 167) * b (mod 256)
23 * a - 23 * 13 = 1 * b (mod 256)
b = 23 * a + 213 (mod 256)
这正是你的反面表达式。最后一步需要-23*13 = 213 (mod 256)
,这是模运算的另一个标识。这由-23*13 + 2*256 = 213
验证。
每个编程的人都应该在这个级别上学习一些数论。