GnuPG 4096位限制

22

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

如果我修改源代码以增加最大位数,是否会违法?

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


破解一个4096位密钥需要多长时间? - Lasse V. Karlsen
4
取决于破坏者的身份,但这并不是重点。为什么一开始就有限制呢? - Arlen
1
你可以修改源代码以实现任何你想要的功能。 - President James K. Polk
4个回答

11

keylength.com上有这样一段话:

为了保护256位对称密钥(例如AES-256),您可以考虑使用至少17120位的非对称系统(例如RSA)。

可以通过如下所述的方式提高4096位限制:使用GnuPG生成大型密钥。以下是该文章的复制品。这是为homebrew中的GNUPG软件包执行的,以允许生成8192位密钥:PR 4201。有关更大密钥的内存分配的注意事项:comp.security.pgp.tech

GnuPG生成大型密钥| David Norman

如果您想使用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。此补丁将密钥大小的上限增加到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

文章结束。从原始网页的存档副本中于2016-02-26检索,获取方式


这个页面“使用GnuPG生成大型密钥”有备份吗?它显示404。 - Wojtek
@Wojtek 是的,现在已经在这个回答中复制了。 - jah
“Generate large keys with GnuPG” 文章的作者已经将其在原始 URL 上复活,并添加了一些补丁,这些补丁在此处复制的文章中并不存在。 - jah
电子邮件、附件等在邮件服务器上,个人文件、数字证书等在闪存存储器上等等,这些地方是人们需要长期保护其数据的隐私和安全性的。例如:5/10年协议/法律文件、交易/TX交易证明或用于打开某些账户的代码等需要并且具有私人数据,必须至少保持安全加密并安全地保存10~15年,并能够承受来自数据盗贼的滥用攻击。因此,欧洲网络与信息安全局(ENISA)在2014年建议在https://www.enisa.europa.eu/publications/algorithms-key-size-and-parameters-report-2014的第41页中使用15360位密钥。这种要求现在(2020年)必须高得多。 - atErik

9

在安全论坛上,Fire Ant提供了一个相似问题的非常明智的解释:

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

所有权归他们所有,但是公正使用短摘要引用不应该是不合适的:

GPG目前不支持超过4096的密钥大小。原因是8192位密钥非常慢。如果您需要大于4096位的密钥,则应该仔细考虑使用该密钥的原因。


25
那不是一个非常有说服力的理由。这就像在GIMP中将图像分辨率限制在1024,因为如果对图像应用滤镜,更大的尺寸可能会变慢。 - Arlen
1
如果你正在加密一些对于一个具备破解 4096 位密钥能力的组织来说有趣的数据,那么很可能你做其他事情出现了问题,导致你的密钥长度无关紧要。你的交换文件(swapfile)也是 16384 位加密的吗?你的显示器是否TEMPEST屏蔽了?任何接触过数据的程序是否在别处写入了临时文件?你有没有配偶或孩子可以被扣押直到你透露密码?你能忍受“增强审讯”而不透露密钥吗?对于一个足够积极的攻击者来说,密钥长度是无关紧要的。 - pendor
增强审讯?[什么是“增强审讯”?] (http://xkcd.com/538/) - Luis Machuca
@rsaxvc:哦,我明白你在那里做了什么! - Luis Machuca
不返回使用“_secure_”、“_encrypted_”连接的版本。 - Luis Machuca
如果您需要大于4096位的密钥,那么您应该认真考虑您使用该密钥的目的。我这样做是为了(大约)匹配256位AES的安全性,并使我的消息更大,以便那些希望在以后破解它们的人浪费更多的金钱。 - user14764

3
为什么不支持更大的密钥?也许在开发GnuPG(和RSA的持续发展)以及密钥大小时,考虑到当时的计算限制,无论是客户端使用情况还是政府机构破解4096位密钥的潜力,开发人员和密码专家都认为4096位密钥已经足够大了。实际上,4096位密钥已经相当大了,在现有技术下要破解需要非常长的时间。如果一个政府机构想追踪您并真的想要获取您的消息,他们将(在美国)获得法院命令,在您的计算机上安装rootkit而不必担心破解加密。
现在,我没有具体查看源代码,但如果您将密钥大小更改为大于4096个位,可能会遇到其他用户使用您的密钥时存在问题,因为他们的软件可能不支持更大的密钥大小。例如,我的一个朋友无法从Android设备向我发送消息,因为他找不到支持大于3072位的应用程序!请记住这一点。

0

如果您想修改源代码,可以使用此脚本在Debian Linux上轻松完成:提高GnuPG密钥大小限制并创建理想的.conf文件。

这里是一个链接到bash脚本的链接,它将GnuPG密钥大小限制增加到4096位以上。该页面还提供了一个理想的GnuPG .conf文件。 https://gist.github.com/anonymous/3d928a0bcbb3ed92c454

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


你是不是想为“这个脚本”创建一个链接? - Kevin Panko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接