3

我需要访问 OpenSSL 的加密功能以在 CBC 流中编码 Blowfish 数据。我用谷歌搜索并找到了一些 Blowfish 库(手写)和一些 OpenSSL 包装器(似乎都不完整。)

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

谢谢!

4

6 回答 6

5

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

于 2009-01-08T01:48:17.273 回答
5

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

于 2009-01-08T03:08:23.163 回答
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
于 2009-02-06T18:27:35.270 回答
0

SWIG 几乎是规范的方法。效果也不错。

于 2009-01-08T01:59:23.210 回答
0

我在 Cython 上也取得了很好的成功。

于 2009-01-09T20:37:31.977 回答
0

I would recommend M2Crypto as well, but if the code sample by joeforker looks a bit strange you might have an easier time understanding the M2Crypto cipher unit tests, which include Blowfish. Check out the CipherTestCase in test_evp.py.

于 2009-02-07T00:11:19.243 回答