Как сделать PGP в Python (генерировать ключи, шифровать / дешифровать) - PullRequest
31 голосов
/ 20 июня 2009

Я делаю программу на Python для распространения среди пользователей Windows через установщик.

Программа должна иметь возможность ежедневно загружать файл, зашифрованный открытым ключом пользователя, а затем расшифровывать его.

Так что мне нужно найти библиотеку Python, которая позволит мне генерировать открытые и закрытые ключи PGP, а также расшифровывать файлы, зашифрованные открытым ключом.

Это то, что pyCrypto будет делать (документация туманна)? Есть ли другие чистые библиотеки Python? Как насчет автономного инструмента командной строки на любом языке?

Все, что я до сих пор видел, это GNUPG, но его установка в Windows делает что-то в реестре и выдает dll везде, а затем мне нужно беспокоиться о том, установил ли пользователь это, как сделать резервную копию своих существующих ключей и т.д. Я бы предпочел просто иметь библиотеку Python или инструмент командной строки и управлять ключами самостоятельно.

Обновление: pyME может работать, но он не совместим с Python 2.4, который я должен использовать.

Ответы [ 6 ]

28 голосов
/ 28 июня 2009

Вам не нужны PyCrypto или PyMe, хорошо, хотя эти пакеты могут быть - у вас возникнут всевозможные проблемы при сборке под Windows. Вместо этого, почему бы не избежать кроличьей норы и сделать то, что я сделал? Используйте gnupg 1.4.9. Вам не нужно выполнять полную установку на компьютерах конечных пользователей - достаточно всего лишь gpg.exe и iconv.dll из дистрибутива, и вам просто нужно иметь их где-то в пути или получить доступ из вашего кода Python, используя полный путь к файлу. Никаких изменений в реестре не требуется, и все (исполняемые файлы и файлы данных) можно ограничить одной папкой, если хотите.

Есть модуль GPG.py, который был изначально написан Эндрю Кучлингом, улучшен Ричардом Джонсом и улучшен Стивом Трауготтом. Он доступен здесь , но, как есть, он не подходит для Windows, потому что он использует os.fork(). Хотя изначально часть PyCrypto, полностью независима от других частей PyCrypto, для работы .

требуется только gpg.exe / iconv.dll.

У меня есть версия (gnupg.py), полученная из GPG.py Трауготта, в которой используется модуль subprocess. Он отлично работает под Windows, по крайней мере, для моих целей - я использую его для следующих целей:

  • Управление ключами - генерация, листинг, экспорт и т. Д.
  • Импорт ключей из внешнего источника (например, открытые ключи, полученные от компании-партнера)
  • Шифрование и дешифрование данных
  • Подпись и проверка подписей

Модуль, который у меня есть, не идеален для показа сейчас, потому что он включает в себя некоторые другие вещи, которых там быть не должно - что означает, что я не могу выпустить его как есть в данный момент. В какой-то момент, возможно, в ближайшие пару недель, я надеюсь, что смогу привести его в порядок, добавить еще несколько юнит-тестов (например, у меня нет юнит-тестов для подписи / проверки) и выпустить их (либо в оригинальная PyCrypto лицензия или аналогичная коммерчески доступная лицензия). Если вы не можете ждать, перейдите с модулем Traugott и измените его самостоятельно - его работа с модулем subprocess была не слишком большой.

Этот подход был намного менее болезненным, чем другие (например, решения, основанные на SWIG, или решения, требующие сборки с MinGW / MSYS), которые я рассмотрел и экспериментировал. Я использовал тот же (gpg.exe / iconv.dll) подход с системами, написанными на других языках, например C#, с одинаково безболезненными результатами.

P.S. Он работает с Python 2.4, а также с Python 2.5 и более поздними версиями. Не тестировался с другими версиями, хотя проблем не предвидится.

8 голосов
/ 10 октября 2017

После МНОГО копания я нашел пакет, который работал на меня. Хотя говорят, что он поддерживает генерацию ключей, я не тестировал его. Однако мне удалось расшифровать сообщение, которое было зашифровано с использованием открытого ключа 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)

Хотя вопрос очень старый. Надеюсь, это поможет будущим пользователям.

7 голосов
/ 24 июня 2009

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

Futhermore, 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
3 голосов
/ 31 июля 2009

Как уже отмечалось, PyMe является каноническим решением для этого, поскольку он основан на GpgME, который является частью экосистемы GnuPG.

Для Windows я настоятельно рекомендую использовать Gpg4win в качестве дистрибутива GnuPG по двум причинам:

Он основан на GnuPG 2, который, помимо прочего, включает gpg2.exe, который может (наконец, я мог бы добавить :) запустить gpg-agent.exe по запросу (gpg v1.x не может).

А во-вторых, это единственная официальная сборка Windows от разработчиков GnuPG. Например. он полностью кросс-компилирован из Linux в Windows, поэтому при его подготовке не использовалось ни капли несвободного программного обеспечения (что очень важно для пакета обеспечения безопасности:).

3 голосов
/ 25 июня 2009

M2Crypto имеет модуль PGP, но на самом деле я никогда не пытался его использовать.Если вы попробуете это, и это сработает, пожалуйста, дайте мне знать (я текущий сопровождающий M2Crypto).Некоторые ссылки:

Обновление: Модуль PGP не предоставляет способов для генерации ключей, но предположительно они могут быть созданы с более низким уровнем RSA , DSA и др. модули.Я не знаю внутренностей PGP, так что вам придется выкопать детали.Кроме того, если вы знаете, как генерировать их с помощью команд командной строки openssl, должно быть достаточно легко преобразовать это в вызовы M2Crypto.

3 голосов
/ 24 июня 2009

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, который я должен использовать» - уточните, пожалуйста?

И да, он существует в виде полупифонической (SWIGd) оболочки в GPGME - это популярный способ разработки расширений Python, если у вас есть библиотека C, которая в основном выполняет эту работу.

PyPgp имеет гораздо более простой подход - вот почему это один простой скрипт Python: в основном он не делает ничего, кроме "shell" для команд 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 ничего не сделает; -).

...