为什么GnuPG中的RSA密钥限制为4096位?
修改源代码以增加最大大小是不合法的吗?
ssh-keygen没有此限制(例如,我可以创建长度为32768位的密钥)。那是为什么?
答案 0 :(得分:9)
安全论坛的 Fire Ant 有非常明智的解释(针对类似问题):
http://www.security-forums.com/viewtopic.php?p=317962#317962
保留所有权利,但合理使用引用短摘录不应该是不恰当的方法:
GPG目前不支持4096以上的密钥大小。原因是8192键非常慢。如果你需要一个大于4096位的密钥,那么你应该知道你使用该密钥的是什么?
答案 1 :(得分:8)
在keylength.com,有: -
要保护256位对称密钥(例如AES-256),您可以考虑至少使用17120位非对称系统(例如RSA)。
如下文所述,标题为“Generate large keys with GnuPG”的简短文章所述,可以提高4096位的限制。这是为自制的gnupg包完成的,允许8192位密钥:PR 4201。关于更大键的内存分配的注意事项:comp.security.pgp.tech。
如果您想使用GnuPG生成大于4096位的密钥,则可以编译 新版本增加了4096的上限。你可能会发现 自己将其生成为RSA。将补丁下载到未配衡的gnupg-1.4.19 目录并将其应用于:
usbdrive@sandisk-extreme64:~/gnupg-1.4.19$ patch -p0 < gnupg_1.4.19_large_keygen.patch
patching file g10/keygen.c
usbdrive@sandisk-extreme64:~/gnupg-1.4.19$ ./configure --enable-large-secmem
[...]
checking whether to allocate extra secure memory... yes
[...]
usbdrive@sandisk-extreme64:~/gnupg-1.4.19$ make -j2
usbdrive@sandisk-extreme64:~/gnupg-1.4.19$ make check
usbdrive@sandisk-extreme64:~/gnupg-1.4.19$ sudo make install
usbdrive@sandisk-extreme64:~/gnupg-1.4.19$ gpg --gen-key --enable-large-rsa
如果没有--enable-large-rsa标志,密钥生成过程将会 自动将密钥降级为4096。
要在Mac上编译,您需要先从App Store下载Xcode。该 patch将密钥大小的上限增加到15489位。没有 增加安全内存限制,生成大于约7680位的密钥 将失败,因为它将无法为进程分配足够的内存。 生成大于7680位(192位对称等效)的密钥可以 也使得无法解密具有标准安全内存限制的消息 在编译时设置,因为gpg二进制文件将无法分配足够的内容 安全内存来解密消息,即使是小消息。
gnupg_1.4.19_xlarge_key_gen.patch
--- g10/keygen.c 2015-02-26 12:24:21.000000000 -0500
+++ g10/keygen.c 2015-03-02 22:12:09.028419377 -0500
@@ -1041,8 +1041,9 @@
nbits = 2048;
log_info(_("keysize invalid; using %u bits\n"), nbits );
}
- else if (nbits > 4096) {
- nbits = 4096;
+ else if (nbits > 15489) {
+ /* fallback to RFC3766 256-bit symmetric equivalency */
+ nbits = 15489;
log_info(_("keysize invalid; using %u bits\n"), nbits );
}
@@ -1251,7 +1252,8 @@
PKT_public_key *pk;
MPI skey[6];
MPI *factors;
- const unsigned maxsize = (opt.flags.large_rsa ? 8192 : 4096);
+ /* New large key limit RFC3766 256-bit symmetric equivalency */
+ const unsigned maxsize = (opt.flags.large_rsa ? 15489 : 4096);
assert( is_RSA(algo) );
@@ -1578,7 +1580,7 @@
static unsigned int
ask_keysize (int algo, unsigned int primary_keysize)
{
- unsigned nbits, min, def=2048, max=4096;
+ unsigned nbits, min, def=2048, max=15489;
int for_subkey = !!primary_keysize;
int autocomp = 0;
gnupg_1.4.19_xlarge_secmem.patch
--- configure 2015-02-27 03:37:52.000000000 -0500
+++ configure 2015-03-02 22:28:31.488401783 -0500
@@ -5076,7 +5076,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $large_secmem" >&5
$as_echo "$large_secmem" >&6; }
if test "$large_secmem" = yes ; then
- SECMEM_BUFFER_SIZE=65536
+ SECMEM_BUFFER_SIZE=131072
else
SECMEM_BUFFER_SIZE=32768
fi
文章结束。来自Retrieved on 2016-02-26的归档副本的original。
答案 2 :(得分:2)
为什么它不支持更大的东西?也许在GnuPG的开发(以及RSA的持续发展)以及当时的密钥大小,计算限制,无论是客户端用例还是政府机构能够打破4096密钥的潜力,开发人员和密码学家认为4096密钥足够大。实际上,4096是一个非常大的键,需要很长时间才能打破当前的技术。如果一个政府机构在你之后并且真的想要收到你的消息,他们会(在美国)获得法院命令,将rootkit放在你的机器上,甚至不用担心破坏加密。
现在,我没有专门查看源代码,但如果您将密钥大小更改为大于4096的密钥,如果其他用户使用您的密钥,如果他们的软件不支持更大的密钥大小,则可能会遇到问题。例如,我有一个4096密钥,我的一个朋友无法从Android设备发送消息,因为他找不到支持大于3072的任何应用程序的应用程序!记住这一点。
答案 3 :(得分:0)
如果您想修改源代码,可以使用以下脚本在Debian Linux上轻松完成: 提高GnuPG密钥大小限制并制作理想的.conf文件。
这是指向bash脚本的链接,该脚本将GnuPG密钥大小限制增加到4096位以上。该页面还提供了理想的GnuPG .conf文件。 https://gist.github.com/anonymous/3d928a0bcbb3ed92c454
请提供输入和建议的更改。