GnuPG 4096位限制

时间:2011-05-15 23:13:35

标签: cryptography gnupg

为什么GnuPG中的RSA密钥限制为4096位?

修改源代码以增加最大大小是不合法的吗?

ssh-keygen没有此限制(例如,我可以创建长度为32768位的密钥)。那是为什么?

4 个答案:

答案 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 |生成大键大卫诺曼

如果您想使用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的开发(以及RS​​A的持续发展)以及当时的密钥大小,计算限制,无论是客户端用例还是政府机构能够打破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

请提供输入和建议的更改。