Какой самый питонический способ доступа к библиотекам C — например, OpenSSL?
-
05-07-2019 - |
Вопрос
Мне нужен доступ к криптографическим функциям OpenSSL для кодирования данных Blowfish в потоках CBC.Я погуглил и нашел несколько библиотек Blowfish (написанных от руки) и несколько оболочек OpenSSL (ни одна из них не кажется полной).
В конце концов, мне нужен доступ к определенным функциям OpenSSL, например, к полной библиотеке Blowfish.h. команды.Каков питонический/правильный способ доступа к ним?Использование чего-то вроде SWIG для разрешения привязок Python/C или есть лучший способ?
Спасибо!
Решение
В Python существует множество способов взаимодействия с C (и C++).ctypes очень удобен для быстрых небольших расширений, но он имеет привычку превращать ошибки времени компиляции в ошибки сегментов во время выполнения.Если вы хотите написать собственное расширение, SIP очень удобен.SWIG носит очень общий характер, но имеет большее число последователей.Конечно, первое, что вам следует сделать, — это посмотреть, действительно ли вам нужен интерфейс.Вы смотрели PyCrypto?
Другие советы
cтипы это место для начала.Он позволяет вам вызывать библиотеки DLL, используя типы, объявленные в C, и т. д.Я не знаю, есть ли ограничения, которые не позволяют вам делать все, что вам нужно, но он очень функционален и включен в стандартную библиотеку.
Я был доволен M2Crypto (оболочкой OpenSSL) для Blowfish.
import M2Crypto
from M2Crypto import EVP
import base64
import struct
key = '0' * 16 # security FTW
iv = '' # initialization vector FTW
dummy_block = ' ' * 8
encrypt = EVP.Cipher('bf_cbc', key, iv, M2Crypto.encrypt)
decrypt = EVP.Cipher('bf_cbc', key, iv, M2Crypto.decrypt)
binary = struct.pack(">Q", 42)
ciphertext = encrypt.update(binary)
decrypt.update(ciphertext) # output is delayed by one block
i = struct.unpack(">Q", decrypt.update(dummy_block))
print i
SWIG — это во многом канонический метод.Тоже хорошо работает.
Я также добился хороших успехов с Cython.
Я бы посоветовал М2Крипто также, но если пример кода от joeforker выглядит немного странно, возможно, вам будет легче понять модульные тесты шифрования M2Crypto, которые включают Blowfish.Проверьте CipherTestCase в test_evp.py.