如何在Python中生成Diffie Hellman参数?

问题描述 投票:1回答:1

我需要在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不同的格式。

python diffie-hellman
1个回答
0
投票
所以,我也有同样的挣扎。多亏了irc 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需要generatorkey_sizebackend。现在,其中两个很容易。但是,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%绝对确定自己知道自己在做什么时,才应使用它,因为此模块中充满了带有雷射枪的地雷,龙和恐龙。

© www.soinside.com 2019 - 2024. All rights reserved.