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

В SQL Server 2016 вы можете использовать новые операторы DIE.

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Приведенный выше запрос может быть запущен повторно drops для столбца, только если он exists в таблице, иначе он не выдаст ошибку.

Вместо использования больших IF оберток для проверки существования column перед его удалением вы можете просто выполнить приведенное выше выражение DDL

32
задан dreftymac 25 April 2018 в 19:36
поделиться

5 ответов

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

Там есть модуль GPG.py , который изначально был написан Эндрю Кучлингом, улучшен Ричардом Джонсом и улучшен Стивом Трауготтом. Он доступен здесь , но как есть он не подходит для Windows, поскольку использует os.fork () . Хотя изначально он был частью PyCrypto , , он полностью независим от других частей PyCrypto и требует только gpg.exe / iconv.dll для работы . 12121] У меня есть версия ( gnupg.py ), полученная из GPG.py Трауготта, в которой используется модуль subprocess . Он отлично работает под Windows, по крайней мере, для моих целей - я использую его для следующих целей:

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

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

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

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

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

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

28
ответ дан 27 November 2019 в 20:45
поделиться

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

3
ответ дан 27 November 2019 в 20:45
поделиться

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

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

3
ответ дан 27 November 2019 в 20:45
поделиться

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

Хотя документацию найти трудно. by, если вы просмотрите 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
7
ответ дан 27 November 2019 в 20:45
поделиться

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

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

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

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

3
ответ дан 27 November 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: