我确实在 Debian Linux 系统上使用 gpg 生成了私钥/公钥对。 命令行中的加密和解密效果很好。 然后我尝试用python程序进行解密:
import gnupg
gpg = gnupg.GPG(homedir='/usr/home/username/.gnupg')
encrypted_string = '''-----BEGIN PGP MESSAGE-----
...encrypted data...
-----END PGP MESSAGE-----'''
decrypted_data = gpg.decrypt(encrypted_string, passphrase='mypassphrase')
print('ok: ', decrypted_data.ok)
print('status: ', decrypted_data.status)
print('decrypted string: ', decrypted_data.data)
在我运行一次 python 代码后(解密失败,消息密钥丢失),命令行中的解密(与之前相同的命令)也失败,并显示以下消息:
gpg: decryption failed: No secret key
检查gpg版本
gpg --version
退货
gpg (GnuPG) 2.2.12
libgcrypt 1.8.4
...
Home: /usr/home/username/.gnupg
...
查看此主文件夹,所有文件都已就位:
4 drwx------ 2 username username 4096 Jun 28 09:26 openpgp-revocs.d
4 drwx------ 2 username username 4096 Jun 28 09:26 private-keys-v1.d
4 -rw------- 1 username username 32 Oct 11 00:25 pubring.gpg
4 -rw-r--r-- 1 username username 2480 Jun 28 09:26 pubring.kbx
4 -rw------- 1 username username 32 Jun 28 09:23 pubring.kbx~
0 srwx------ 1 username username 0 Jun 29 16:19 S.gpg-agent
0 srwx------ 1 username username 0 Jun 29 16:19 S.gpg-agent.browser
0 srwx------ 1 username username 0 Jun 29 16:19 S.gpg-agent.extra
0 srwx------ 1 username username 0 Jun 29 16:19 S.gpg-agent.ssh
4 -rw------- 1 username username 1280 Oct 11 01:39 trustdb.gpg
私钥位于 private-keys-v1.d 文件夹中。 无论如何,
gpg --list-keys
和 gpg --list-secret-keys
都没有显示任何结果。
使用
gpg --list-keys --debug-level 9
我得到以下输出:
gpg: enabled debug flags: packet mpi crypto filter iobuf memory cache memstat trust ipc clock lookup extprog
gpg: DBG: [not enabled in the source] start
gpg: DBG: [not enabled in the source] keydb_new
gpg: DBG: [not enabled in the source] keydb_search_reset
gpg: DBG: keydb_search: reset (hd=0x00008b9427390f20)
gpg: DBG: [not enabled in the source] keydb_search enter
gpg: DBG: keydb_search: 1 search descriptions:
gpg: DBG: keydb_search 0: FIRST
gpg: DBG: keydb_search: searching keybox (resource 0 of 1)
gpg: DBG: keydb_search: searched keybox (resource 0 of 1) => EOF
gpg: DBG: [not enabled in the source] keydb_search leave (not found)
gpg: DBG: [not enabled in the source] stop
gpg: keydb: handles=1 locks=0 parse=0 get=0
gpg: build=0 update=0 insert=0 delete=0
gpg: reset=1 found=0 not=1 cache=0 not=0
gpg: kid_not_found_cache: count=0 peak=0 flushes=0
gpg: sig_cache: total=0 cached=0 good=0 bad=0
gpg: random usage: poolsize=600 mixed=0 polls=0/0 added=0/0
outmix=0 getlvl1=0/0 getlvl2=0/0
gpg: rndjent stat: collector=0x0000000000000000 calls=0 bytes=0
gpg: secmem usage: 0/65536 bytes in 0 blocks
我猜
searched keybox (resource 0 of 1) => EOF
是这里的问题,但我不知道为什么。
我尝试再次将密钥文件导入为二进制或文本文件,但出现消息
gpg: no valid OpenPGP data found.
我也尝试过
gpg --update-trustdb
和
gpg --refresh-keys
没有任何改变。
我不知道运行 python 代码发生了什么,我也不知道为什么 gpg 不再知道密钥了。
在这期间我确实找出了根本原因:
python 命令
decrypted_data = gpg.decrypt(encrypted_string, passphrase='mypassphrase')
忽略 pubring.kbx 并生成文件 pubring.gpg。 对于(或多或少是空的)pubring.gpg,命令行中的解密使用 pubring.gpg 而不是 pubring.kbx。因此,解密不再起作用。 只需删除 pubring.gpg,命令行中的解密即可再次工作。
答案不仅仅在代码中。在运行代码之前我所做的是安装 gnupg
pip install gnupg
以及后来的 python-gnupg
pip install python-gnupg
但是 gnupg 和 python-gnupg 都包含
中包含的 gnupg 类import gnupg
至少在我的机器上,它总是使用第一次安装 gnupg 中的 gnupg,而不是 python-gnupg。 当我清楚这一点时,解决方案就很容易了。我用卸载了gnupg
pip uninstall gnupg
由于 python-gnupg 中的 gnupg 使用的参数略有不同,我必须修改 home 参数:
gpg = gnupg.GPG(gnupghome='/usr/home/username/.gnupg')
然后使用 python 程序进行解密就完美运行了。总之还剩下一个问题:
如果两个(或更多)包安装了相同的类名,如何在 python 中获取错误或警告消息?
gpg --homedir PATH/TO/.gnupg --list-secret-keys
要使其在没有 --homedir
参数的情况下工作,请导出和导入密钥:
gpg --homedir PATH/TO/.gnupg --export-secret-keys -o private-keys.asc
gpg --import private-keys.asc
gpg --list-secret-keys