使用Python cryptography库生成椭圆曲线私钥

4
我试着使用密码学中的hazmat在Python中生成公共/私密椭圆曲线密钥对。以下是我目前拥有的代码。当我运行时,它会生成错误“'NoneType'对象没有属性'generate_elliptic_curve_private_key'”。
ecurve = asymmetric.ec.EllipticCurve
ecurve.name = 'secp256r1'
ecurve.key_size = 128
ec_backend = cryptography.hazmat.backends.interfaces.EllipticCurveBackend.generate_elliptic_curve_private_key(cryptography.hazmat.backends.interfaces.EllipticCurveBackend, ecurve)
key = asymmetric.ec.generate_private_key(curve=ecurve, backend=ec_backend)  

以下是文档https://cryptography.io/en/latest/hazmat/primitives/asymmetric/ec/#的翻译:


“EllipticCurveBackend”... 这里的“backend”一词让我想到了“不要使用”。即使它能运行,它可能会在EC功能的第一次重写时崩溃。 - Maarten Bodewes
1个回答

14

我看不到 generate_elliptic_curve_private_key 方法的可用性。

以下是生成SECP256R1并将公钥序列化为PEM格式的示例:

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import ec

private_key = ec.generate_private_key(ec.SECP256R1(), default_backend())
public_key = private_key.public_key()
# serializing into PEM
rsa_pem = public_key.public_bytes(encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo)

打印键(key)

In [14]: print(rsa_pem.decode())
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEilwhueTwySfEbXd9y/inZVsYVG6z
/UJyVbN+cYgtIFd0vLdaP27cME8RGE/enMEcX7/jkb13j2DPnXt2R6teZw==
-----END PUBLIC KEY-----

这确实回答了问题,但是我试图在原始代码中设置密钥的大小。有没有办法在上面的代码中实现这一点? - Tim Welles
密钥大小严格绑定于曲线参数(例如,像secp256r1这样的命名曲线)。如果您需要更大的密钥大小,则需要使用不同的曲线。secp256r1具有256位的私钥,因为秘密标量(即私钥)是小于曲线阶数(即256位)的值。此处提供的示例是在给定曲线上生成密钥(和公共点序列化)的正确API。 - Paul Kehrer
那很有道理。谢谢! - Tim Welles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接