有趣的字节混合方程及其逆
Interesting Byte Mix Equation and it's inverse
我最近遇到了这个混合字节值的有趣等式(来自幽灵代码):
MixedByte = ((ByteToMix * 167) + 13) & 0xFF
或
MixedByte = BITAND((ByteToMix * 167) + 13, 255)
其中 returns 每个值 0-255 的混合值 0-255 没有重复值或缺失值。 IE。重新排序值。
因为我的数学不是很好,所以我玩弄方程式试图找出反函数。
通过反复试验,我最终偶然发现了解决方案:
OriginalByte = (MixedByte * 23 + 213) & 0xFF
或
OriginalByte = BITAND(MixedByte * 23 + 213, 255)
任何人都可以解释我如何在不使用跟踪和错误的情况下确定正确的反函数吗?
这不是真正的位操作。这是 mod 元算术。
"And"255 与 mod256 相同。
每个整数mod256都有一个multiplicative inverse. It can be computed with a modified version of Euclid's algorithm。但那已经为你完成了。
检查 167 here 的 mod 倒数。你会发现它是 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)
,mod元算术的另一个恒等式。 -23*13 + 2*256 = 213
.
验证了这一点
每个编程人员都应该在这个级别学习一些数论。
我最近遇到了这个混合字节值的有趣等式(来自幽灵代码):
MixedByte = ((ByteToMix * 167) + 13) & 0xFF
或
MixedByte = BITAND((ByteToMix * 167) + 13, 255)
其中 returns 每个值 0-255 的混合值 0-255 没有重复值或缺失值。 IE。重新排序值。
因为我的数学不是很好,所以我玩弄方程式试图找出反函数。
通过反复试验,我最终偶然发现了解决方案:
OriginalByte = (MixedByte * 23 + 213) & 0xFF
或
OriginalByte = BITAND(MixedByte * 23 + 213, 255)
任何人都可以解释我如何在不使用跟踪和错误的情况下确定正确的反函数吗?
这不是真正的位操作。这是 mod 元算术。
"And"255 与 mod256 相同。
每个整数mod256都有一个multiplicative inverse. It can be computed with a modified version of Euclid's algorithm。但那已经为你完成了。
检查 167 here 的 mod 倒数。你会发现它是 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)
,mod元算术的另一个恒等式。 -23*13 + 2*256 = 213
.
每个编程人员都应该在这个级别学习一些数论。