为什么GnuPG中的RSA密钥被限制在4096位?
如果我修改源代码以增加最大位数,是否会违法?
ssh-keygen没有此限制(例如,我可以创建一个长度为32768位的密钥)。为什么会这样?
为什么GnuPG中的RSA密钥被限制在4096位?
如果我修改源代码以增加最大位数,是否会违法?
ssh-keygen没有此限制(例如,我可以创建一个长度为32768位的密钥)。为什么会这样?
在keylength.com上有这样一段话:
为了保护256位对称密钥(例如AES-256),您可以考虑使用至少17120位的非对称系统(例如RSA)。
可以通过如下所述的方式提高4096位限制:使用GnuPG生成大型密钥。以下是该文章的复制品。这是为homebrew中的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。此补丁将密钥大小的上限增加到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
在安全论坛上,Fire Ant提供了一个相似问题的非常明智的解释:
http://www.security-forums.com/viewtopic.php?p=317962#317962
所有权归他们所有,但是公正使用短摘要引用不应该是不合适的:
GPG目前不支持超过4096的密钥大小。原因是8192位密钥非常慢。如果您需要大于4096位的密钥,则应该仔细考虑使用该密钥的原因。
如果您想修改源代码,可以使用此脚本在Debian Linux上轻松完成:提高GnuPG密钥大小限制并创建理想的.conf文件。
这里是一个链接到bash脚本的链接,它将GnuPG密钥大小限制增加到4096位以上。该页面还提供了一个理想的GnuPG .conf文件。 https://gist.github.com/anonymous/3d928a0bcbb3ed92c454
请提供输入和建议的更改。