如何使用* .pub / *。sec文件加密/解密另一个文件?

时间:2018-12-29 22:31:21

标签: gnupg

我使用此处给出的说明和代码创建了一对*.pub*.sec文件:

https://www.gnupg.org/documentation/manuals/gnupg/Unattended-GPG-key-generation.html

(我使用此文档是因为我拥有的最终应用程序 mind是一个自动加密/解密管道。)

问题1:如何使用gpg2和*.pub文件加密另一个文件?

问题2:我如何使用gpg2和伴随*.sec来解密使用伴随*.pub文件加密的文件?


重要提示: 我只对适合于以编程方式实施无监督操作的答案感兴趣。请不要发布只能以交互方式进行的答案。我对可以在Python中实现的解决方案特别感兴趣。


请提供指向相关文档的精确指针。

3 个答案:

答案 0 :(得分:5)

有关您所说内容的一些信息:

  

我按照说明创建了一对* .pub和* .sec文件

可以完美地与您交换信息的人员共享公钥,但是从技术上讲,当您以编程方式工作时,不需要直接使用这些文件。

请注意:

  • 加密数据时,您将指定与用于加密的密钥相对应的收件人
  • 解密数据时,首先将导入所有者的公钥,然后无需指定收件人就可以解密数据,因为它已嵌入到加密数据中
  

实际上,我对此问题有些困惑。我已阅读有冲突的信息[...]

我同意这很令人困惑。在这种情况下,我认为最好使用版本1,因为它具有更多的经验,并且可以找到要使用的第三方库。

在这个答案中,我尝试过:

  • python-gnupg (适用于GnuPG v1),这是一个众所周知的Python库,完全可以满足您的需求
  • 我找不到足够的文档的
  • cryptorito (适用于GnuPG v2)

有了第一个库,您可以简单地将其安装在系统中:

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版本相同,因此该文件为不再可用。生成的密钥将需要添加到密钥环以用于解密。