我需要访问OpenSSL的加密功能,以在CBC流中编码Blowfish数据。我已经搜索并找到了一些手写的Blowfish库和一些OpenSSL包装器(但似乎没有完整的)。最终,我需要访问某些OpenSSL函数,例如commands的完整blowfish.h库。访问它们的Pythonic/正确方法是什么?使用类似SWIG的工具允许Python/C绑定,还是有更好的方法?谢谢!
有很多方法可以在Python中与C(和C ++)进行接口。ctypes非常适合快速小型扩展,但它有一个习惯,将编译时错误转换为运行时段错误。如果您想编写自己的扩展,SIP非常好。SWIG非常通用,但拥有更大的追随者群体。当然,您应该首先确定是否真正需要进行接口。您看过PyCrypto了吗?
对于blowfish加密,我很满意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
我也会推荐M2Crypto,但如果joeforker的代码示例看起来有点奇怪,您可能更容易理解M2Crypto密码单元测试,其中包括Blowfish。请查看test_evp.py中的CipherTestCase。
SWIG是一种非常经典的方法。而且效果很好。
我也用Cython取得了不错的成功。