PGP 的密码强化

信息安全 公钥基础设施 pgp bcrypt 加密
2021-09-06 02:26:05

我想知道使用类似scryptbcrypt“增强”保护 PGP 私钥的密码的一些语义和安全含义。本质上,我问的是使用scrypt密码作为我的 PGP 私钥密码的含义。

据我了解,一个 PGP 密钥对本质上只是两个大素数及其乘积,而私钥是对称加密的。

我目前的想法是,这是一个非常好的主意,主要有两个原因。首先,这使您的密码不易受到字典攻击,因为输出scrypt极不可能是字典单词(您可以检查它)。

第二个也是更复杂的原因是蛮力尝试所需的计算能力。

让我们假设检查存储在私钥中的(解密的)素数的单一猜测的成本是A假设,给定一个泄露的加密私钥,检查一次猜测的成本是B假设计算成本scryptC

暴力破解 2048 位素数最多将花费 ,pi(2^2048) * A其中pi(x)素数的数量小于x假设私钥被泄露,并假设 20 个字符(160 位)密码的上限并非不合理,暴力破解密码的最大成本为2^160 * B. 假设一个被泄露的密钥的密码已知是N-character ( N*8bit)的结果scrypt,暴力破解密码的最大成本是2^160 * C * BOR 2^(N*8) * B(因为攻击者可以尝试使用scrypt或只是破解​​哈希本身)。

请注意,使用标准估计器,pi(2^2048) ~= 2.28*10^613.

让我们为计算的目的进行修复A = 1,我们将假设 B >= 2考虑到整数乘法的低成本,这似乎是合理的。

,scryptC可变的。如果我们考虑C = 10(计算scrypt比将两个大数相乘困难 10 倍),那么:

  • 暴力破解密钥的成本: 2.28*10^613
  • 暴力破解密码的成本:2^160 * 10 * 2 = 2.9 * 10^492^(N*8) * 2 = 2^(8N +1)

这里,2^(8N +1) = 2.9 * 10^49at around N = 21,这意味着如果C = 10,你只需要一个 21 个字符的散列就可以比散列更容易破解输入到散列。当然,拥有私钥本身仍然是有益的。

然而,scrypt有不同的难度,10可能是一个超级保守的估计。如果我们改为修复N = 128

  • 暴力破解密钥的成本: 2.28 * 10^6131
  • 暴力破解密码的成本:2^160 * C * 22^1024 * 2

这里,2^160 * C * 2 = 2^1024 * 2在 around C = 1.23 * 10^200,这显然是完全不合理的。这意味着,对于合理的散列长度,破解散列的输入可能总是比散列本身更好。

显然,如果我使用 的值N = 256,那么只要C > 1,实际上破解密钥比破解哈希更容易。

我认为假设是合理的C >= 1000有了这个假设,修复N=256,并假设我们的密码是P字符:

  • 暴力破解密钥的成本: 2.28 * 10^6131
  • 暴力破解密码的成本:2^(8P) * 1000 * 22^2048 * 2

人们需要P = 255使破解密码比破解密钥更难,这似乎不合理。

因此,似乎使用像scryptor这样的强硬哈希函数bcrypt可以大大提高猜键难度,即使对它们的强硬性进行保守估计也是如此。在密钥泄露的情况下,散列密码似乎也有帮助,但不是那么多。

我还有其他需要考虑的问题吗?我目前正在考虑一种“双密码”方法,其中密钥密码是passphrase + hash(another passphrase). 这似乎可以减轻使用我可能忽略的哈希结果加密素数的任何奇怪的数学特性。

编辑:只是先发制人,我不是(完全)白痴。我知道 PGP 定义了它自己的散列机制,S2K但是几乎没有人使用散列的“好”版本(默认情况下不启用),它缺乏良好的可配置性,并且很容易破解GPU 等加速器。所以,是的,我在这里在一定程度上建议“双重哈希”——但scrypt使用带有预设数据的特定哈希和抓取方法,并S2K使用好的 ol' 时尚指数和位方法。如果我记得我的密码学课程,那么只要一个函数的输出在另一个函数的域内(在这种情况下,它是),组合函数就没有问题。

1个回答

级联密码散列函数的常见问题是它们竞争 CPU。每个具有可配置迭代计数的密码哈希函数都应设置得尽可能高,限制是您作为用户的可用处理能力和耐心的组合。如果您将 bcrypt(或 scrypt)与 PGP 将执行的操作(其 S2K 转换)结合起来,那么您无法像单独使用任何一个设置那样将这两种设置调高,因为您必须共享 CPU 和耐心资源两个函数之间。但是,如果您使用非常不平衡的设置(例如,S2K 的迭代次数非常少,或未迭代的 S2K,报告 bcrypt/scrypt 层上的整个保护),那么使用 bcrypt 或 scrypt 的输出没有任何问题作为 PGP 的“密码”,

但是,可能存在实际问题。特别是, bcrypt 和 scrypt 是salted,这意味着它们的输出是密码和盐的确定性函数。您需要将盐值保存在某个地方,否则即使您记住了密码,您也无法重新计算您的加密密钥。OpenPGP 格式不包括一个易于使用的额外盐位

我想您可以采用开源 OpenPGP 库(如GnuPG)并对其进行修改以集成 bcrypt 或 scrypt,作为一种新的“S2K”(因此不是通常的 S2K 的补充,而是作为替代品)。该格式有256 种 S2K 类型的空间,其中 11 个插槽专门用于此类私人实验。


您对 RSA 素数等的冗长计算非常偏离,主要原因有两个:

  1. 您不会“蛮力”使用 RSA 密钥,尤其是通过尝试可能的素数除数。RSA 密钥有很多数学结构,通过解开该结构(即整数分解)来破坏它。这比枚举所有素数要有效得多(这将是一种非常粗糙的分解算法,称为“试除法”,我们知道得更好)。这就是为什么我们使用超过 1000 位的 RSA 密钥,而不是坚持使用 200 位左右的较小密钥的原因。

  2. 除了“用现有和可预见的技术无法破解”之外,没有任何安全级别。当前的阈值(假设全人类合作进行大规模的全球破解工作)可能约为 2 100 次操作,即接近 10 30次。能源是这里的瓶颈。超出这些水平的成本只是毫无意义的数字。使用 10 631或 2 2048的成本值是没有意义的,或者至少没有实际意义。

人们通常做的是瞄准一个“合理的”安全级别,即在未来 40 年(但不会超过),人类无法破解的东西,并有一定的余量。这指向 2048 位 RSA 密钥和 80 位密码熵(具有适当的减速因素,即 bcrypt 或 scrypt 的含义)。

请参阅此站点以探索各种机构根据类型和大小对关键强度的交叉估计,作为选择关键大小的指导。过大的密钥或密码可能会产生严重的开销(如果您将 RSA 密钥的大小加倍,私钥操作会慢八倍;如果您将密码的大小加倍,那么您必须记住两倍的字符)。