|
|
ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。 : K6 C0 {' r& J: I% F) J3 G6 ~
密钥对产生办法。首先选择一个素数p,两个随机数, g 和x,g, x < p, 计算 y = g^x ( mod p ),则其公钥为 y, g 和p。私钥是x。g和p可由一组用户共享。
! y8 ?7 t9 q# C1 q, Q/ w6 AElGamal用于数字签名。被签信息为M,首先选择一个随机数k, k与 p - 1互质,计算
: f7 k7 n! J; G* ?7 k5 D ) h5 @* ?" Y$ S8 a
a = g^k ( mod p )
0 u" W4 w4 K1 m! L再用扩展 Euclidean 算法对下面方程求解b: : p& z! `1 v5 p* h; [8 a
2 |4 V: }8 @) a: PM = xa + kb ( mod p - 1 )
2 u1 l/ L3 |; y Q. n/ ]" \
' x }; [) J( v1 ~* W4 w8 p- Y签名就是( a, b )。随机数k须丢弃。 4 ^# j3 A; {' Z' T9 ]% p) Z
验证时要验证下式:
7 D3 ^/ }+ ?# {4 M 1 f' i0 b" [/ G8 `
y^a * a^b ( mod p ) = g^M ( mod p )
2 e7 U$ D5 E0 N4 j* n, y1 h) [" v 6 s' T$ s; w$ S1 ~
同时一定要检验是否满足1<= a < p。否则签名容易伪造。 + c( y: m$ X) }8 X5 M( \, s# F1 W
ElGamal用于加密。被加密信息为M,首先选择一个随机数k,k与 p - 1互质,计算
! i9 Q: J5 p$ E9 e3 f : @/ w8 W1 }# l7 O) g
a = g^k ( mod p ) @* H% \! v6 ?: ]
b = y^k M ( mod p ) ; v) X# t# }/ M8 l% m2 N+ S. k/ d
9 @1 P# t; q0 P
& v J7 I. g) @2 @4 V( a, b )为密文,是明文的两倍长。解密时计算
M$ }1 |" Y% `) t, ^ 3 P& ]" ^! i. {5 Z" a- v
M = b / a^x ( mod p ) * F0 c! x1 e# P% H7 J
6 X3 b. I+ B4 B' |$ h
ElGamal签名的安全性依赖于乘法群(IFp)* 上的离散对数计算。素数p必须足够大,且p-1至少包含一个大素数
- Q4 z2 D* g5 ^. ^ N4 \因子以抵抗Pohlig & Hellman算法的攻击。M一般都应采用信息的HASH值(如SHA算法)。ElGamal的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。D.Bleichenbache“GeneratingElGamal Signatures Without Knowing the Secret Key”中提到了一些攻击方法和对策。ElGamal的一个不足之处是它的密文成倍扩张。 ; h f$ C h2 b& L: E$ t
9 P* F4 x3 W8 q/ f 美国的DSS(Digital Signature Standard)的DSA(Digital Signature Algorithm)算法是经ElGamal算法演
# _4 y! i/ s M3 q! A变而来。 |
|