DSA
1、DSA算法描述
1985年提出的ElGamal算法是首次在有限域上基于离散对数问题设计的数字签名方案, DSA算法是在ElGamal算法的基础上设计的, 算法描述如下。
1.1 密钥生成
1) 全局参数
p: 满足2L-1 <p<2L的大素数, 其中L=512+64d, d=0, 1, 2, …, 8
q: p-1 的素因子, 且2159<q<2160。 g: g=h (p-1) /q mod p, 其中h满足1<h<p-1
, 且h (p-1) /q mod p>1。
以上3个参数是用户公用的参数, 称之为全局参数, 也称为共享的公共模数。
2) 私钥
x: 选取满足1<x<q
的随机数。
3) 公钥
y: 通过y=gx mod p求得。
1.2 签名过程
-
生成随机数k, 1<k<q;
-
计算r= (gk mod p) mod q;
-
计算 s= (k-1 * (H (M) + x * r) ) mod q。 其中M是待签名的消息, H (M) 是由SHA-1(Secure Hash Algorithm-1) 求出的Hash值。
消息M的签名结果即为 (r, s) 。
1.3 验证过程
-
计算w=s-1 mod q;
-
计算 u1= (H(M) * w) mod q;
-
计算 u2= (r * w) mod q;
-
计算 v= ( (gu1 * yu2) mod p) mod q。
比较r和v, 如果r=v, 表示签名有效; 否则, 签名非法
2、通用安全攻击(基本都是高复杂度的)
2.1求取私钥
对DSA最直接也是最彻底的攻破方法是利用算法的公开信息求取用户私钥。DSA算法中的公开信息包括:全局参数、公钥、消息和签名, 由这些数据求取私钥有两种方法。
1、根据公钥y计算私钥(基本不可能)
x = l o g g y ( m o d p ) x=log_gy\pmod p x=loggy(modp)
2、根据公共模数p与q, 消息M, 签名 (r, s) 等公开信息计算随机数k(基本也不可能)
T = g u 1 y u 2 ( m o d p ) k = l o g g T ( m o d p ) T=g^{u_1}y^{u_2}\pmod p\\ k=log_gT\pmod p T=gu1y