【问题标题】:Initialization Vector Creation初始化向量创建
【发布时间】:2012-11-23 23:17:28
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 可能更适合crypto.stackexchange.com
  • IV 是一个随机数,旨在防止使用相同密钥对相同纯文本进行加密时总是产生相同的密文。
  • @DuncanJones 也许……也许。 ;)

标签: random cryptography aes initialization-vector


【解决方案1】:

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

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

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

【讨论】:

  • 好的,所以如果我将“鼠标移动方法”与 Fortuna 等加密安全 PRNG 一起使用,我得到的随机数“足够随机”,可以将它们用作种子下次程序启动时?这有什么已知的限制吗? x程序重新启动/生成种子后,我是否必须由用户“刷新随机性”?
  • 主要问题是在你积累足够的初始熵之前,你不能发出任何随机数。这很难估计。
  • 嗯,我的意思是初始熵应该不是问题,我认为超过 30 秒的随机鼠标移动是一个非常好的熵源。问题是在我必须再次要求用户执行鼠标操作之前,我可以使用然后生成的随机数作为种子多长时间。
  • @cooky451 1) 使用系统 API。它们比你能做的任何东西都要好。 2)原则上,种子是好的或几乎无限量的数据。 3)您的实际问题将是在您的持久存储重置为旧值后重用随机数据。所以我不喜欢持久存储。
  • 1) 这个项目的目的是学习一些东西,我不想使用系统API。我知道这更容易,但这里的目标不是“完成任务”。 3)我不明白。持久存储是指 PRNG 的状态?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 旁注:大多数硬件安全模块 (HSM) 必须使用 PRNG 才能符合加密标准,例如FIPS 140-2,尽管它们通常来自纯随机源。
    • Windows 在运行时确实会收集随机性。
    • @GregS:是吗?为什么像 putty 这样的程序会要求你移动鼠标呢?
    • @Bas Wijnen 看看 Windows 上的 std::random_device 实现。
    • @cooky451:根据 msdn:“该类描述了随机数的来源,最好来自非确定性外部设备。在此实现中,默认生成的值不是非确定性的。”在另一个来源(cppreference.com)中,它说“std::random_device 是一个均匀分布的整数随机数生成器,如果非确定性源(例如硬件设备)可用于执行。”听起来它只有在您安装了特殊的随机设备时才有效,并且它不使用鼠标移动等
    猜你喜欢
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多