访问C库的最pythonic方式是什么-例如,OpenSSL?

3
我需要访问OpenSSL的加密功能,以在CBC流中编码Blowfish数据。我已经搜索并找到了一些手写的Blowfish库和一些OpenSSL包装器(但似乎没有完整的)。最终,我需要访问某些OpenSSL函数,例如commands的完整blowfish.h库。访问它们的Pythonic/正确方法是什么?使用类似SWIG的工具允许Python/C绑定,还是有更好的方法?谢谢!
6个回答

5

ctypes是一个很好的起点,它可以让你使用C声明的类型等方式调用DLL。我不知道是否存在限制会阻止你完成所有需要的操作,但它非常强大,并且已经包含在标准库中。


5

有很多方法可以在Python中与C(和C ++)进行接口。ctypes非常适合快速小型扩展,但它有一个习惯,将编译时错误转换为运行时段错误。如果您想编写自己的扩展,SIP非常好。SWIG非常通用,但拥有更大的追随者群体。当然,您应该首先确定是否真正需要进行接口。您看过PyCrypto了吗?


我曾经瞥了一眼,但我担心为什么有人接管了这个项目,并建议不要使用旧版本(它很容易出错),也不要建议任何人使用新版本。现在我会尝试一下,然后再用ctypes或swig或sip重新处理。谢谢。 - Rizwan Kassim

5

对于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

最终使用了PyCrypto,但如何访问C库的基本问题仍然很有趣。M2Crypto很有意思,谢谢! - Rizwan Kassim

0

我也会推荐M2Crypto,但如果joeforker的代码示例看起来有点奇怪,您可能更容易理解M2Crypto密码单元测试,其中包括Blowfish。请查看test_evp.py中的CipherTestCase。


0

SWIG是一种非常经典的方法。而且效果很好。


0

我也用Cython取得了不错的成功。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接