老吴的研发日志

编译支持更大 RSA 密钥的 GnuPG (16384 bit)

本文将展示如何在 Debian 11.3 环境下编译支持更大 RSA 密钥 (16384 bit) 的 GnuPG 2.2.41。

请注意,修改源代码可能会产生安全隐患。

首先,获取 GnuPG 2.2.41 源码。

$ sudo apt install curl
$ curl -O https://gnupg.org/ftp/gcrypt/gnupg/gnupg-2.2.41.tar.bz2
$ sudo apt install tar lbzip2
$ tar xf gnupg-2.2.41.tar.bz2
$ cd gnupg-2.2.41

然后,修改“g10/keygen.c”文件中的两处代码。

第一,增大“static int gen_rsa(…)”中的最大长度限制。

1697  int err;
1698  char *keyparms;
1699  char nbitsstr[35];
1700  const unsigned maxsize = 16384; // (opt.flags.large_rsa ? 8192 : 4096);

第二,增大“static unsigned int get_keysize_range(…)”中的最大长度限制。

2321    default:
2322      *min = opt.compliance == CO_DE_VS ? 2048: 1024;
2323      *max = 16384; // 4096;
2324      def = 3072;
2325      break;

接下来,编译安装修改后的 GnuPG,本文将安装至源码根目录下的“dist”目录。

$ sudo apt install gcc make libgpg-error-dev libassuan-dev libksba-dev libnpth0-dev libgcrypt20-dev
$ #rm -r dist
$ ./configure --prefix="$(pwd)/dist" && make clean && make && make install

最后,在开始使用前将安装目录临时添加到 PATH 中。为了避免因安全内存不足造成的错误,启动 gpg-agent 时可能需要附带扩展安全内存区域参数“–auto-expand-secmem n”,根据需求选择参数值。

$ export PATH="$(pwd)/dist/bin":$PATH
$ #pgrep gpg | xargs kill -9
$ gpg-agent --auto-expand-secmem 0x30000 --daemon

好了,可以使用编译好的 GnuPG 来创建更长的 RSA 密钥了。

$ gpg --pinentry-mode loopback --full-gen-key

相关:两个相对更年轻的加密签名工具。