Cライブラリにアクセスする最もPython的な方法(OpenSSLなど)は何ですか?
-
05-07-2019 - |
質問
CBCストリームでBlowfishデータをエンコードするには、OpenSSLの暗号化機能にアクセスする必要があります。私はグーグルで検索して、いくつかのBlowfishライブラリ(手書き)といくつかのOpenSSLラッパー(どれも完全ではないようです。)
最後に、コマンド。それらにアクセスするためのpythonic /正しい方法は何ですか? SWIGのようなものを使用してPython / Cバインディングを許可しますか、それともより良い方法がありますか?
ありがとう!
解決
PythonでC(およびC ++)とやり取りする方法はたくさんあります。 ctypesは、ちょっとした拡張機能には適していますが、コンパイル時エラーを実行時セグメンテーション違反に変える傾向があります。独自の拡張機能を作成する場合、SIPは非常に便利です。 SWIGは非常に一般的ですが、より大きなフォローがあります。もちろん、最初にすべきことは、本当にインターフェースする必要があるかどうかを確認することです。 PyCryptoを見たことがありますか?
他のヒント
ctypes を開始する場所です。 Cで宣言された型などを使用してDLLを呼び出すことができます。必要なすべてを実行できない制限があるかどうかはわかりませんが、非常に機能的であり、標準ライブラリに含まれています。
フグのM2Crypto(OpenSSLラッパー)に満足しました。
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でも大成功を収めました。
M2Crypto もお勧めしますが、joeforkerのコードサンプルが少し奇妙に見える場合はBlowfishを含むM2Crypto暗号ユニットテストを理解するのが簡単になるかもしれません。 test_evp.py でCipherTestCaseを確認してください。