记录一下学习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
(未完成)
标签:randint,int,pow,random,import,DSA,mod From: https://www.cnblogs.com/naby/p/18343041