代码之家  ›  专栏  ›  技术社区  ›  kjo

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

  •  4
  • kjo  · 技术社区  · 7 年前

    我创造了一对 *.pub *.sec 使用以下说明和代码的文件:

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

    (我使用此文档是因为我在 Mind是一个自动加密/解密管道。)

    Q1: 如何使用GPG2和 *酒吧 要加密另一个文件的文件?

    Q2: 我怎么用GPG2和同伴 *秒 解密使用同伴加密的文件 *酒吧 文件?


    重要: 我只对适用于无监督操作的程序实现的答案感兴趣。请不要张贴只能交互执行的答案。我对可以在Python中实现的解决方案特别感兴趣。


    请包括相关文件的准确指针。

    3 回复  |  直到 7 年前
        1
  •  5
  •   Bsquare ℬℬ    7 年前

    关于你所说的一些信息:

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

        2
  •  1
  •   Martin Zeitler    7 年前

    当看着 encrypting and decrypting documents

    这暗示 pexpect 我可以提供定期的 expect 脚本:

    这不是一个直接的Python解决方案,但是应该很容易移植。

    如标语所示:

    pexpect使python成为控制其他应用程序的更好工具。

    加密 :

    gpg --output doc.gpg --encrypt --recipient blake@cyb.org doc
    

    作为 期待 脚本;用法 ./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
    

    作为 期待 脚本;用法: ./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
    

    几乎没有任何东西可以自动化;但是将导入的密钥设置为“可信”将需要 期待 用于自动化。找到这个 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 ;可以定义默认的密钥服务器。

        3
  •  0
  •   mnistic    7 年前

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

    现在可以绕过钥匙圈并获取公钥 直接从文件。该文件可以是二进制或ASCII装甲文件 只使用该文件的第一个键块。钥匙 使用此选项指定的总是完全受信任的。

    此选项可以与标准-r选项混合使用。 --隐藏的收件人文件(或-f)也可用。

    进一步帮助一些用例

    --没有钥匙圈

    也已实施。这和

    --没有默认的keyring--keyring/dev/null

    但可移植到Windows,也忽略指定的任何键环 (命令行或配置文件)。

    所以要加密,您需要:

    gpg --output myfileenc --encrypt --recipient-file key.pub myfile
    

    除了使用 expect use the --batch option . (您需要查看所提供的答案中哪一个最适合您的系统)。

    但是,没有这样的选项可用于密钥,事实上,也没有相同版本的PGP(2.1) deprecated the secring option --generate-key 命令,因此此文件不再可用。生成的密钥将需要添加到用于解密的密钥环中。

    推荐文章