Как использовать PGP на Python (генерировать ключи, шифровать/дешифровать)

StackOverflow https://stackoverflow.com/questions/1020320

Вопрос

Я создаю программу на 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, поэтому при его подготовке не использовалось ни капли несвободного программного обеспечения (что очень важно для пакета безопасности:).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top