你能从另一个操作的最低有效位中检索出原始十进制数吗?

Can you retrieve the original decimal number from the least significant bits of another operation?

我正在执行一项操作,其中函数 F(k,x) 接受两个 64 位值和 returns 它们的十进制数的乘积。例如:

F(123,231) = 123 x 231 = 28413

然后将数字转换为二进制并提取最低有效位。即,如果 28413 = 0110111011111101 那么我们取 11111101,即十进制的 253

此功能是 Feistel 安全网络的一部分。当执行一种攻击(选择明文)时,我们到达了 253231 的地步,但需要弄清楚 123.

有什么办法可以吗?

没有

通过删除最高有效位,操作呈现 单向。 为了恢复 123,您必须尽一切可能暴力破解函数,直到结果就是你想要的值。

即运行 F(x,231) 用于 x 的值,直到 F 的结果为 253。

也就是说,知道两个输入之一和输出使得暴力破解相对容易。这将取决于 x 的有效值的数量(例如,它总是一个 3 位数字吗?总是素数?总是奇数?)

可能还有其他一些捷径,具体取决于将数字 231 相乘的模式,但该数字的任何给定值都会有不同的模式。例如如果它是 9 而不是 231,你就会知道数字总和总是 9。

您的函数正在执行 F(k,x) = k*x mod 256

你的问题给出了F(k,x)x,你能找到k吗?

x为奇数时,有2^56个解,均有k = x^-1 * F(k,x) mod 256。也就是说,您计算 x mod 256 的倒数,并且每个可能的解决方案都是通过将 256 的倍数与 F(k,x) 的乘积与该值相加得出的。

x 是偶数时,您无法计算逆,但您仍然可以使用类似的技巧来确定解决方案。您需要首先计算除以 x 的二进制数 (2s),假设它是 t 个二进制数,然后从 x 和 [=23= 中除以 2^t ],然后从那里解决问题。即 k = (x/2^t)^-1 * F(k,x) mod (256/2^t).

通常在密码设计中使用乘法是危险的,特别是由于选择明文攻击,因为攻击者可以使事情消失以简化他的攻击。您可以找到像这样破解密码的示例 on my blog(请参阅对混沌哈希函数和多重质数的攻击)。