Как использовать PGP на Python (генерировать ключи, шифровать/дешифровать)
-
06-07-2019 - |
Вопрос
Я создаю программу на Python, которая будет распространяться среди пользователей Windows через установщик.
Программа должна иметь возможность каждый день загружать файл, зашифрованный открытым ключом пользователя, а затем расшифровывать его.
Итак, мне нужно найти библиотеку Python, которая позволит мне генерировать открытые и частные ключи PGP, а также расшифровывать файлы, зашифрованные с помощью открытого ключа.
Это что-то, что сделает pyCrypto (документация туманна)?Существуют ли другие чистые библиотеки Python?Как насчет автономного инструмента командной строки на любом языке?
Все, что я видел до сих пор, это GNUPG, но его установка в Windows меняет реестр и выбрасывает dll повсюду, и тогда мне приходится беспокоиться о том, установлена ли она уже у пользователя, как сделать резервную копию существующих связок ключей и т. д.Я бы предпочел просто иметь библиотеку Python или инструмент командной строки и самостоятельно управлять ключами.
Обновлять:pyME может работать, но, похоже, он несовместим с Python 2.4, который мне приходится использовать.
Решение
Вам не нужно PyCrypto
или PyMe
, хотя эти пакеты могут быть хороши - у вас возникнут всевозможные проблемы при сборке под Windows.Вместо этого, почему бы не избегать кроличьих нор и не делать то, что сделал я?Использовать gnupg 1.4.9
.Вам не нужно выполнять полную установку на компьютерах конечных пользователей — просто gpg.exe
и iconv.dll
из дистрибутива достаточно, и вам просто нужно разместить их где-нибудь в пути или получить к ним доступ из вашего кода Python, используя полное имя пути.Никаких изменений в реестре не требуется, и все (исполняемые файлы и файлы данных) при желании можно ограничить одной папкой.
Есть модуль GPG.py
который был первоначально написан Эндрю Кучлингом, улучшен Ричардом Джонсом и улучшен Стивом Трауготтом.Это доступно здесь, но он не подходит для Windows, поскольку использует os.fork()
.Хотя первоначально часть PyCrypto
, он полностью независим от других частей PyCrypto
и для работы требуется только gpg.exe/icuv.dll.
У меня есть версия(gnupg.py
) получено из Трауготта GPG.py
, который использует subprocess
модуль.Он отлично работает под Windows, по крайней мере, для моих целей — я использую его для следующего:
- Управление ключами – генерация, листинг, экспорт и т. д.
- Импортируйте ключи из внешнего источника (например.открытые ключи, полученные от компании-партнера)
- Шифрование и дешифрование данных
- Подпишите и проверьте подписи
Модуль, который у меня есть, не идеален для показа прямо сейчас, потому что он включает в себя некоторые другие вещи, которых там не должно быть - а это значит, что я не могу выпустить его как есть на данный момент.В какой-то момент, возможно, в ближайшие пару недель, я надеюсь, что смогу привести его в порядок, добавить еще несколько модульных тестов (например, у меня нет модульных тестов для подписи/проверки) и опубликовать его (либо в разделе оригинал PyCrypto
лицензию или аналогичную коммерческую лицензию).Если не терпится, возьмите модуль Трауготта и измените его самостоятельно — заставить его работать с subprocess
модуль.
Этот подход был намного менее болезненным, чем другие (например, SWIG
основанные на решениях или решения, которые требуют создания с MinGW
/MSYS
), над которым я рассматривал и экспериментировал.Я использовал то же самое (gpg.exe
/iconv.dll
) подход с системами, написанными на других языках, например. C#
, с одинаково безболезненными результатами.
P.S.Он работает с Python 2.4, а также с Python 2.5 и более поздних версий.С другими версиями не проверял, хотя проблем не предвижу.
Другие советы
После МНОГО копания я нашел пакет, который работал для меня. Хотя говорят, что он поддерживает генерацию ключей, я не тестировал его. Однако мне удалось расшифровать сообщение, которое было зашифровано с использованием открытого ключа GPG. Преимущество этого пакета в том, что он не требует исполняемого файла GPG на компьютере и представляет собой реализацию OpenPGP на основе Python (а не обертку вокруг исполняемого файла). Я создал закрытый и открытый ключи, используя GPG4win и kleopatra для Windows Смотрите мой код ниже.
import pgpy
emsg = pgpy.PGPMessage.from_file(<path to the file from the client that was encrypted using your public key>)
key,_ = pgpy.PGPKey.from_file(<path to your private key>)
with key.unlock(<your private key passpharase>):
print (key.decrypt(emsg).message)
Хотя вопрос очень старый. Надеюсь, это поможет будущим пользователям.
PyCrypto поддерживает PGP - хотя вы должны проверить его, чтобы убедиться, что он работает в соответствии с вашими спецификациями.
Хотя трудно найти документацию, если вы посмотрите Util / test.py (скрипт тестирования модуля), вы можете найти элементарный пример их поддержки PGP:
if verbose: print ' PGP mode:',
obj1=ciph.new(password, ciph.MODE_PGP, IV)
obj2=ciph.new(password, ciph.MODE_PGP, IV)
start=time.time()
ciphertext=obj1.encrypt(str)
plaintext=obj2.decrypt(ciphertext)
end=time.time()
if (plaintext!=str):
die('Error in resulting plaintext from PGP mode')
print_timing(256, end-start, verbose)
del obj1, obj2
Кроме того, PublicKey / pubkey.py предоставляет следующие соответствующие методы:
def encrypt(self, plaintext, K)
def decrypt(self, ciphertext):
def sign(self, M, K):
def verify (self, M, signature):
def can_sign (self):
"""can_sign() : bool
Return a Boolean value recording whether this algorithm can
generate signatures. (This does not imply that this
particular key object has the private information required to
to generate a signature.)
"""
return 1
PyMe заявляет о полной совместимости с Python 2.4, и я цитирую:
Последняя версия PyMe (по состоянию на написание) v0.8.0. Его двоичный дистрибутив для Debian был скомпилирован с SWIG v1.3.33 и GCC v4.2.3 для GPGME v1.1.6 и Python v2.3.5, v2.4.4 и v2.5.2 (предоставленные в «нестабильное» распределение в то время). Его бинарный дистрибутив для Windows был скомпилирован с SWIG v1.3.29 и MinGW v4.1 для GPGME v1.1.6 и Python v2.5.2 (хотя тот же бинарный получить установлен и прекрасно работает в v2.4.2 как а). р>
Я не уверен, почему вы говорите " он не совместим с Python 2.4, который я должен использовать " - подробности, пожалуйста?
И да, в GPGME он существует в виде полупифонической (SWIGd) оболочки - это популярный способ разработки расширений Python, если у вас есть библиотека C, которая в основном выполняет свою работу.
PyPgp имеет гораздо более простой подход - вот почему один простой скрипт на Python: в основном он не делает ничего, кроме "shell out" к командам командной строки PGP. Например, расшифровка просто:
def decrypt(data):
"Decrypt a string - if you have the right key."
pw,pr = os.popen2('pgpv -f')
pw.write(data)
pw.close()
ptext = pr.read()
return ptext
То есть, запишите зашифрованный зашифрованный текст на стандартный ввод pgpv -f
, прочитайте стандартный вывод pgpv как расшифрованный открытый текст.
PyPgp - также очень старый проект, хотя его простота означает, что заставить его работать с современным Python (например, подпроцесс вместо устаревшего os.popen2) не составит труда. Но вам все равно нужно PGP установить, иначе PyPgp ничего не сделает; -).
М2Крипто есть модуль PGP, но я никогда не пробовал его использовать.Если вы попробуете, и это сработает, пожалуйста, дайте мне знать (в настоящее время я являюсь сопровождающим M2Crypto).Некоторые ссылки:
Обновлять: Модуль PGP не предоставляет способов генерации ключей, но предположительно их можно создать на более низком уровне. ЮАР, ДПО и т. д.модули.Я не знаю внутренностей PGP, так что вам придется покопаться в деталях.Кроме того, если вы знаете, как генерировать их с помощью команд командной строки openssl, вам будет достаточно легко преобразовать их в вызовы M2Crypto.
Как уже отмечалось, PyMe является каноническим решением для этого, поскольку он основан на GpgME, который является частью экосистемы GnuPG.
Для Windows я настоятельно рекомендую использовать Gpg4win в качестве дистрибутива GnuPG по двум причинам:
Он основан на GnuPG 2, которая, помимо прочего, включает в себя gpg2.exe
, который может (наконец, я мог бы добавить :) запустить gpg-agent.exe
по требованию (gpg v1.x не может).
А во-вторых, это единственная официальная сборка Windows от разработчиков GnuPG. Например. он полностью кросс-скомпилирован из Linux в Windows, поэтому при его подготовке не использовалось ни капли несвободного программного обеспечения (что очень важно для пакета безопасности:).