Random 初始化向量创建

Random 初始化向量创建,random,cryptography,aes,initialization-vector,Random,Cryptography,Aes,Initialization Vector,我的程序连接到服务器,服务器的公钥已经知道。然后,程序将AES密钥与初始化向量一起加密,并将其发送到服务器。服务器解密消息,从现在起AES用于加密会话 我的问题是如何生成IV。如果我用最简单的方法,在当前时间内植入一个伪随机生成器,攻击者可能会对IV做出一些非常好的猜测,这不是我想要的 由于硬件随机生成器不仅速度慢,而且在任何地方都不可用,因此我想采用另一种方法。当客户端程序第一次启动时,我让用户随意移动鼠标,就像TrueCrypt一样。我现在保存鼠标移动产生的“随机位”,当我需要生成器时,我会

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

我的问题是如何生成IV。如果我用最简单的方法,在当前时间内植入一个伪随机生成器,攻击者可能会对IV做出一些非常好的猜测,这不是我想要的

由于硬件随机生成器不仅速度慢,而且在任何地方都不可用,因此我想采用另一种方法。当客户端程序第一次启动时,我让用户随意移动鼠标,就像TrueCrypt一样。我现在保存鼠标移动产生的“随机位”,当我需要生成器时,我会将它们用作种子。当然,每次我将随机位用作种子时,它们都必须得到更新。这就是我的问题:我想把生成的前几个随机位保存为新的“随机位”。(所以他们习惯于在下次软件启动时初始化随机引擎。)现在我不确定这是否足够随机,或者伪随机生成器是否会显示可猜测的模式。(我可能会使用std::mt19937)

编辑:链接模式更改,因此我希望它适用于具有“最高”要求的模式。如果我没记错的话,那就是CBC


请注意:我正在编写的软件纯粹是实验性的。

伪随机生成器适用于您不希望用户能够预测结果的情况(例如游戏中的掷骰子),但对于您不希望计算机能够计算结果的情况则毫无价值。对于密码学,根本不要使用伪随机性

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


或者你可以决定,如果Windows不想让你拥有真正的随机数据,你就不想使用Windows,但我想这不是一个选项

您应该明确计划使用哪种链接模式。初始化向量的安全性要求强烈依赖于此


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

使用加密PRNG,就像您对密钥所做的那样

在windows上使用
CryptGenRandom
/
RtlGenRandom
,在Linux/Unix上使用
/dev/uradom
。这些都是操作系统设定的种子,所以你不需要处理它


如果您真的想创建自己的PRNG,请查看。不要使用Mersenne绕圈器。

可能更适合?IV是一种临时密码,用于防止使用相同密钥对相同的纯文本进行加密时总是产生相同的密码文本。@DuncanJones可能。。可能吧旁注:大多数硬件安全模块(HSM)必须使用PRNG以符合加密标准,例如FIPS 140-2,尽管它们通常是从纯随机性源中播种的。Windows在运行时确实会收集随机性。@GregS:是吗?为什么putty之类的程序会要求您移动鼠标?@Bas Wijnen请看一下Windows上的std::random_设备实现。@cooky451:根据msdn:“该类描述了随机数的来源,最好是来自不确定的外部设备。在这个实现中,默认情况下产生的值不是非确定性的。”在另一个来源(cppreference.com)中,它说“std::random_设备是一个均匀分布的整数随机数生成器,如果是非确定性源(例如硬件设备),它会产生非确定性随机数听起来只有当你安装了一个特殊的随机性设备,并且它没有使用鼠标移动etcOkay,所以如果我使用我的“鼠标移动方法”和加密安全的PRNG(如Fortuna),我得到的随机数“足够随机”“下一次程序启动时将其用作种子?这有什么已知的限制吗?在x程序重新启动/生成种子后,我是否必须由用户“刷新随机性”?主要问题是,在积累足够的初始熵之前,您不得发出任何随机数。这很难估计。我的意思是初始熵应该不是问题,我认为30秒以上的随机鼠标移动是一个很好的熵源。问题是,在我再次要求用户使用鼠标之前,我可以使用随后生成的随机数作为种子多长时间。@cooky451 1 1)使用系统API。它们比你能做的任何东西都好。2) 原则上,种子是好的或几乎无限量的数据。3) 您的实际问题将是在永久存储重置为旧值后重新使用随机数据。因此,我不喜欢持久存储。1)本项目的目的是学习一些东西,我不希望使用系统API。我知道这比较容易,但这里的目标不是“把事情做完”。3) 我不明白。对于持久存储,您指的是PRNG的状态?