naby

导航

DSA

记录一下学习dsa
(目前只有基础,后续正在学习)
(本文只是个人并结合gpt的见解,只是初步学习,仅供参考)

DSA基础

参数生成

160位素数q

1024位素数p,p-1为q的倍数

随机选取h∈(0,p)

计算\(g=h^{(p-1)/q} \mod p\)

为什么?:

1、需要g是生成元(安全性)

p-1=kq q<k

即p存在一个子群,阶为q

使得g的阶为满足条件(\(g^q = 1\mod p\))的最小正整数q

\(g^q=(h^{(p-1)/q})^q= h^{p-1}= 1 \mod p\)

2、提高效率,模运算和求逆元都可以在模q下进行

密钥生成

随机选取私钥x∈(0,q)

计算公钥\(y=g^x \mod q\)

签名

利用私钥x签名

先对消息m进行哈希加密(一般为sha1)

随机选取数k∈(0,q)

计算\(r=(g^k \mod p)\mod q\)

计算\(s=k^{-1}*(H(m)+x*r)\mod q\)

生成签名对(r,s)

验签

利用公钥y验签

计算\(w=s^{-1} \mod q\)

计算\(u_1=H(m)*w\mod q \quad\)

计算\(u_2=r*w\mod q\)

计算\(v=(g^{u_1}*y^{u_2})\mod q\)

验证\(v==r\)

证明

\[v=(g^{u_1}*y^{u_2})=(g^{H(m)*w}*g^{x*r*w})=g^{(H(m)+x*r)*w}=g^{s*k*w}=g^k\mod q\\ \]

代码实现

from Crypto.Util.number import *
from gmpy2 import *
from hashlib import sha1
import random

# 参数生成
q=getPrime(160)
p=int(random.randint(2**863,2**864-1)*q+1)
while not isPrime(p) or p.bit_length() != 1024:
    p=int(random.randint(2**863,2**864-1)*q+1)
h=random.randint(1,p-1)
g=pow(h,(p-1)//q,p)
# print(pow(g,q,p))

# 密钥生成
x=random.randint(1,q-1)   # 私钥
y=pow(g,x,p)    # 公钥

# 签名
m=b'naby'
k=random.randint(1,q-1)   # 临时私钥
r=int(pow(g,k,p))%q
hm=bytes_to_long(sha1(m).digest())
s=(invert(k,q)*(hm+x*r))%q
# 签名对(r,s)

# 验签
w=invert(s,q)
u1=(hm*w)%q
u2=(r*w)%q
v=int(pow(g,u1,p)*pow(y,u2,p))%q

print(v==r)

ECDSA

(未完成)

posted on 2024-08-05 13:38  Naby  阅读(11)  评论(0编辑  收藏  举报