#1 楼
在RSA中,公共模数$ N $的位大小$ n $通常采用$ n = c \ cdot2 ^ k $的形式,其中$ c $是一个小的奇整数。 $ c = 1 $($ n = 512 $,$ 1024 $,$ 2048 $,$ 4096 $ .. bit)是最常见的,但$ c = 3 $($ n = 768 $,$ 1536 $,$ 3072 $ .. bit)和$ c = 5 $($ n = 1280 $ ..)是常见的。这样做的原因之一仅仅是限制可能性,并且在加密技术中到处都可以找到类似的进程,并且通常在二进制规则(例如RAM大小)的计算机中也可以找到。分解的难度(因此,据我们所知,在没有旁通道和填充攻击的情况下,RSA的安全性随着$ n $的增长而平稳增长。但是,随着$ n $的增加,计算RSA公共和私有功能的难度会逐步增加(在下一段中会详细说明原因)。因此,仅一步以下的$ n $值比一步上方的$ n $更具吸引力:它们几乎一样安全,但后者在实际使用中更困难/更慢。而且,并非偶然的是,常见的RSA模数大小恰好在这些步骤之下。
创建步骤的一个主要因素是何时需要一个以上的单词/存储单元来存储数字。当存储单元为$ b $位时,RSA公共功能$ x \ mapsto x ^ e \ bmod N $每$ b $位有一个这样的步骤; RSA私有函数$ x \ mapsto x ^ d \ bmod N $的每个$ r \ cdot b $位有一个步骤,其中$ r = 1 $是朴素的实现,而$ r $等于在使用CRT且位大小相等的因素时,$ N $(最常见的是$ r = 2 $,但是我听说过$ r = 8 $的计划)。在任何适用于RSA的现代通用CPU上,$ b $是2的乘方,至少是$ 2 ^ 5 $,这有力地刺激了$ n $至少是$ 2 ^ 6 $的倍数($ r = 2 $是常见的,并且是$ n $低于约一千的唯一合理选择)。注:$ n = 1984 = 31 \ cdot2 ^ 6 $在智能卡领域并不罕见,因为$ 2的下一个倍数^ 6 $将打破通用传输协议ISO / IEC 7816-3 T = 0中的声音屏障。有关此字段中常见RSA模数大小的列表,请搜索
LENGTH_RSA_1984
。顺便说一句,当位数时,用欧几里得除法(在RSA中使用很多)编码商估计要简单得多。除数的提前是已知的。这产生了减少模数的可能比特大小的数量的动机。最简单的两种情况是,位数是$ b $的倍数,而位数是$ b $的倍数;前者赢了。
评论
$ \ begingroup $
“但是,随着n的增加,计算RSA公共和私有功能的难度会逐步增加(更多有关后来的原因)。”通过平方求幂,对吗?
$ \ endgroup $
–乔Z。
13年3月28日在11:14
$ \ begingroup $
@Joe Zeng:那不是我的意思。在我的原始答案中,您引用的“以后”指的是有关字/存储单元大小的注意事项。与(额外的)平滑步骤相比,这将创建更多标记的步骤,因为后者取决于指数中的位数,该位数不一定是整数的倍数,并且通常小于$ n $。
$ \ endgroup $
–fgrieu♦
13年3月28日在16:45
$ \ begingroup $
@fgrieu您是否有任何参考资料可以帮助解释该公共模量长度方程背后的理论?
$ \ endgroup $
– Liam Kelly
20-2-18在18:18
$ \ begingroup $
@Liam Kelly:如果用“等式”表示$ n = c \ cdot2 ^ k $,而$ c $小,恐怕不,我没有带解释的参考。这种形式的数量在计算机科学中比比皆是,因为这是$ c $ RAM芯片中具有$ n $地址位的位数,或者等效地是$ c $计算机字中具有$ 2 ^ n $位的位数。相应地,可以用二进制数的$ N $存储正好有此数量的RAM或这么多计算机字。
$ \ endgroup $
–fgrieu♦
20-2-18在18:28
#2 楼
传统上使用二的幂。对于非常受限的体系结构,它还具有一些实现上的好处:它节省了一些指令。这间接意味着某些实现无法处理大小不是32或64的倍数的RSA密钥,这意味着,如果要获得最大的互操作性,则也不应使用其他密钥大小(即使代码不受此限制) )。(我见过野外使用的1152位和1536位大小的RSA密钥,因此对2的幂没有绝对的限制。)
#3 楼
选择RSA密钥大小的任何特定对齐方式(无论是2的幂,64的倍数,2的倍数),都没有密码优势。密码攻击的难度随位数的增加而大大增加。正如fgrieu所指出的那样,使用32或64的倍数的大小对防御者来说有一点优势,因为无论您使用2017-2048位数字还是2048-位数字进行操作,大多数bignum运算的成本实际上是相同的位数字。但是,使用“标准”大小有时会有实际的优势-至少是32的倍数,更常见的是$(2 ^ k + 1)2 ^ m $形式的数字小$ k $。优点是您的密钥将与之一起使用的实现在这些大小的条件下进行测试的机会更大。 RSA计算涉及对大小的运算,并且可能包含仅在“非舍入”大小(例如,不是字长的倍数的大小)上明显的错误。某些实现甚至可能禁止使用未经测试的密钥大小,因此它们仅支持几种大小。
对于DSA,FIPS 186标准最初规定密钥大小应为整数。 512和1024之间的32个密钥。当前版本指定密钥大小必须为1024、2048或3072,并指定这些相同的密钥大小是供政府用于RSA的唯一有效密钥大小。将密钥大小限制为几个值可提高互操作性,并通过降低实现复杂性和增加测试覆盖范围来提高安全性。
评论
$ \ begingroup $
Nit:FIPS186尽管-2(您链接的文档)需要DSA p 64位的倍数(从512到1024)。正如您对DSA和RSA所说,对1k,2k,3k的更改在2009年为-3。更新:在2019-10草案中-5完全放弃了DSA,使RSA最小为2k,但删除了'仅1k 2k 3k'的要求。它还向ECDSA添加了可选的确定性k,并添加了EdDSA。
$ \ endgroup $
–dave_thompson_085
19/12/4在8:26
#4 楼
这只是惯例,由诸如GPG和OpenSSL之类的产品强制执行,这些产品包含阻止您选择自己的确切位长的代码(它们出于特殊原因而强制填充或舍入)。这是强制执行此操作的GPG代码,例如: if( nbits < 768)
{
nbits = 2048;
log_info(_("Keysize invalid; using %u bits\n"), nbits );
}
else if(nbits>3072)
{
nbits = 3072;
log_info(_("Keysize invalid; using %u bits\n"), nbits );
}
if(nbits % 64)
{
nbits = ((nbits + 63) / 64) * 64;
log_info(_("keysize rounded up to %u bits\n"), nbits );
}
/* To comply with FIPS rules we round up to the next value unless
in expert mode. */
if (!opt.expert && nbits > 1024 && (nbits % 1024))
{
nbits = ((nbits + 1023) / 1024) * 1024;
log_info (_("keysize rounded up to %u bits\n"), nbits );
}
评论
$ \ begingroup $
第一项检查确保您没有使用危险的小密钥大小。第二次检查仅针对DSA,因为最新标准将3072设置为最大大小。第三次检查是出于性能原因(如其他答案中所述),最后一次检查是针对FIPS符合性。
$ \ endgroup $
–森林
18年7月15日在3:42
$ \ begingroup $
谁投票支持,这是错误的,评论也错误,并且选定的“最佳答案”也是错误的。我已经亲自对执行RSA所需的所有重要代码进行了手工编码-性能与“ 1”位数的数量直接相关,而与位数总数无关。
$ \ endgroup $
–安农·科沃德(Anon Coward)
18-09-5在11:17
$ \ begingroup $
您正在考虑大指数对性能的影响,在此情况下,位数的计算很重要。对于较大的模数,使用2的幂只是使使用快速的模幂运算更容易。
$ \ endgroup $
–森林
18/12/13在1:02
$ \ begingroup $
该代码仅用于GPG,并且正如森林指出的那样,DSA只是其中一部分。对于SSL而言,OpenSSL仅需要最少512和64的倍数(对应于原始的“ 186-0”),而对于RSA则只需要最小512(尽管它不会使用> 16k进行pubkey操作,这限制了它们的实用性)。 OpenSSH仅为DSA生成1k(显然是186-0与OpenSSH人们的安全要求的交集,或者可能只是186-2cn1),但是对于RSA则可以任意增加1k。 Java限制了DSA的大小,并且烦人地限制了DH,但没有RSA(所有内部都使用相同的BigInteger)。
$ \ endgroup $
–dave_thompson_085
19/12/4在8:54
评论
您是否希望使用818位,1935位,4144位的密钥大小?没有加密的优势,但是使用良好的整数可以更有效地实现和存储它们。它也更简单,更常规,并且比显然任意选择的密钥大小更有意义。同样,9000位RSA是过大的,使用如此大的密钥的人只是在浪费CPU周期(而且无论如何也不是“超过9000”,因此它在这方面也失败了^^)。也许与2的幂有关?