【问题标题】:bitxor, solve equation, boolean logic位异或,求解方程,布尔逻辑
【发布时间】:2013-04-01 14:54:34
【问题描述】:

我有方程式:

C = A^b + (2*A)^b + (4*A)^b.  

其中 C 和 A 已知,但 b 未知。如何找到b? 所有数字都是 8 位字节。有没有比暴力破解更快的方法?

【问题讨论】:

  • a^b 有 bitxor(a,b)
  • 那么“*”应该是什么 - 整数乘法?

标签: math logic bit-manipulation equation


【解决方案1】:

+ 号是否表示字节加法和 * 乘法,溢出位被丢弃?如果是这样,我认为答案是

b = C ^ (A + 2 * A + 4* A)

如何得出这个结论:

C = A^b + (2*A)^b + (4*A)^b

因此

C^b = A^b^b + (2*A)^b^b + (4*A)^b^b = A + 2*A + 4*A

然后

C^C^b = b = C^(A + 2*A + 4*A)

编辑只是为了确保:这个答案不正确。真丢人。我将不得不考虑更多。

【讨论】:

  • 第一步不正确,XOR 不分布在二进制加法上。例如取 A = 0x00, C = 0x01,实际答案是 b = 0xAB。
  • @DPenner:你是对的。老鼠!我以为我已经检查过了,但显然还不够好。
【解决方案2】:

我采用相同的假设:+* 是加法和乘法,忽略溢出。

查找表

这可能是最快的解决方案:预先计算结果,并将它们存储在查找表中。它需要 216 字节的内存,即 64 kB。

猜测、检查、改进方法

以类似 C 家族的伪代码呈现:

byte Solve(byte a, byte c){
    byte guess = lastGuess = result = lastResult = 0;

    do {
        guess = lastGuess ^ lastResult ^ c;            //see explanation below
        result = a^guess + (2*a)^guess + (4*a)^guess; 
        lastGuess = guess;
        lastResult = result;
    } while (result != c);

    return guess;
}

这个算法的想法是它猜测b 是什么,然后将其代入公式以获得暂定结果,并与c 进行核对。猜测中导致结果与c 不同的任何位都会更改。这对应于最后一个猜测、最后一个结果和c 的异或(如果这个陈述有点跳跃,我鼓励你画一个真值表,而不是只信我的话!)。

说明

之所以有效,是因为更改位只能影响该位的结果,以及更高位的结果,但不会影响更低的位(因为当您用笔和纸进行加法时,进位可以传播到左侧)。因此,在最坏的情况下,算法需要 2 次猜测才能使最低有效位正确,第 2 个 lsb 的另一个猜测,第 3 个的另一个猜测,等等。对于给定 @ 的任意组合,最多 9 个猜测 987654328@和c

这是我的测试程序的示例跟踪:

a: 00001100
c: 01100111

Guess:  01100111
Result: 01000001
Guess:  01000001
Result: 00010111
Guess:  00110001
Result: 01100111

b: 00110001

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多