Рекомендуемый криптографический модуль Python?

Я изучал, какие криптографические модули доступны для Python, и я нашел 3: ezPyCrypt, yawPyCrypt и KeyCzar (который на самом деле поддерживает несколько языков, но Python входит в их число). Первые два полагаются на модуль PyCrypto.

Есть ли варианты, которые мне не хватает? Есть ли явный лидер по простоте и возможностям, или все сводится к уровню комфорта?

В настоящее время я склоняюсь к KeyCzar, за которым следует ezPyCrypt.

Я бы использовал библиотеку для подписи и проверки цифровой подписи и, возможно, для создания ключа (хотя я не буду плакать, если мне придется вызывать что-то еще для этой функциональности).

Я использую Python 3.x и имею доступ к GPG.


person hewhocutsdown    schedule 16.07.2009    source источник
comment
Обновлен мой ответ с обзором API для python-gnupg.   -  person Vinay Sajip    schedule 16.07.2009
comment
Доступна версия 0.2 python-gnupg — протестирована с Python 3.0   -  person Vinay Sajip    schedule 17.07.2009
comment
Начиная с версии python 2.6 существует стандартная библиотека ssl TLS/SSL для объектов сокетов (ссылка документы .python.org/2/library/ssl.html).   -  person Robert Lujo    schedule 09.06.2013


Ответы (8)


Если вы работаете в среде, включающей GnuPG и Python >= 2.4, вы также можете рассмотреть такой инструмент, как python-gnupg. (Отказ от ответственности: я являюсь сопровождающим этого проекта.) Он оставляет тяжелую работу gpg и предоставляет довольно простой API.

Обзор API:

>>> import gnupg
>>> gpg = gnupg.GPG(gnupghome='/path/to/keyring/directory')
>>> gpg.list_keys()

[{
  ...
  'fingerprint': 'F819EE7705497D73E3CCEE65197D5DAC68F1AAB2',
  'keyid': '197D5DAC68F1AAB2',
  'length': '1024',
  'type': 'pub',
  'uids': ['', 'Gary Gross (A test user) ']},
 {
  ...
  'fingerprint': '37F24DD4B918CC264D4F31D60C5FEFA7A921FC4A',
  'keyid': '0C5FEFA7A921FC4A',
  'length': '1024',
  ...
  'uids': ['', 'Danny Davis (A test user) ']}]
>>> encrypted = gpg.encrypt("Hello, world!", ['0C5FEFA7A921FC4A'])
>>> str(encrypted)

'-----BEGIN PGP MESSAGE-----\nVersion: GnuPG v1.4.9 (GNU/Linux)\n
\nhQIOA/6NHMDTXUwcEAf
...
-----END PGP MESSAGE-----\n'
>>> decrypted = gpg.decrypt(str(encrypted), passphrase='secret')
>>> str(decrypted)
'Hello, world!'
>>> signed = gpg.sign("Goodbye, world!", passphrase='secret')
>>> verified = verified = gpg.verify(str(signed))
>>> print "Verified" if verified else "Not verified"

'Verified' 
person Vinay Sajip    schedule 16.07.2009
comment
Я заинтригован... не могли бы вы кратко объяснить, почему можно использовать py-gpg вместо PyCrypt? - person hewhocutsdown; 16.07.2009
comment
Для упрощения взаимодействия с другими системами и более точного соответствия API вашим потребностям. Например, недавно я работал над проектом крупного международного банка, который использовал GnuPG для отправки зашифрованных данных моему клиенту. Поскольку GnuPG выполнял работу на нашем конце, не было проблем с совместимостью и взаимодействием, о которых можно было бы беспокоиться. - person Vinay Sajip; 16.07.2009
comment
Н.Б. Я не тестировал python-gnupg с Python 3.x — имейте это в виду. - person Vinay Sajip; 16.07.2009
comment
Отлично, и спасибо за пример кода. Я нажму на него с 3.x и дам вам знать, как я его найду. - person hewhocutsdown; 16.07.2009
comment
Спасибо. Я только что провел тесты на Python 3, и были некоторые очевидные изменения синтаксиса, над которыми я работал. Я думаю, что интерфейс подпроцесса может быть большей проблемой - на данный момент существует достаточное количество использования StringIO, которое мне нужно будет реорганизовать. - person Vinay Sajip; 16.07.2009
comment
'(Отказ от ответственности: я являюсь сопровождающим этого проекта.)' Разве отказ от ответственности не говорит о том, что вы НЕ владеете чем-то, а не то, что вы им владеете? - person Mathime; 01.06.2016
comment
@Mathime - я отказываюсь от того, что даю бескорыстный, независимый совет. Это то, что вы обычно ожидаете от ответа, поэтому я счел справедливым указать, что у меня есть связь с предлагаемым решением. - person Vinay Sajip; 01.06.2016

Новая криптографическая библиотека для Python находится в стадии быстрой разработки уже несколько месяцев. Релиз 0.2.1 произошел всего несколько дней назад.

https://cryptography.io/en/latest/

В основном это оболочка CFFI для существующих библиотек C, таких как OpenSSL. Он распространяется как чистый модуль Python и поддерживает версии CPython 2.6–3.3, а также PyPy. Это также вышестоящая часть обновленного пакета pyOpenSSL.

Он направлен на то, чтобы раскрыть «рецепты» высокого уровня, которые делают криптографию максимально защищенной от идиотов, а также примитивы, которые следует использовать только с соответствующей осторожностью. Симметричные алгоритмы (включая AES-GCM) очень хорошо поддерживаются, а асимметричные алгоритмы, такие как RSA и DSA, должны появиться в следующих нескольких выпусках. Другие известные поддерживаемые алгоритмы включают PBKDF2, HKDF, HOTP и TOTP.

person Ayrx    schedule 26.02.2014
comment
Теперь, спустя несколько лет, эта библиотека стала намного более популярной. Насколько я могу судить, ей в основном удалось стать де-факто стандартной библиотекой Python для криптографии. - person John Y; 11.05.2018

Еще одна криптобиблиотека, которую следует рассмотреть, — это PyCryptodome, ответвление PyCrypto с поддержкой PyPy и еще несколько примитивов (SHA-3 , Salsa20, скрипт и т. д.).

person SquareRootOfTwentyThree    schedule 15.07.2014

pycrypt на самом деле представляет собой простой модуль шифрования/дешифрования AES, построенный поверх pycrypto, как и другие модули, которые вы упомянули — обратите внимание, что последний переходит на URL-адрес pycrypto.org, поскольку он меняет сопровождающих, а также стабильные версии и документы. все еще находятся на сайте автора. В дополнение к более простым в использовании оболочкам, которые вы упомянули, одним из плюсов pycrypto является то, что чистый питон подмножество этого поставляется вместе с Google App Engine, поэтому знакомство с ним будет полезно, если вы когда-нибудь захотите развернуть там какой-либо код.

Основная альтернатива (еще один мощный и сложный проект, такой как pycrypto) — это pyopenssl, который представляет собой довольно обычную оболочку (" "тонкая оболочка", как описывает ее автор) OpenSSL (это может быть плюсом, если вы привыкли кодирование на C с вызовами OpenSSL). Альтернативная упаковка, полная (поставляется с необходимыми библиотеками) и, возможно, более безопасная с юридической точки зрения (исключая части, в отношении которых есть патентные споры или сомнения), распространяется egenix.

Оба основных проекта (pycrypto и pyopenssl) пережили длительные периоды более или менее бездействия, поскольку первоначальные авторы занялись другими делами, но оба активно развиваются и снова поддерживаются, что всегда является хорошим знаком.

Я не знаю простых в использовании оберток поверх pyopenssl (скорее всего, они есть, но они не были опубликованы, как те, что поверх pycrypto), и поэтому, если, как кажется, вы заботитесь о простоте использования и не хотите писать обертки самостоятельно, те, что поверх pycrypto, кажутся лучшим выбором.

person Alex Martelli    schedule 16.07.2009
comment
в какой-то момент это может измениться, но в настоящее время я даже близко не способен написать такую ​​оболочку. :) Так что я, вероятно, буду придерживаться pycrypto, если эта идея py-gpg не лучше. Спасибо, что указали на pyopenssl! - person hewhocutsdown; 16.07.2009

Я только что провел такой опрос на прошлой неделе и принял M2Crypto, который, кажется, является самой продвинутой оболочкой на сегодняшний день по сравнению с openssl (нашел его в нескольких списках рекомендаций во время поиска в Google). Я также пробовал pycrypto, но он пропускает управление сертификатами и стандартное управление форматом файла ключа, которое есть у M2Crypto (с pycrypto вам нужно выбрать / распаковать свои ключи или написать свой собственный менеджер ключей для распространенных форматов).

Я обнаружил, что M2Crypto довольно прост в использовании и смог быстро разработать то, что мне было нужно (подписанный и зашифрованный формат пакета).

Однако я рекомендую скачать полный пакет, а не просто установить его, потому что в пакете вы также найдете хорошие примеры (посмотрите в демо-каталоге).

Вот ссылка http://pypi.python.org/pypi/M2Crypto/0.20. 1

Недостатком может быть то, что вы используете python 3.0, я застрял на работе с 2.5 (надеюсь, скоро будет 2.6) и не знаю, работает ли M2Crypto с python 3.0.

Я еще не очень практиковался с этим, если у вас есть конкретные проблемы с этим, просто спросите здесь. Может кто ответит.

person kriss    schedule 06.09.2009

PyCrypto — мой выбор (последнее обновление pypi от 24 мая 2012 г.), а исходный код размещенный на GitHub: https://github.com/dlitz/pycrypto. Он может выполнять чистую математику Python или использовать libgmp (вам потребуется sudo apt-get install libgmp-dev в Debian, чтобы включить последнюю версию).

M2Crypto — это оболочка для OpenSSL (последнее обновление pypi от 15 января 2011 г.), исходный код находится на http://svn.osafoundation.org/m2crypto/.

gnupg (обновлено 05 июня 2013 г.), см. Ответ Виная Саджипа. Существует исправленная вилка (обновлена ​​31 июля 2013 г.), размещенная по адресу https://github.com/isislovecruft/python-gnupg

Другие альтернативы упоминает Алекс Мартелли.

РЕДАКТИРОВАТЬ: критика существующих криптопакетов и ссылки на некоторые новые https://news.ycombinator.com/item?id=6194102

person Andrei    schedule 03.08.2013

Как насчет PyCrypto (ранее http://www.amk.ca/python/code/crypto.html)??

person 0x6adb015    schedule 16.07.2009
comment
спасибо, но это то, на что я уже ссылался (это PyCrypt, который обертывают ezPyCrypt и другие). - person hewhocutsdown; 16.07.2009
comment
PyCrypto больше не поддерживается. См. github.com/dlitz/pycrypto/issues/173. - person Elias Zamaria; 22.02.2016

Keyczar классный, но ему не хватает заполнения OAEP|PKCS, которое доступно только в Java-версии. https://code.google.com/p/keyczar/wiki/KeyczarTool

Кроме того, на данный момент отсутствует шифрование на основе пароля, доступное в C++. https://code.google.com/p/keyczar/issues/detail?id=149&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Implementation%20Summary

person Marko Benko    schedule 16.09.2014