【问题标题】:How to use *.pub/*.sec files to encrypt/decrypt another file?如何使用 *.pub/*.sec 文件加密/解密另一个文件?
【发布时间】:2018-12-29 22:31:20
【问题描述】:

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

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

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

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

Q2:如何使用 gpg2 和伴随 *.sec 解密使用伴随 *.pub 文件加密的文件?


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


请包含指向相关文档的准确指针。

【问题讨论】:

  • 检查 gpg 文档。
  • @MartinZeitler:那么 *.pub 文件是什么?
  • @kjo 和 PGP 这实际上是真的:users.ece.cmu.edu/~adrian/630-f04/PGP-intro.html#p9 ...会留下答案。
  • 您不会“使用文件”来加密/解密任何东西,而是使用其中包含的密钥;但是,您必须将密钥导入您的 PGP/GPG 密钥环才能使用它们。之后,这些文件就没有更多用处了。
  • 这就是为什么我的回答只关注“重要的”自动化方面;在编辑它时,我还写道,理论上它们可以被删除。但是,公钥仍然可以用于共享它们,这就是我再次删除它的原因。将它们发布到密钥服务器可能是它们的最佳用途。

标签: gnupg


【解决方案1】:

关于你所说的一些信息:

我使用说明创建了一对 *.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 密钥。

【讨论】:

    【解决方案2】:

    查看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;在哪里可以例如。定义默认的密钥服务器。

    【讨论】:

    • 让我完全困惑的是,即使在提供了我所能提供的最大赏金之后,也很难得到我的问题的答案。尽管我的问题一遍又一遍地强调我想使用 pub 文件进行加密,但您的回答甚至都懒得提及它们。我还需要做什么才能让自己被理解?
    • @kjo 阅读文档;您必须将密钥添加到密钥环或密钥服务器中;然后这些密钥可用于gpg 基础设施;当然,我没有费心提及它们,仅仅是因为它们不能直接传递给命令,因此对自动化没有任何作用——这就是为什么假设关键材料可用的原因。并且通过无人值守的密钥生成,执行此操作的脚本也必须添加它们。通常,recipient 参数指示使用哪个键 - 以及它是否可用。
    【解决方案3】:

    Since version 2.1.14,GPG 支持--recipient-file 选项,它允许您指定要加密的公钥,而无需使用密钥环。 To quote the developer:

    现在可以绕过密钥环并获取公钥 直接从文件中。该文件可能是二进制文件或 ascii Armored 键,并且仅使用该文件中的第一个键块。关键 使用此选项指定的始终是完全信任的。

    此选项可以与标准的 -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,所以这个文件甚至不可用更多的。生成的密钥需要添加到用于解密的密钥环中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 2010-11-03
      • 2020-07-23
      • 2011-06-21
      • 2012-07-27
      • 2011-08-15
      相关资源
      最近更新 更多