GnuPG 4096位限制

Arl*_*len 17 cryptography gnupg

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

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

ssh-keygen没有这个限制(例如,我可以创建一个长32768位的密钥).这是为什么?

prz*_*moc 9

安全论坛上的Fire Ant有一个非常明智的解释(对于类似的问题):

http://www.security-forums.com/viewtopic.php?p=317962#317962

在那里保留所有权利,但合理使用短摘录的引用不应该是不恰当的方法:

GPG目前不支持超过4096的密钥大小.原因是8192键非常慢.如果您需要一个大于4096位的密钥,那么您应该知道您使用该密钥的原因是什么?

  • 这不是一个非常令人信服的理由.这就像在GIMP中将图像分辨率限制为1024,因为在将滤镜应用于图像时,任何较大的都可能会很慢. (21认同)

jah*_*jah 8

keylength.com上有这样的: -

要保护256位对称密钥(例如AES-256),您可以考虑至少使用17120位非对称密钥(例如RSA).

可以引用4096位限制,如下面标题为" 使用GnuPG生成大键 "的简短文章中所述.这是为自制的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
Run Code Online (Sandbox Code Playgroud)

如果没有--enable-large-rsa标志,密钥生成过程将自动将密钥降级为4096.

要在Mac上编译,您需要先从App Store下载Xcode.该补丁将密钥大小的上限增加到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;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

文章结束.检索2016-02-26原始的存档副本.