【问题标题】:Generating Elliptic Curve Private Key in Python with the cryptography library使用密码库在 Python 中生成椭圆曲线私钥
【发布时间】:2020-04-02 05:17:31
【问题描述】:

我正在尝试使用密码学中的危险材料在 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 ... 这里的“后端”一词对我大喊“不要使用”。即使它运行,它也可能在第一次重写 EC 功能时崩溃。

标签: python cryptography elliptic-curve python-cryptography


【解决方案1】:

我看不到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)

打印密钥

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

【讨论】:

  • 这确实回答了这个问题,但是,我试图在原始代码中设置密钥的大小。上面有没有办法做到这一点?
  • 密钥大小与曲线参数严格相关(例如,像 secp256r1 这样的命名曲线)。如果您想要更大的密钥大小,则需要使用不同的曲线。 secp256r1 具有 256 位的私钥,因为秘密标量(私钥)的值小于曲线的阶数(即 256 位)。此处提供的示例是在给定曲线上生成密钥(和公共点序列化)的正确 API。
  • 这是有道理的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-11-09
  • 2016-07-19
  • 2018-12-20
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
相关资源
最近更新 更多