Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Вам не нужны 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), полученная из Traugott GPG.py, которая использует модуль subprocess. Он отлично работает под Windows, по крайней мере для моих целей - я использую его для выполнения следующих действий:

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

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

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

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

Ответ 2

PyCrypto поддерживает PGP - хотя вы должны проверить его, чтобы убедиться, что он работает с вашими спецификациями.

Несмотря на то, что документация трудно найти, если вы просмотрите Util/test.py(модуль test script), вы можете найти элементарный пример поддержки 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

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

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

Ответ 4

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 (хотя один и тот же двоичный код установлен и отлично работает в версии 2.4. а).

Я не уверен, почему вы говорите: "Кажется, он не совместим с Python 2.4, который я должен использовать" - особенности, пожалуйста?

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

PyPgp имеет гораздо более простой подход - почему он один простой Python script: в основном он ничего не делает чем "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

i.e, напишите зашифрованный cyphertext на стандартный ввод pgpv -f, прочитайте стандартный вывод pgpv как расшифрованный открытый текст.

PyPgp также является очень старым проектом, хотя его простота означает, что заставить его работать с современным Python (например, подпроцессом вместо устаревшего os.popen2) будет непросто. Но вам все равно нужен PGP, или PyPgp ничего не сделает; -).

Ответ 5

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

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

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

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

Ответ 6

После многократного поиска я нашел пакет, который работал у меня. Хотя говорят, что он поддерживает создание ключей, я не тестировал его. Однако мне удалось расшифровать сообщение, которое было зашифровано с помощью открытого ключа GPG. Преимущество этого пакета заключается в том, что он не требует исполняемого файла GPG на машине и представляет собой реализацию OpenPGP на основе Python (а не обертку вокруг исполняемого файла). Я создал частные и открытые ключи, используя GPG4win и kleopatra для окон См. Мой код ниже.

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)

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