使用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_key和serialization.load_pem_public_key方法从字节表示恢复密钥对象。然后,使用私钥对数据进行签名,并使用公钥验证签名的有效性。
