你能从另一个操作的最低有效位中检索出原始十进制数吗?
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 安全网络的一部分。当执行一种攻击(选择明文)时,我们到达了 253
和 231
的地步,但需要弄清楚 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(请参阅对混沌哈希函数和多重质数的攻击)。
我正在执行一项操作,其中函数 F(k,x)
接受两个 64 位值和 returns 它们的十进制数的乘积。例如:
F(123,231) = 123 x 231 = 28413
然后将数字转换为二进制并提取最低有效位。即,如果 28413 = 0110111011111101
那么我们取 11111101
,即十进制的 253
。
此功能是 Feistel 安全网络的一部分。当执行一种攻击(选择明文)时,我们到达了 253
和 231
的地步,但需要弄清楚 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(请参阅对混沌哈希函数和多重质数的攻击)。