Как использовать файлы * .pub / *. Sec для шифрования / дешифрования другого файла? - PullRequest
0 голосов
/ 30 декабря 2018

Я создал пару файлов *.pub и *.sec, используя инструкции и код, приведенный здесь:

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

(я использую эту документацию, потому что конечное приложение Iиметь в виду автоматизированный конвейер шифрования / дешифрования.)

Q1: Как я могу использовать gpg2 и файл *.pub для шифрования другого файла?

Q2: Как я могу использовать gpg2 и компаньон *.sec для расшифровки файла, зашифрованного с помощью файла компаньона *.pub?


Важно: Меня интересуют только те ответы, которые подходят для программной реализации неконтролируемой операции.Пожалуйста, не размещайте ответы, которые могут быть выполнены только в интерактивном режиме.Я особенно заинтересован в решениях, которые могут быть реализованы в Python.


Пожалуйста, включите точные ссылки на соответствующую документацию.

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Некоторая информация о том, что вы сказали:

Я создал пару файлов * .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)

Следует отметить, что моя связка ключей содержит пару pub / sec длямой Bsquare пользователь и ключ публикации Kjo пользователя.

0 голосов
/ 06 января 2019

Начиная с версии 2.1.14 , GPG поддерживает опцию --recipient-file, которая позволяет указать открытый ключ для шифрования без использования набора ключей. По словам разработчика :

Теперь можно обойти набор ключей и получить открытый ключ непосредственно из файла.Этот файл может быть двоичным или защищенным ключом ascii, и используется только первый блок ключей из этого файла.Ключ, указанный в этой опции, всегда полностью доверенный.

Эта опция может быть смешана со стандартными опциями -r.--hidden-получатель-файл (или -F) также доступен.

Чтобы помочь в некоторых случаях использования, опция

- без ключа

также былареализованы.Это похоже на

- no-default-keyring --keyring / dev / null

, но переносимо на Windows и также игнорирует любой указанный набор ключей (командная строка или файл конфигурации).

Чтобы зашифровать, вы должны сделать:

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

Для автоматизации, помимо использования expect или Python, как описано в других ответах, вы также можете использоватьопция --batch .(Вам необходимо выяснить, какой из предложенных ответов лучше всего работает в вашей системе.)

Однако такой вариант недоступен для секретного ключа и, по сути, той же версии PGP.(2.1) устарел параметр secring в команде --generate-key, поэтому этот файл даже больше не доступен.Сгенерированный ключ необходимо добавить в набор ключей, который будет использоваться для расшифровки.

0 голосов
/ 02 января 2019

при просмотре шифрование и дешифрование документов

это указывает на pexpect ;в то время как я могу предоставить обычные expect сценарии:

, это не является прямым решением Python, но его легко портировать.

, поскольку слоган гласит:

Pexpect делает Python лучшим инструментом для управления другими приложениями.

Шифрование :

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

как expect script;использование ./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 script;использование: ./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 для автоматизации.нашел этот шпаргалку , в которой есть все команды на одной странице;и также подсказывает: If you have multiple secret keys, it'll choose the correct one, or output an error if the correct one doesn't exist (что должно подтвердить мой комментарий ниже).

file ~/.gnupg/options - это файл опций пользователя ;где можно напримеропределить сервер ключей по умолчанию.

...