std :: random_device加密是否安全?

ar2*_*015 6 c++ random cryptography c++11

我看到很多人std::random_device一起谈论安全问题.

例如,这里是幻灯片22.

cppreference,std::random_device:

std :: random_device是一个均匀分布的整数随机数生成器,它产生非确定性随机数.

它没有明确谈论安全性.

是否有任何明确提及的有效参考std::random_device对加密是安全的?

txt*_*elp 6

不,因为那不是std::random_device设计的目的;它旨在生成随机数,而不是为了确保安全。

在安全性方面,随机性对于密钥生成很有用,但是随机性并不是绝对必要的。例如,AES不使用任何随机性,但是AES-256是用于在美国加密最高机密信息的加密工具。

随机性和安全性交叉的一个领域是生成和使用随机密钥。如果我可以猜出种子并知道所使用的随机协议,那么很有可能我可以使用相同的种子值生成相同的“随机”值,从而生成相同的密钥。

std::random_device如果有硬件模块,它将使用硬件模块(例如硬件TPM),否则将使用操作系统具有的任何功能作为RNG(例如CryptGenRandomWindows或/dev/random* nix系统),甚至可能是PRNG(伪随机数)生成器),它可能会生成相同的数字,具体取决于所使用的随机数算法。附带说明:就像将AES指令集集成到芯片组中以加快加密和解密速度一样,随着算法被移植到硬件中,硬件RNG有助于提供更大的熵池和更快的随机数生成。

因此,如果您正在使用std::random_device任何形式的加密密钥生成,则需要知道要在要部署到的系统上使用什么随机数生成器,否则可能会发生冲突,从而使加密的系统容易受到重复密钥的影响攻击类型。

希望能对您有所帮助。

  • 权威人士的很好论据,尽管您的工作当然不需要了解密码系统在内部的工作原理,但我给您提供了很好的论据。您显然甚至都不知道IV是什么,更不用说为什么它通常应该是随机的了。使用密码短语创建IV会很疯狂,因为IV的真正目的是成为一个随机数(使用一次的数字)。这使它与密钥不同,密钥可以多次使用,并且很好地来自密码短语。IV通常与密文一起未加密地存储,这解释了为什么加密密钥管理器可能永远都不知道它的原因。 (2认同)
  • (续)正确使用的IV可以确保即使多次加密相同的消息,也可以产生不同的密文。不具有此属性的密码系统应被视为高度不安全。在第二次世界大战中,基于明文通常以“ Heil Hitler”开头的知识,盟友能够破译许多Enigma消息。问题是,即使您使用的是具有相同IV的AES,也很明显哪些消息都以相同的短语开头,因为密文也将以相同的字节序列开头。 (2认同)

Maa*_*wes 5

TL; DR:仅std::random_device用于为此库中定义的PRNG生成种子.否则,使用加密库(如Crypto ++,Bothan,OpenSSL等)生成安全随机数.


为了了解为什么std::random_device需要,根据定义的上下文来看它是很重要的.

std::random_device是一个的一部分一套被用来生成确定性/伪类和方法随机数字序列.一个例子 - 也在幻灯片中显示 - 是Mersenne twister算法,它肯定不是加密安全的.

现在这一切都非常好,但由于定义的算法都是确定性的,这可能不是用户可能会追求的:他们想要一个不会一直产生相同流的快速随机数生成器.种子不安全的PRNG 需要某种熵源.这是实施的地方std::random_device,它用于播种Mersenne twister(如答案中提到的幻灯片所示).

std::random_device只要提供非确定性随机数,由此提供的熵源可能很慢.如果它是加密安全的,那么这不会被视为缺点.种子最终没有安全要求 - 毕竟它将用于播种非安全的PRNG.只要它比以毫秒为单位的时间更好,它可能就好了.

对于Mersenne捻线机而言,载玻片显示出约250倍的速度差异,而慢速系统提供了非确定性随机数发生器.这清楚地说明了为什么本地的,确定性的PRNG可以帮助加速随机数生成.请注意,当从多个线程使用时,本地PRNG不会减速.当多个线程访问时,系统生成器可以很快,但这肯定不是给定的.有时系统RNG甚至可能阻止或有延迟或相关问题.

  • 我同意你所说的,但附带说明:本地 PRNG 可以是安全的(模内存保护)并且速度也很快,例如 ChaCha。系统生成器很慢,部分原因是系统调用开销。此外,与现代 PRNG 相比,Mersenne Twister 既不快速*也不*优质,并且使用了*大量*的内存。 (2认同)