我需要访问OpenSSL的加密函数来编码CBC流中的Blowfish数据。我用Google搜索并找到了一些Blowfish库(手写)和一些OpenSSL包装器(似乎没有一个完整的。)
最后,我需要访问某些OpenSSL函数,例如commands的完整blowfish.h库。什么是pythonic /正确的访问方式?使用类似SWIG的东西来允许Python / C绑定,还是有更好的方法?
谢谢!
答案 0 :(得分:5)
ctypes是值得一去的地方。它允许你使用C声明的类型等调用DLL。我不知道是否有限制会阻止你做你需要的一切,但是它非常强大,并且它包含在标准库中。
答案 1 :(得分:5)
在Python中有很多与C(和C ++)接口的方法。 ctypes非常适合快速的小扩展,但它习惯于将编译时错误转换为运行时段错误。如果你想编写自己的扩展,SIP非常好。 SWIG很一般,但有更多的追随者。当然,你应该做的第一件事就是看你是否真的需要接口。你看过PyCrypto吗?
答案 2 :(得分:5)
我很喜欢用于河豚的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
答案 3 :(得分:0)
SWIG几乎是规范方法。效果也不错。
答案 4 :(得分:0)
我也在Cython上取得了很大的成功。
答案 5 :(得分:0)
我也建议使用M2Crypto,但如果joeforker的代码示例看起来有点奇怪,您可能会更容易理解M2Crypto密码单元测试,其中包括Blowfish。查看test_evp.py中的CipherTestCase。