|
|
ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。 . n- O% a/ z; w U/ I, f' y
密钥对产生办法。首先选择一个素数p,两个随机数, g 和x,g, x < p, 计算 y = g^x ( mod p ),则其公钥为 y, g 和p。私钥是x。g和p可由一组用户共享。
+ {# p) A8 w1 F; DElGamal用于数字签名。被签信息为M,首先选择一个随机数k, k与 p - 1互质,计算 / ^7 o, l; P: s
6 M. r' c( [& x U* }& f
a = g^k ( mod p ) 8 ^2 Y$ c- `0 O' E
再用扩展 Euclidean 算法对下面方程求解b: % b& o6 T5 _0 i% ~7 x
+ b" b! v- J) {% s y, q2 R" N
M = xa + kb ( mod p - 1 ) , |/ E% i3 R' t3 Z$ g6 i+ g
, f. s0 `9 m+ o
签名就是( a, b )。随机数k须丢弃。
( d9 R9 c5 E/ W. x* K验证时要验证下式: , R; H9 s, q) n- B3 k( ^
7 y4 D- o) T5 I- }$ {
y^a * a^b ( mod p ) = g^M ( mod p ) 8 x& W8 ~- O& y
" S& E! d$ K$ D) N同时一定要检验是否满足1<= a < p。否则签名容易伪造。
! i2 F: {$ g) V* u3 [% l+ mElGamal用于加密。被加密信息为M,首先选择一个随机数k,k与 p - 1互质,计算
I9 Q+ j5 i j( o7 A7 i0 C! J/ u5 H ) J `, ]- ?' g- f' n- j
a = g^k ( mod p ) 5 C9 B/ q+ h" b" k! G; V) D2 J4 |% z
b = y^k M ( mod p ) ; m" @+ f4 Q/ z8 J) ^
" l0 a& h6 Y: ?, l0 B3 A0 `, ^1 m# K
( u" S q1 c0 `) x( a, b )为密文,是明文的两倍长。解密时计算 8 S! I$ Z0 o2 r4 P( \! T( E l+ p8 m
3 ]" W, e% O+ Y* [; D4 rM = b / a^x ( mod p )
+ A* O2 W4 l) }# x; Y
9 @& A' c' h6 [- E+ V. P3 Q ElGamal签名的安全性依赖于乘法群(IFp)* 上的离散对数计算。素数p必须足够大,且p-1至少包含一个大素数
7 G( o+ b- G$ Y$ ^* ]因子以抵抗Pohlig & Hellman算法的攻击。M一般都应采用信息的HASH值(如SHA算法)。ElGamal的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。D.Bleichenbache“GeneratingElGamal Signatures Without Knowing the Secret Key”中提到了一些攻击方法和对策。ElGamal的一个不足之处是它的密文成倍扩张。
1 ?, T, p3 \& o" g3 u 4 V( J0 v* w0 K; x! I- `
美国的DSS(Digital Signature Standard)的DSA(Digital Signature Algorithm)算法是经ElGamal算法演
9 \( i, e( y' i( d: G4 s+ ~- r( U1 @变而来。 |
|