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

时间:2016-09-16 14:53:25

标签: python diffie-hellman

我需要在Python中生成一个包含DH参数的PEM编码字符串,如下所示:

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不同的格式。

1 个答案:

答案 0 :(得分:1)

所以,我也经历了同样的挣扎。并感谢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_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自己的后端的实例。 / p>


现在,我将在音符上结束。.我不知道这一切或暗示什么。
正如documentation所说:

危险!

这是一个“危险材料”模块。仅当您100%绝对确定自己知道自己在做什么时,才应使用它,因为此模块中充满了带有雷射枪的地雷,龙和恐龙。