我使用此处给出的说明和代码创建了一对*.pub
和*.sec
文件:
https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html
(我使用此文档是因为我拥有的最终应用程序 mind是一个自动加密/解密管道。)
问题1:如何使用gpg2和*.pub
文件加密另一个文件?
问题2:我如何使用gpg2和伴随*.sec
来解密使用伴随*.pub
文件加密的文件?
重要提示: 我只对适合于以编程方式实施无监督操作的答案感兴趣。请不要发布只能以交互方式进行的答案。我对可以在Python中实现的解决方案特别感兴趣。
请提供指向相关文档的精确指针。
答案 0 :(得分:5)
有关您所说内容的一些信息:
我按照说明创建了一对* .pub和* .sec文件
可以完美地与您交换信息的人员共享公钥,但是从技术上讲,当您以编程方式工作时,不需要直接使用这些文件。
请注意:
实际上,我对此问题有些困惑。我已阅读有冲突的信息[...]
我同意这很令人困惑。在这种情况下,我认为最好使用版本1,因为它具有更多的经验,并且可以找到要使用的第三方库。
在这个答案中,我尝试过:
有了第一个库,您可以简单地将其安装在系统中:
sudo pip install python-gnupg
然后编写Python脚本来执行所需的所有操作。
我写了一个简单的回答你的问题。
#!/bin/python
import gnupg
GPG_DIR='/home/bsquare/.gnupg'
FILE_TO_ENCRYPT='/tmp/myFileToEncrypt'
ENCRYPTED_FILE='/tmp/encryptedFile'
DECRYPTED_FILE='/tmp/decryptedFile'
SENDER_USER='Bsquare'
TARGET_USER='Kjo'
gpg = gnupg.GPG(gnupghome=GPG_DIR)
print("Listing keys ...")
print(gpg.list_keys())
# On SENDER_USER side ... encrypt the file for TARGET_USER, with his public key (would match the kjo.pub if the key was exported).
print("Encrypting file " + FILE_TO_ENCRYPT + " for " + TARGET_USER + " ...")
with open(FILE_TO_ENCRYPT, "rb") as sourceFile:
encrypted_ascii_data = gpg.encrypt_file(sourceFile, TARGET_USER)
# print(encrypted_ascii_data)
with open(ENCRYPTED_FILE, "w+") as targetFile:
print("encrypted_ascii_data", targetFile)
# On TARGET_USER side ... decrypt the file with his private key (would match the kjo.sec if the key was exported).
print("Decrypting file " + ENCRYPTED_FILE + " for " + TARGET_USER + " ...")
with open(ENCRYPTED_FILE, "rb") as sourceFile:
decrypted_ascii_data = gpg.decrypt_file(sourceFile)
# print(decrypted_ascii_data)
with open(DECRYPTED_FILE, "w+") as targetFile:
print(decrypted_ascii_data, targetFile)
请注意,我的密钥环包含我的Bsquare
用户的pub / sec对和Kjo
用户的pub密钥。
答案 1 :(得分:1)
看着encrypting and decrypting documents
这暗示pexpect;而我可以提供常规的expect
脚本:
这不是直接的Python解决方案,但应该易于移植。
标语如下:
Pexpect使Python成为控制其他应用程序的更好工具。
加密:
gpg --output doc.gpg --encrypt --recipient blake@cyb.org doc
作为expect
脚本;用法./encrypt.exp doc blake@cyb.org 1234
(注意:
之后的空格):
#!/usr/bin/expect -f
set filename [lindex $argv 0]
set recipient [lindex $argv 1]
set passphrase [lindex $argv 2]
spawn gpg --output $filename.gpg --encrypt --recipient $recipient $filename
expect -exact "Enter pass phrase: "
send -- "$passphrase\r"
expect eof
解密:
gpg --output doc --decrypt doc.gpg
作为expect
脚本;用法:./decrypt.exp doc 1234
:
#!/usr/bin/expect -f
set filename [lindex $argv 0]
set passphrase [lindex $argv 1]
spawn gpg --output $filename --decrypt $filename.gpg
expect -exact "Enter pass phrase: "
send -- "$passphrase\r"
expect eof
导入:
密钥可以通过以下方式导入到任一密钥链中:
gpg --import somekey.sec
gpg --list-secret-keys
gpg --import somekey.pub
gpg --list-keys
几乎没有什么可以自动化;但是将导入的密钥设置为“可信”将需要expect
来实现自动化。找到了cheat-sheet,它在一页上具有所有命令;并且还提示:If you have multiple secret keys, it'll choose the correct one, or output an error if the correct one doesn't exist
(应该在下面确认我的评论)。
文件~/.gnupg/options
是用户的options file;哪里可以定义默认的密钥服务器。
答案 2 :(得分:0)
Since version 2.1.14,GPG支持--recipient-file
选项,该选项使您可以指定用于加密的公共密钥,而无需使用密钥环。 To quote the developer:
现在可以绕过密钥环并获取公共密钥 直接从文件。该文件可能是二进制文件或ASCII装甲文件 键,并且仅使用该文件中的第一个键块。关键 始终完全信任使用此选项指定的内容。
此选项可以与标准-r选项混合使用。 --hidden-recipient-file(或-F)也可用。
要进一步协助某些用例,该选项
-无密钥
也已实现。这类似于
-no-default-keyring --keyring / dev / null
但可移植到Windows,并且也忽略指定的任何密钥环 (命令行或配置文件)。
要进行加密,您可以这样做:
gpg --output myfileenc --encrypt --recipient-file key.pub myfile
要自动化,除了使用expect
或Python(如其他答案中所述)外,您还可以use the --batch
option。 (您将需要查看所提供的答案中哪个最适合您的系统)。
但是,秘密密钥没有这样的选项,事实上,--generate-key
命令中的PGP(2.1)deprecated the secring
option版本相同,因此该文件为不再可用。生成的密钥将需要添加到密钥环以用于解密。