|
|
ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。
2 J. b, D$ u1 z密钥对产生办法。首先选择一个素数p,两个随机数, g 和x,g, x < p, 计算 y = g^x ( mod p ),则其公钥为 y, g 和p。私钥是x。g和p可由一组用户共享。
: y7 D2 d2 T2 P# L. j+ }6 ZElGamal用于数字签名。被签信息为M,首先选择一个随机数k, k与 p - 1互质,计算 ! \' }/ A9 ^- G! p2 Z! s
: b0 Z* F$ T: f1 B+ O6 aa = g^k ( mod p ) , }- f& N- \1 X1 h
再用扩展 Euclidean 算法对下面方程求解b:
, \! o. O/ N' {& n( f+ b% }3 f
/ ~$ E% j: B* f( [( h5 zM = xa + kb ( mod p - 1 )
# z8 P& n! [: l$ X7 L" K 7 J9 K: D3 k% S }
签名就是( a, b )。随机数k须丢弃。 7 d+ h u1 _% Q
验证时要验证下式: 5 n! X/ J( Q- T" R9 Y' L; A1 A/ x
& c3 E( F+ f' } V; ?' a" Hy^a * a^b ( mod p ) = g^M ( mod p ) ' U! ^6 ?" {6 R1 r6 u l
4 R9 n1 u$ f5 ]) U$ a* W) b同时一定要检验是否满足1<= a < p。否则签名容易伪造。
9 [$ E0 [; ~, H# {& V5 LElGamal用于加密。被加密信息为M,首先选择一个随机数k,k与 p - 1互质,计算
; o2 j: ~0 r3 ]2 j+ t
Q" d/ P I* M# c7 Qa = g^k ( mod p ) 6 r: q/ N" m: X, n% B8 {/ w
b = y^k M ( mod p )
5 F% t! d2 u. F& m7 g' R7 K ! @2 d$ B, ^% I: e7 N/ G1 q# N
: G0 n+ z0 H' \" Q; a7 h5 {
( a, b )为密文,是明文的两倍长。解密时计算 ! b( n4 Z; u3 L0 z" r5 A$ B
$ d; F( r' f1 T+ J: GM = b / a^x ( mod p ) - D# N& t% C+ n" p. s' w3 S; Y* w) F0 Q
- W2 ^. o- u: n7 ~2 s ElGamal签名的安全性依赖于乘法群(IFp)* 上的离散对数计算。素数p必须足够大,且p-1至少包含一个大素数
& M( X- ]$ H; d# C! b+ L2 D9 J) D因子以抵抗Pohlig & Hellman算法的攻击。M一般都应采用信息的HASH值(如SHA算法)。ElGamal的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。D.Bleichenbache“GeneratingElGamal Signatures Without Knowing the Secret Key”中提到了一些攻击方法和对策。ElGamal的一个不足之处是它的密文成倍扩张。 : I( T; C# z0 u
1 ] a5 p! A/ _) F 美国的DSS(Digital Signature Standard)的DSA(Digital Signature Algorithm)算法是经ElGamal算法演 . Y- l7 W+ K% @9 x" ^+ X
变而来。 |
|