Quel est le moyen le plus pythonique d’accéder aux bibliothèques C - par exemple, OpenSSL?

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

  •  05-07-2019
  •  | 
  •  

Question

Je dois accéder aux fonctions de chiffrement d'OpenSSL pour coder les données Blowfish dans des flux CBC. J'ai cherché sur Google et trouvé des bibliothèques Blowfish (écrites à la main) et des wrappers OpenSSL (aucun ne semble complet.)

À la fin, je dois accéder à certaines fonctions OpenSSL, telles que la bibliothèque complète blowfish.h de commandes . Quelle est la manière pythonique / correcte d'y accéder? Utiliser quelque chose comme SWIG pour autoriser les liaisons Python / C, ou existe-t-il un meilleur moyen?

Merci!

Était-ce utile?

La solution

Il existe de nombreuses façons d’interfacer avec C (et C ++) en Python. ctypes est très pratique pour les petites extensions rapides, mais il a pour habitude de transformer les erreurs de compilation en erreurs de compilation. Si vous cherchez à écrire votre propre extension, SIP est très agréable. SWIG est très général, mais a un public plus large. Bien sûr, la première chose que vous devriez faire est de voir si vous avez vraiment besoin d’interface. Avez-vous examiné PyCrypto?

Autres conseils

ctypes est le point de départ pour commencer. Il vous permet d’appeler des DLL, d’utiliser des types déclarés en C, etc. Je ne sais pas s’il existe des limitations qui vous empêcheront de faire tout ce dont vous avez besoin, mais elles sont très performantes et incluses dans la bibliothèque standard.

J'étais satisfait de M2Crypto (un wrapper OpenSSL) pour 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 est à peu près la méthode canonique. Fonctionne bien aussi.

J'ai également eu un bon succès avec Cython.

Je recommanderais également M2Crypto , mais si l'exemple de code par joeforker vous semble un peu étrange comprendre plus facilement les tests unitaires de chiffrement M2Crypto, qui incluent Blowfish. Consultez le CipherTestCase dans test_evp.py .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top