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

时间:2009-01-08 01:31:36

标签: c encryption openssl python

我需要访问OpenSSL的加密函数来编码CBC流中的Blowfish数据。我用Google搜索并找到了一些Blowfish库(手写)和一些OpenSSL包装器(似乎没有一个完整的。)

最后,我需要访问某些OpenSSL函数,例如commands的完整blowfish.h库。什么是pythonic /正确的访问方式?使用类似SWIG的东西来允许Python / C绑定,还是有更好的方法?

谢谢!

6 个答案:

答案 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。