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

使用Python生成ECDSA密钥对

发布时间:2023-12-17 12:20:19

ECDSA(Elliptic Curve Digital Signature Algorithm)是一种基于椭圆曲线的数字签名算法,用于对数据进行签名和验证。

在Python中,我们可以使用cryptography库来生成ECDSA密钥对。首先,我们需要安装cryptography库:

pip install cryptography

接下来,我们可以使用以下代码生成ECDSA密钥对:

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

# 生成私钥
private_key = ec.generate_private_key(ec.SECP256K1())

# 获取私钥的字节表示
private_key_bytes = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)

# 生成公钥
public_key = private_key.public_key()

# 获取公钥的字节表示
public_key_bytes = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

# 将私钥和公钥保存到文件
with open("private_key.pem", "wb") as f:
    f.write(private_key_bytes)

with open("public_key.pem", "wb") as f:
    f.write(public_key_bytes)

以上代码使用secp256k1曲线生成了一个ECDSA私钥,并从私钥中获取了字节表示。然后,使用私钥生成了对应的公钥,并从公钥中获取了字节表示。最后,将私钥和公钥保存到文件。

以下是一个完整的使用示例:

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

# 生成私钥
private_key = ec.generate_private_key(ec.SECP256K1())

# 获取私钥的字节表示
private_key_bytes = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)

# 生成公钥
public_key = private_key.public_key()

# 获取公钥的字节表示
public_key_bytes = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

# 将私钥和公钥保存到文件
with open("private_key.pem", "wb") as f:
    f.write(private_key_bytes)

with open("public_key.pem", "wb") as f:
    f.write(public_key_bytes)

# 从文件读取密钥
with open("private_key.pem", "rb") as f:
    private_key_data = f.read()

with open("public_key.pem", "rb") as f:
    public_key_data = f.read()

# 从字节表示恢复密钥对象
private_key = serialization.load_pem_private_key(
    private_key_data,
    password=None
)

public_key = serialization.load_pem_public_key(public_key_data)

# 使用私钥对数据进行签名
data = b"Hello, world!"
signature = private_key.sign(data, ec.ECDSA(hashes.SHA256()))

# 使用公钥验证签名
public_key.verify(signature, data, ec.ECDSA(hashes.SHA256()))

以上示例中,我们从文件中读取了生成的私钥和公钥,并使用serialization.load_pem_private_keyserialization.load_pem_public_key方法从字节表示恢复密钥对象。然后,使用私钥对数据进行签名,并使用公钥验证签名的有效性。