我需要在Python中生成一个PEM编码的字符串,其中包含DH参数,如下所示:
openssl dhparam -out dhparam.pem 1024
不同的是,我想获得一个字符串对象而不是写到磁盘。
如何实现?
挖掘时,我发现以下代码:
from OpenSSL._util import ffi as _ffi, lib as _lib
dh = _lib.DH_new()
_lib.DH_generate_parameters_ex(dh, 2048, 2, _ffi.NULL)
_lib.DHparams_print_fp(dhfile, dh)
with open('dh.pem', 'w') as dhfile:
_lib.DHparams_print_fp(dhfile, dh)
但是此代码写入磁盘,并且使用与PEM不同的格式。
FreeNode/#cryptography-dev
的一些帮助,我才得以将其迷惑:from cryptography.hazmat.primitives.serialization import Encoding
from cryptography.hazmat.primitives.asymmetric import dh as _dh
from cryptography.hazmat.backends.interfaces import DHBackend
from cryptography.hazmat.backends.openssl.backend import backend
from cryptography.hazmat.primitives.serialization import ParameterFormat
def generate_diffie_hellman(key_size):
# "generator is often 2 or 5" / "generator must be 2 or 5.." (depending on where you read)
DHBackend.generate_dh_parameters(backend, generator=2, key_size=key_size)
dh_parameters = _dh.generate_parameters(generator=2, key_size=key_size, backend=backend)
return dh_parameters.parameter_bytes(Encoding.PEM, ParameterFormat.PKCS3)
with open('dh1024.pem', 'wb') as output:
output.write(generate_diffie_hellman(1024))
作为参考,我设法通过以下资源和以下步骤将其结合在一起。而且我将在这里保存自己的思考过程,因为我很可能会在一年内再次需要同样的帮助。.狩猎在帮助下开始:
给出一个DHParameters对象,调用parameter_bytes()并将它们写入文件:https://cryptography.io/en/latest/hazmat/primitives/asymmetric/dh/#cryptography.hazmat.primitives.asymmetric.dh.DHParameters.parameter_bytes因此,DHParameters是一个抽象类,因此我需要一个实例作为第一个参数。不知道该实例将是什么。
因此,经过一阵后退和第四次,我得到了另一个指针:
https://cryptography.io/en/latest/hazmat/primitives/asymmetric/dh/#cryptography.hazmat.primitives.asymmetric.dh.generate_parameters因此,generate_parameters需要
generator
,key_size
和backend
。现在,其中两个很容易。但是,DHBackend让我回到了开始,因为它也是需要实例的abstract class。因此,我采用了一个随机的,比较流行的函数来使搜索变得容易一些[[(因为这个问题奇怪地是非常利基)。目标变为:load_pem_x509_certificate,它是我一直在努力的同一anonymous class structure的函数。因此,如果我可以使它起作用,则对更多未搜索/得不到帮助的类应该使用相同的逻辑DHBackend。经过几次搜索之后,我找到了this reference documentation:
from cryptography.hazmat.backends import default_backend cert = x509.load_pem_x509_certificate(pem_data, default_backend())
default_backend
是我需要的后端实例。可以通过搜索和找到this snippet来简化:
from cryptography.hazmat.backends.openssl.backend import backend
将backend
传递到DHBackend.generate_dh_parameters(backend, generator=2, key_size=key_size)
意味着我们不需要实例化DHBackend
,因为第一个实例将是cryptography
自己的后端的实例。
现在,我将结束于音符上。我不知道这一切或暗示什么。正如documentation所说:
危险!这是“危险材料”模块。仅当您100%绝对确定自己知道自己在做什么时,才应使用它,因为此模块中充满了带有雷射枪的地雷,龙和恐龙。