初始化矢量创建

时间:2012-11-23 23:17:28

标签: random cryptography aes initialization-vector

我的程序连接到服务器,服务器的公钥已经知道。然后程序将AES密钥与初始化向量一起加密,并将其发送到服务器。服务器对消息进行解密,从现在开始,AES用于加密对话。

我的问题是关于如何生成IV。如果我采用天真的方式并使用当前时间播种伪随机生成器,攻击者可能会对IV进行一些非常好的猜测,这不是我想要的诅咒。

由于硬件随机生成器不仅速度慢,而且无处可用,我想采用不同的方法。当客户端程序首次启动时,我让用户进行一些随机鼠标移动,就像TrueCrypt一样。我现在保存鼠标移动创建的“随机位”,当我需要一个生成器时,我会将它们用作种子。当然,每当我将它们用作种子时,随机位必须更新。这是我的问题:我想到只保存生成的新的“随机位”的前几个随机位。 (因此他们习惯于在下次软件启动时初始化随机引擎。)现在我不确定这是否足够随机,或者伪随机生成器是否会在这里显示可猜测的模式。 (我可能会使用std :: mt19937 http://en.cppreference.com/w/cpp/numeric/random

编辑:链接模式发生变化,因此我希望它适用于具有“最高”要求的模式。如果我没记错的话,这将是CBC。

请注意:我写的软件纯属实验性的。

3 个答案:

答案 0 :(得分:2)

使用加密PRNG,就像使用密钥一样。

在Windows上使用CryptGenRandom / RtlGenRandom,在Linux / Unix上使用/dev/urandom。那些由操作系统播种,所以你不需要照顾它。

如果您真的想创建自己的PRNG,请查看Fortuna。不要使用梅森捻线机。

答案 1 :(得分:1)

您应该明确您计划使用的链接模式。初始化向量的安全性要求很大程度上取决于它。

例如,在CBC模式中,IV必须是不可预测且唯一的。对于CTR模式,它必须只能是唯一的,不一定是不可预测的。

答案 2 :(得分:-1)

伪随机生成器非常适合您不希望用户能够预测结果的内容(例如游戏中的骰子),但对于您不希望计算机能够计算它。对于加密,请不要使用伪随机性。

如果您想要随机性,则需要实际的随机数据。在你写的时候,鼠标移动是一个很好的来源。鉴于你没有谈论/ dev / random,我认为你在Windows上运行,不幸的是,它在运行时没有收集随机性。所以你必须自己做。根据用例,你可以在启动时运行一个随机守护进程,它不断收集随机数据,并允许程序在需要时检索它,或者你可以要求用户在程序启动时进行一些鼠标移动。

或者您可以决定,如果Windows不希望您拥有真正的随机数据,您不想使用Windows,但我认为这不是一个选项。 ; - )