【发布时间】:2020-06-14 16:12:52
【问题描述】:
据我了解,像RNGCryptoServiceProvider 这样的 CSRNG 仍然通过 PRNG 传递真正随机的用户数据,如鼠标移动等,以对输出进行排序并使其均匀分布。这些位需要完全独立。
(这是针对理论上无限计算能力的攻击者) 如果 CSRNG 获取 1KB 真正的随机数据并将其扩展为 1MB,那么攻击者所要做的就是生成 1KB 数据的每个组合,然后对其进行扩展,然后查看哪个 1MB 数据生成一个一次性填充,返回合理的英文输出.我在某处读到,如果一次性键盘在 RNG 中的任何地方都有 PRNG,它只是一种美化的流密码。我想知道真正随机的起始数据是否足够大,可以直接使用而不是加密扩展。我需要真正的随机输出来进行一次性填充,而不仅仅是加密安全的 RNG。或者也许有其他方法可以以某种方式获得真正的随机数据,以便所有位相互独立。我想用鼠标坐标异或几秒钟,然后可能是 Environment.TickCount 的最后一个数字,然后可能是麦克风输入(1、2、3、4)为好。但是,正如一些人在 stackoverflow 上指出的那样,我真的应该让操作系统来处理这一切。不幸的是,这是不可能的,因为使用了 PSRNG。我想避免使用硬件解决方案,因为这是一个易于使用的程序,并且也不使用 RDRAND,因为它也使用 PRNG(除非 RDRAND 可以在通过 PRNG 之前返回真正的随机数据??) .如果这样的事情是可能的,将不胜感激;我已经为此工作了数周,我的印象是 RNGCryptoServiceProvider 足以满足一次性使用的需求。谢谢。
(旁注:有人说对于大多数加密函数,您不需要真正的熵,只需要不可预测性。对于一次性填充,它必须是随机的,否则它不是一次性填充。)
【问题讨论】:
-
你想多了。据任何人所知,RNGCryptoServiceProvider 足以满足一次性使用的需求。你的论点真正表明一次性垫是一种效率极低的设计,这就是为什么不再使用它们的原因。相反,请使用经过充分研究的加密算法,例如 AES。
-
RNGCryptoServiceProvider 对于大多数事情来说已经足够了,但它仍然有一个使用随机数据作为种子的 PRNG。目前,只要您亲自交付密钥文件,我的一次性便笺实现就很好;它还包括一个 HMAC 以确保真实性。但是,对于一次性填充,所有位都必须是独立的,否则它“只是一个美化的流密码”。我正在寻找一种可以保证在未来十年、50 年或更长时间内安全的实施。没有人会使用它,但我喜欢制作任何人都无法打破的挑战。
-
好吧,我一点也不想让你气馁,请继续思考和尝试。安全性很复杂,加密可能会以微妙的方式失败。例如,您说您包含一个 HMAC。除非您小心 HMAC 可能会使您希望通过一次性便笺实现的“完美安全”保证失效。
-
HMAC 具有内置于 c# 的功能,因此确保正确完成并不难。只要确保键输入正确完成。谢谢鼓励!
标签: random cryptography entropy