DSA python

import hashlib
def Euclid(a,b):
    x1 = 1
    x2 = 0
    x3 = a
    y1 = 0
    y2 = 1
    y3 = b

    while y3 != 0 :
        q = int(x3/y3)
        t1 = x1-q*y1
        t2 = x2-q*y2
        t3 = x3-q*y3

        x1 = y1
        x2 = y2
        x3 = y3

        y1 = t1
        y2 = t2
        y3 = t3

        if x1<0:
            x1 = x1+b
    return x1

p = 0x800000000000000089e1855218a0e7dac38136ffafa72eda7859f2171e25e65eac698c1702578b07dc2a1076da241c76c62d374d8389ea5aeffd3226a0530cc565f3bf6b50929139ebeac04f48c3c84afb796d61e5a4f9a8fda812ab59494232c7d2b4deb50aa18ee9e132bfa85ac4374d7f9091abc3d015efc871a584471bb1
q = 0xf4f47f05794b256174bba6e9b396a7707e563c5b
g = 0x5958c9d3898b224b12672c0b98e06c60df923cb8bc999d119458fef538b8fa4046c8db53039db620c094c9fa077ef389b5322a559946a71903f990f1f7e0e025e2d7f7cf494aff1a0470f5b64c36b625a097f1651fe775323556fe00b3608c887892878480e99041be601a62166ca6894bdd41a7054ec89f756ba9fc95302291
y = 0x84ad4719d044495496a3201c8ff484feb45b962e7302e56a392aee4abab3e4bdebf2955b4736012f21a08084056b19bcd7fee56048e004e44984e2f411788efdc837a0d2e5abb7b555039fd243ac01f0fb2ed1dec568280ce678e931868d23eb095fde9d3779191b8c0299d6e07bbb283e6633451e535c45513b2d33c99ea17

r = 548099063082341131477253921760299949438196259240
s = 857042759984254168557880549501802188789837994940
hm = 0xd2d0714f014a9784047eaeccf956520045c45265

for k in range(2**16):
    r_inv=Euclid(r,q)
    x=((s*k-hm)*r_inv) %q
    y1=pow(g,x,p)

    if y1==y:             #计算出的公开钥与给出的相比较
        print("user key x:",x)
        print("random number k",k)

ss=hex(x)[2:]
result=hashlib.sha1(ss.encode()).hexdigest()  #返回摘要作为16进制数据字符串的指
print("usr key x’SHA1:",result)

 

### 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!” 并终止程序运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值