欢迎访问宙启技术站
智能推送

使用Python生成ECDSA椭圆曲线密钥对的方法

发布时间:2023-12-17 14:26:16

在Python中,可以使用cryptography库来生成ECDSA(Elliptic Curve Digital Signature Algorithm)椭圆曲线密钥对。下面是一个基本的使用例子:

首先,确保已经安装了cryptography库。可以使用以下命令进行安装:

pip install cryptography

然后,使用下面的代码生成ECDSA椭圆曲线密钥对:

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

# 生成ECDSA密钥对
private_key = ec.generate_private_key(ec.SECP256K1())
public_key = private_key.public_key()

# 将私钥保存为PEM格式的文件
private_key_pem = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)
with open("private_key.pem", "wb") as f:
    f.write(private_key_pem)

# 将公钥保存为PEM格式的文件
public_key_pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)
with open("public_key.pem", "wb") as f:
    f.write(public_key_pem)

在上述代码中,使用ec.generate_private_key(ec.SECP256K1())生成了一个SECP256K1椭圆曲线私钥。然后,通过private_key.public_key()获取对应的公钥。

接下来,使用private_key.private_bytes()将私钥保存为PEM格式的文件,使用public_key.public_bytes()将公钥保存为PEM格式的文件。在保存时,可以根据需要修改文件名。

运行以上代码后,将会生成名为private_key.pempublic_key.pem的文件,分别存储私钥和公钥。

可以进一步使用这些密钥进行数字签名和验证等操作。下面是一个使用示例:

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import utils

# 读取私钥
with open("private_key.pem", "rb") as f:
    private_key_pem = f.read()
private_key = serialization.load_pem_private_key(private_key_pem, password=None)

# 读取公钥
with open("public_key.pem", "rb") as f:
    public_key_pem = f.read()
public_key = serialization.load_pem_public_key(public_key_pem)

# 准备待签名的数据
data = b"Hello, World!"

# 使用私钥对数据进行签名
signature = private_key.sign(
    data,
    ec.ECDSA(utils.Prehashed(hashes.SHA256()))
)

# 使用公钥验证签名
try:
    public_key.verify(
        signature,
        data,
        ec.ECDSA(utils.Prehashed(hashes.SHA256()))
    )
    print("Signature verification passed.")
except Exception:
    print("Signature verification failed.")

在上述代码中,首先读取之前生成的私钥和公钥。然后,准备待签名的数据。使用私钥的sign()方法对数据进行签名,生成一个签名。

最后,使用公钥的verify()方法对签名进行验证。如果验证通过,输出"Signature verification passed.",否则输出"Signature verification failed."。

这是一个简单的ECDSA椭圆曲线密钥对生成的示例及使用方法。你可以根据需要调整椭圆曲线参数和哈希算法等。