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

Riz*_*sim 3 c python encryption openssl

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

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

谢谢!

Ned*_*der 5

ctypes是开始的地方.它允许你使用C声明的类型等调用DLL.我不知道是否有限制会阻止你做你需要的一切,但它非常强大,它包含在标准库中.


Ben*_*son 5

有很多方法可以在Python中与C(和C++)进行交互.ctypes非常适合快速的小扩展,但它有将编译时错误转换为运行时段错误的习惯.如果你想编写自己的扩展,SIP非常好.SWIG很一般,但有更多的追随者.当然,你应该做的第一件事就是看你是否真的需要接口.你看过PyCrypto了吗?


joe*_*ker 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
Run Code Online (Sandbox Code Playgroud)