每次创建新卷时移动鼠标时是否都称为“回合”?我说的是卷创建过程中带有随机数的屏幕。做随机运动的目的是什么?
我看到 Lastpass 现在正在做“100,000 轮”,我不确定这到底是什么意思。
全新的加密世界在这里:)
每次创建新卷时移动鼠标时是否都称为“回合”?我说的是卷创建过程中带有随机数的屏幕。做随机运动的目的是什么?
我看到 Lastpass 现在正在做“100,000 轮”,我不确定这到底是什么意思。
全新的加密世界在这里:)
你正在创造一种叫做“熵”的东西。如果在软件中实现,计算机内的随机数生成器最多只能是伪随机的。伪随机数生成器 (PRNG) 从种子开始。如果种子是众所周知的,那么任何了解 PRNG 算法的人都可以得出与您得出的相同的值(这实际上对于需要可再现性元素的模拟之类的事情非常有用 - 它不适合加密)。所以你需要从一个不知名的种子开始。传统上(不是加密货币!)这个种子是计算机的一天中的时间。然而,对于加密,你需要比这更强的随机性。
在许多商业环境中,通常要求随机数生成器 (RNG) 基于基于硬件的“噪声源”。这可能是随机网络数据包数据、撞击探测器的光子数量、空气通过传感器的速度,或者可能被认为是真正随机的任何组合。
不幸的是,这些基于硬件的噪声源通常不会在消费环境中广泛使用。所以下一个最好的事情是从其他东西中提取基于硬件的噪音。许多加密系统使用人类移动鼠标来获取此信息。即使人类绕圈或前后移动鼠标,鼠标路径偏差中通常仍然存在足够的实际真实世界随机性,以提供合理水平的熵来播种 PRNG。
对于来自环境的熵的真实示例,只需看看在彩票笼中旋转的空气球。
“回合”与熵收集无关,与特定算法运行的次数有关。几乎总是有(?)一种反馈机制,允许一轮影响后面的轮。增加轮数会增加加密/解密数据所需的时间。这很重要,因为它可以严重降低任何暴力解密工作的规模。当然,它也会减慢加密工作的速度。
关键是提供熵。Truecrypt 必须为该卷生成一个密钥。它通过生成一堆随机位来实现。在这里(就像在密码学中经常发生的那样),重要的并不是构成密钥的位在统计意义上是随机的,而是攻击者无法预测或复制密钥。计算机是确定性机器¹:如果攻击者知道您开始生成密钥时它处于什么状态,他可以运行 Truecrypt 并生成相同的密钥。
通过移动鼠标,您提供了攻击者无法复制的输入。您提供的输入越多,复制密钥就越难。例如,如果计算机只记录了一个动作为左或右,那么可能只有两个键,攻击者可以同时尝试;密钥只有 1 位熵(无论密钥有多长)。理想情况下,密钥必须是完全随机的;如果密钥是 128 位密钥,则随机数生成器必须有 128 位可用的熵。人类的运动在某种程度上是可以预测的(你不会将鼠标向左移动两米),但是你移动得越多,你输入池中的熵就越多。
鼠标运动与 100,000 发无关。回合是一个不同的问题,与攻击者重现您的密码的难度有关。众所周知,人类不善于选择和记住复杂的密码,因此攻击者可以通过蛮力尝试所有可能的密码。出于这个原因,使用密码的加密系统不会按原样使用它们,而是执行一些计算(例如加密哈希;PBKDF2这几天一般推荐)上密码多次。这种计算很昂贵;它的运行时间与轮数成正比。每次尝试输入密码时,系统必须执行一次这种迭代计算;攻击者还必须在每次密码尝试时执行一次。如果您的系统在您挂载卷时需要 1 秒而不是 10 微秒来处理您的密码,这没什么大不了的,因为无论如何密码处理只是您使用 CPU 的一小部分。但是对于将所有 CPU 时间都用于暴力破解密码的攻击者来说,每秒只能执行 1 次破解尝试,而不是每个 CPU 100,000 次,这是一个很大的打击。
¹一些计算机有一个硬件随机数生成器,它从物理上无法预测(或至少隐藏且极难预测)的来源中获得随机性。核衰变对此有好处,但不切实际。在移动设备上,相机白噪声效果相当好。但是许多计算机缺乏这样的硬件随机发生器。
Truecrypt 生成 MOUSEHOOKSTRUCT 结构的 CRC32,该结构由 Windows 填充,并在您移动鼠标时传递给 Truecrypt 定义的回调函数。看一下定义:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644968%28v=vs.85%29.aspx
使用整个结构,包括在调用之间不改变的成员,例如 hwnd。由于命中测试功能,如果将鼠标移动到窗口边界上方和周围,可以说获得更好的熵。或者,也许你削弱它。你可以考虑一下。
如果结构的 CRC 与上次执行 Truecrypt 的回调不同,那么它将生成 GetTickCount() 返回的 32 位滴答计数的 CRC32。默认情况下,结构的 CRC 和滴答计数相加并使用 RIPEMD160 进行散列。然后使用生成的哈希通过 XOR 操作修改随机池。
看着它让我想知道这个过程真正增加了多少随机性。y,x 坐标中的可能值范围并不大。对于特定的密钥生成,窗口句柄将是随机的,但每次鼠标采样时都将保持不变。命中测试可以返回少量的枚举值。鼠标的某些行为会导致它始终返回单个值。有一个指向更多信息的指针。我不确定这是什么时候设置的。
使用伪随机生成器生成随机数可能会被极度偏执的人怀疑,因此将一些随机性链接到用户定义的输入可以让您确信您是“安全的”