Какой самый питонический способ доступа к библиотекам C — например, OpenSSL?

StackOverflow https://stackoverflow.com/questions/422903

  •  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top