Я делаю программу на Python для распространения среди пользователей windows с помощью инсталлятора.
Программа должна иметь возможность каждый день скачивать файл, зашифрованный открытым ключом пользователя, а затем расшифровывать его.
Поэтому мне нужно найти библиотеку Python, которая позволит мне генерировать открытый и закрытый ключи PGP, а также расшифровывать файлы, зашифрованные открытым ключом.
Может ли это сделать pyCrypto (документация туманна)? Есть ли другие чистые библиотеки Python? Как насчет автономного инструмента командной строки на любом языке?
До сих пор я видел только GNUPG, но его установка на Windows приводит к изменениям в реестре и повсюду разбрасывает dll, а затем мне приходится беспокоиться о том, установлено ли это у пользователя, как сделать резервную копию существующих брелоков и т.д. Я бы предпочел просто иметь библиотеку python или инструмент командной строки и управлять ключами самостоятельно.
Обновление: pyME может работать, но он, похоже, не совместим с Python 2.4, который я должен использовать.
Вы Don'т нужна PyCrypto " или " PyMe, хотя эти пакеты могут быть - вы будете иметь всевозможные проблемы со сборкой под Windows. Вместо этого, почему бы не избежать кролика-отверстия и делать то, что я сделал? Используйте ключей GnuPG 1.4.9
. Вы Don'т нужно сделать полную установку на машинах конечных пользователей - просто gpg.exe и iconv.dll` из дистрибутива достаточно, и вы просто должны иметь их где-нибудь в пути или доступ из Python-кода, используя полный путь. Внесение изменений в реестр, и все (исполняемых файлов и файлов данных) может быть помещен в одну папку, если вы хотите.
Там'ы модуль GPG.py которым изначально была написана Эндрю Kuchling, улучшенная Ричард Джонс и усовершенствовать Стив Трауготт. Это'ы [здесь][1], но как-это Это's не подходит для Windows, потому что это использует
ОС.вызов Fork(). Хотя изначально часть
PyCrypto, **он является полностью независимым от других частей
PyCrypto и только gpg.exe/iconv.dll для того, чтобы работать**.
У меня есть версия (gnupg.py
) происходит от Трауготт'ы GPG.py
, которая использует модуль подпроцесс`. Она отлично работает под Windows, по крайней мере для моих целей - я использую его, чтобы сделать следующее:
Модуль я'ве есть, это не идеально, чтобы показать прямо сейчас, потому что она включает в себя некоторые другие вещи, которые должны'т быть там - значит, я могу'т освободить его как есть на данный момент. В какой-то момент, возможно, в ближайшие пару недель, я надеюсь, что смогу привести в порядок его, добавить некоторые модульные тесты (я не'Т есть какие-либо тесты для подписания/проверки подписи, например) и отпустите его (либо под оригинал PyCrypto лицензии или подобных коммерческих лицензий). Если вы можете't ждать, идти с Трауготт's модуль и самостоятельно его модифицировать - это было'т слишком много работы, чтобы сделать его работу с модулем
подпроцесс`.
Этот подход был намного менее болезненным, чем другие (например, глоток
на основе решений, или решений, которые требуют построения с помощью MinGW/
префикса msys), который я считал и экспериментировал с. Я'вэ использовал тот же подход (gpg.exe
/iconv.dll
) с системами, написанными на других языках, например, с#
с не менее безболезненных результатов.
P. S. Это работает с Python 2.4, а также в Python 2.5 и выше. Не проверял с другими версиями, но я Дон'т вижу никаких проблем.
После много копания, я нашел пакет, который работал для меня. Хотя говорят, что поддерживают генерацию ключей, я не't-тест это. Однако мне удалось расшифровать сообщение, зашифрованное с помощью открытого ключа GPG. Преимущество этого пакета заключается в том, что он не требует исполняемый файл GPG на машине, и питон основе реализации стандарта OpenPGP (а не обертка вокруг исполняемый). Я создал приватные и публичные ключи через программе Gpg4win и Клеопатра для 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, который я должен использовать" - уточните, пожалуйста?
И да, он существует как полупитоновская (SWIGd) обертка на GPGME - это популярный способ разработки расширений 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 (например, subprocess вместо ныне устаревшего os.popen2) будет несложно. Но вам все еще нужен установленный PGP, иначе PyPgp ничего не сделает;-).
В M2Crypto есть модуль PGP, но я никогда не пытался его использовать. Если вы попробуете, и это сработает, пожалуйста, дайте мне знать (я текущий сопровождающий M2Crypto). Некоторые ссылки:
Обновление: Модуль PGP не предоставляет способов генерации ключей, но предположительно они могут быть созданы с помощью модулей более низкого уровня RSA, DSA и т.д.. Я не знаю PGP изнутри, так что вам придется покопаться в деталях. Также, если вы знаете, как генерировать их с помощью команд командной строки openssl, то преобразовать их в вызовы M2Crypto должно быть достаточно легко.
Как другие уже отметили, PyMe является каноническим решением для этого, поскольку он's на основе GpgME, который является частью экосистемы, что GnuPG.
Для Windows, я настоятельно рекомендую использовать программе Gpg4win как распределение ключей GnuPG, по двум причинам:
Это's на основе GnuPG версии 2, в котором, среди прочего, включает в себя gpg2.exe, который может (наконец, я могу добавить :) начало
gpg-agent.exe по требованию (Гоб В1.X может'т).
А во-вторых, он'ы только официальные сборки Windows разработчики с GnuPG. Е. Г. это'ы полностью кросс-компиляции под Linux для Windows, поэтому не на йоту несвободных программ был использован при его подготовке (достаточно важно для безопасности :).