DSA算法python
时间: 2024-12-29 10:27:33 浏览: 6
### Python 实现 DSA 数字签名
DSA(Digital Signature Algorithm)是一种用于生成和验证数字签名的联邦标准。下面是一个完整的Python实现,展示了如何使用DSA算法创建密钥对、签署消息以及验证签名。
#### 密钥生成
为了执行任何操作之前,先要生成一对公私钥:
```python
from Crypto.PublicKey import DSA
from Crypto.Hash import SHA256
import os
def generate_keys():
key = DSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
with open('private.pem', 'wb') as f:
f.write(private_key)
with open('public.pem', 'wb') as f:
f.write(public_key)
generate_keys() # 调用函数以生成并保存密钥对[^1]
```
这段代码会生成长度为2048位的DSA密钥,并将其分别存储在`private.pem` 和 `public.pem` 文件中。
#### 创建签名
有了这些密钥之后就可以用来给数据做签名了:
```python
from Crypto.Signature import DSS
from Crypto.Hash import SHA256
from Crypto.PublicKey import DSA
def sign_message(message, priv_key_path='private.pem'):
hash_obj = SHA256.new(message.encode())
with open(priv_key_path, "rb") as file_in:
private_key = DSA.import_key(file_in.read())
signer = DSS.new(private_key, 'fips-186-3')
signature = signer.sign(hash_obj)
return signature
message_to_sign = "This is a message to be signed."
signature = sign_message(message_to_sign)
print(f"Signature: {signature.hex()}") # 打印十六进制表示形式下的签名
```
这里定义了一个名为`sign_message()` 的函数接收待签名字串作为参数,并返回该字符串对应的哈希值经过DSASign对象处理后的二进制签名结果;同时也支持自定义指定私钥路径,默认读取当前目录下名为`private.pem` 的文件中的私钥来进行签名工作。
#### 验证签名
最后一步就是利用公开可用的信息去校验接收到的数据及其关联的签名是否有效:
```python
def verify_signature(message, signature_hex, pub_key_path='public.pem'):
try:
hash_obj = SHA256.new(message.encode())
with open(pub_key_path, "rb") as file_in:
public_key = DSA.import_key(file_in.read())
verifier = DSS.new(public_key, 'fips-186-3')
verifier.verify(hash_obj, bytes.fromhex(signature_hex))
print("The signature is valid.")
return True
except ValueError:
print("Invalid signature!")
return False
verify_result = verify_signature(message_to_sign, signature.hex())
if not verify_result:
raise Exception("Verification failed!")
else:
print("Verified successfully.")
```
此部分实现了通过提供的公钥来检验传入的消息与其声称拥有的签名之间是否存在合法关系的功能。如果一切正常,则输出“The signature is valid.” 否则抛出异常提示“Invalid signature!” 并终止程序运行。
阅读全文