我最近和Random
课一起玩过,我想到了“逆转”种子过程
例如:种子10000
生成此数据集:0x32 0xb3 0x84 0xf5 0x30
。
Random random = new Random(10000);
byte[] storage = new byte[5];
random.NextBytes(storage);
我的问题是,如果可以获取给定数据集的种子
类似于:var seed = GetSeed(new byte[] { 0x32, 0xb3, 0x84, 0xf5, 0x30 }); // returns 10000
我很确定这是不可能的(某种程度上不可能将哈希值恢复为源文本)但也许我错了。
答案 0 :(得分:2)
只要尝试所有可能的种子,就可以提出警告(见下文),甚至没有偷看实施。它们的数量是有限的,所以这绝对是可计算的。实际上它甚至不会花很长时间,只有大约20亿(负种子被否定)种子。
需要注意的是,多个实际上不同的种子(因此忽略否定种子)可以生成一个启动相同的序列。对于明显的情况,考虑1字节序列 - 有更多的种子而不是256,所以它们必须重复使用。更长的序列可能会变得不吉利。
某种程度上,它无法将哈希值恢复为源文本
您可以以相同的方式生成散列的前映像,只需尝试所有内容(所有字符串,从短字符串开始 - 虽然有无限多个字符串,但如果对此有合理假设,您会在有限时间内找到匹配哈希函数hold)。不同之处在于哈希值更大,因此需要太长时间。当然,多个字符串映射到相同的哈希值,这并不意味着您将找到原始文本,但理论上,您可以找到一个"同样好的文本"作为原文。