NIST SP 800-57§5.6.1第62–64页指定了RSA模数大小$ n $和预期安全强度$ s $之间的对应关系(以位为单位):
>这大约等于$ s \ approx 4 n ^ {0.43} $(但我不知道我的推断是否有意义;在DES上索引强度高达112的强度,而在AES上索引强度128及以上的强度,即强度强制使用指定的密钥大小强制执行相应的对称算法)。

这些数字基于什么?它们是否来自最著名的因式分解方法的预期复杂性?还是他们从特定分解工作的计算量中推断出来,例如针对RSA-768(“需要$ 10 ^ {20} $以上的操作”)?比提供给定密钥大小的RSA密码更难的信息。当今人们认为RSA密钥有多大安全性;具有RSA因式分解的良好历史,但没有回答我的问题-强度估计基于什么?

评论

左侧的数字是具有相应强度的对称密钥。即80位对称密钥提供的安全性与1024位RSA密钥大致相同。为了后代,我将提到该表位于链接的NIST文档的第62页上。

ECC相关问题:crypto.stackexchange.com/questions/31439/…

反向链接:stackoverflow.com/q/8453529/632951

keylength.com使用多种方法对密钥长度进行了全面概述。

我猜想,在不对称加密算法与对称加密算法之间的比较在某种情况下可能类似于核能发电与非核能发电之间的比较,并且这样的数字不应该被窃。我推测实践中使用这两类加密算法的方式(包括所使用的操作模式)的差异可能会对实际场景中的比较产生某些非平凡影响。

#1 楼

那些似乎是基于通用数字字段筛选器的复杂性,通用数字字段筛选器是最快(如果不是最快的话)经典分解算法之一。我在Mathematica中确认了这一点。

这是GNFS的复杂性(源):

$$ \ exp \ left(\ left(\ sqrt [3] {\ frac {64} {9}} + o(1)\ right)(\ ln n)^ {\ frac {1} {3}}(\ ln \ ln n)^ {\ frac {2} {3}} \ right)$$

其中$ n $是要分解的数字。在$ 2 ^ b $处评估上述表达式是对$ b $位整数进行分解所需的时间的近似值。这是一张显示$ 2 ^ {1024},2 ^ {2048},\ dots $的评估位长度的表:

Strength  RSA modulus size   Complexity bit-length
  80        1024               86.76611925028119
 112        2048              116.8838132958159
 128        3072              138.7362808527251
 192        7680              203.01873594417665
 256       15360              269.38477262128384

我用以下Mathematica代码:

({#, N@Log2@gnfsComplexity[2^#]} &) /@ {1024, 2048, 3072, 7680, 15360}


其中gnfsComplexity定义为:

gnfsComplexity[n_] := Exp[(64/9 * Log[n])^(1/3) * (Log[Log[n]])^(2/3)]


这不是最漂亮的我曾经写过的东西,但似乎准确。 (对于不熟悉Mathematica的人,第二个代码段定义了一个函数,该函数是上述GNFS复杂度的数字$ n $的音译。第一个代码段以$ n = 2 ^ {1024},2 ^ {2048来评估该复杂度} $等采用对数以2为底的对数,然后将其转换为数字近似值(十进制数字),而不是分数等精确结果。) RSA的大小,说明并不难。如果您查看问题中的文档,您会注意到分组密码的“安全位”与该分组密码的密钥大小(以位为单位)几乎完美相关(很少有例外)。这是因为我们对安全分组密码的最佳攻击本质上是对密钥的暴力搜索,这平均需要花费$ 2 ^ {n-1} $的时间,其中$ n $是密钥的位长。

但是,对于RSA而言,我们最好的攻击方法是不对密钥进行暴力搜索。取而代之的是,我们“简单地”分解(公共)模数,因此该方案的安全性围绕分解效率进行。 GNFS具有次指数级但仍然是超多项式的时间复杂度,并且可以使用该时间复杂度来粗略估计该方案提供的安全性。我相信这就是NIST在这里所做的。

评论


$ \ begingroup $
您能解释一下为什么RSA-1024的强度是80而不是86吗?
$ \ endgroup $
–user129789
2013年8月30日13:35



$ \ begingroup $
“ k的值通常被认为是密钥大小。”请参阅NIST SP 800-57的第64页
$ \ endgroup $
–user129789
13年8月30日在13:46

$ \ begingroup $
@ user129789:首先,直接评估渐近表达式非常不精确。但是更重要的是,NIST是一个管理组织,其在该表中的目的是为提供特定安全级别的各种原语定义一组密钥大小。目的是您可以确定112位安全性足以满足您的应用程序的需求,然后使用表中建议的密钥大小/算法。因此,他们选择了比所需安全级别稍高的常用密钥大小。根据摩尔定律,额外的利润也给您一些余地。
$ \ endgroup $
–里德
13年8月30日在14:01

$ \ begingroup $
@mikemaccana:$ o(1)$是小o表示法。当$ n \ to \ infty $时,值$ o(1)$趋向于0。
$ \ endgroup $
–里德
15年4月2日在22:07

$ \ begingroup $
@mikemaccana:的确如此!否则它将不会在那里。 :)但是,对于我们关心的$ n $的值,我们不确定$ o(1)$的值。 GNFS的复杂性是启发式的。我建议查看此问题及其答案/评论以进行更多讨论。
$ \ endgroup $
–里德
2015年4月2日在22:12

#2 楼

我已经将上述等式重新格式化为GNU bc(在大多数Linux系统上找到的GNU coreutils的一部分)的程序。 GNU bc比Mathematica更容易找到(尽管它很古怪)。

代码如下:

$ cat RSA-gnfs.bc 
#!/usr/bin/bc -l

scale = 14
a = 1/3
b = 2/3
#print "RSA Key Length? "
c = read()

t = l( l(2 ^ c) )
# if b < 1, then a^b == e (l(a) * b)
m = e( l(t) * b )
t = 64 / 9 * l(2 ^ c)
n = e( l(t) * a )
o = e( m * n )
p = l(o) / l(2)
print "Strength: ", p, "\n"
quit

代码的几次运行,添加了上面未包含的密钥大小:

$ for x in 1024 2048 3072 4096 7680 8192 15360 16384
do echo $x | ./RSA-gnfs.bc ; done

Strength: 86.76611925027707
Strength: 116.88381329581011
Strength: 138.73628085271660
Strength: 156.49695341791272
Strength: 203.01873594416484
Strength: 208.47248637388102
Strength: 269.38477262126889
Strength: 276.51840722076620


根据此等式,如果您使用AES256作为对称密码,则这是具有相同强度的最小RSA密钥大小:

$ echo 13547 | ./RSA-gnfs.bc 
256.00114520595064


这里是“最高机密” AES192的最小等效项:

这是AES128的最小等效项:安全性”-符合此参数将产生新的最小RSA密钥大小:

$ echo 6707 | ./RSA-gnfs.bc 
192.00709600689071


#3 楼

相对于破坏对称加密算法所需的处理量,RSA的安全级别基于已知的对RSA的最强攻击。
NIST建议的方程式可计算FIPS 140-2中的近似密钥长度实施指导问题7.5。
它是:
$ x = \ frac {1.923 \ times \ sqrt [3] {L \ times ln(2)} {\ sqrt [3] {[ln(L \ times ln(2))^ 2}}} {ln(2)} $
该公式基于当前已知的最佳分解因数,即General Number Field Sieve,该公式可以非常精确地给出结果类似于其他答案中给出的公式。

密钥长度公式的官方强度结果
RSA-1024 80 79.999
RSA-2048 112 110.118
RSA-3072 128 131.97
RSA-7680 192 196.253
RSA-15360 256 262.619

此公式也适用于DSA组大小(假设子组足够大)。

#4 楼

先前的注释使分子中没有术语。

$$ x = \ frac {1.923 \ times \ sqrt [3] {L \ times ln(2)} {\ sqrt [3] { [ln(L \ times ln(2))^ 2}}-4.69} {ln(2)} $$

我在前面提到的NIST文档的第92页上找到此公式:

http://csrc.nist.gov/groups/STM/cmvp/documents/fips140-2/FIPS1402IG.pdf

实现此等式的GNU bc代码是:

$ cat RSA-NIST.bc 
#!/usr/bin/bc -l

scale = 14
a = 1/3
b = 2/3
#print "RSA Key Length? "
l = read()

t = l * l(2)
m = l(t)
# if b < 1, then a^b == e (l(a) * b)
n = e( l(m) * b )
o = e( l(t) * a )
p = (1.923 * o * n - 4.69) / l(2)
print "Strength: ", p, "\n"
quit


与先前的批处理输入一起运行:

$ for x in 1024 2048 3072 4096 7680 8192 15360 16384
do echo $x | ./RSA-NIST.bc ; done
Strength: 79.99990535892915
Strength: 110.11760837749330
Strength: 131.97008244495367
Strength: 149.73076030162618
Strength: 196.25255668821560
Strength: 201.70630874277964
Strength: 262.61861313789943
Strength: 269.75224986273620


我会注意到a)这个新等式运行得更快,并且b)这些数字意味着更低的强度。

根据该等式,如果您使用AES256作为对称密码,则这是将显示密码的最小RSA密钥大小。相同的强度:

$ echo 14446 | ./RSA-NIST.bc
Strength: 256.00032964845911


这里是“最高机密” AES192的最小等效项:

$ echo 7295 | ./RSA-NIST.bc 
Strength: 192.00346260354399

是AES128的最小等效项:

$ echo 2868 | ./RSA-NIST.bc 
Strength: 128.01675571278223


RFC-7525规范表示“实现不得协商提供少于112位安全性的密码套件”-符合此参数将产生新的最小RSA密钥大小:

$ echo 2127 | ./RSA-NIST.bc 
Strength: 112.01273358822347


令人惊讶的是,RSA使用NIST的公式显示-2048不符合要求-RSA-2127应该是它们的新最小值。

评论


$ \ begingroup $
请编辑现有答案,而不要发布新答案。我们始终鼓励您进行修改以改善答案,尤其是当您自己回答问题时!
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
16年6月4日在19:42