|
|
ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。 ( l! C3 ?0 m- e% m4 n8 F" D( N
密钥对产生办法。首先选择一个素数p,两个随机数, g 和x,g, x < p, 计算 y = g^x ( mod p ),则其公钥为 y, g 和p。私钥是x。g和p可由一组用户共享。 + \0 A- ]( l4 w2 Q
ElGamal用于数字签名。被签信息为M,首先选择一个随机数k, k与 p - 1互质,计算
9 M4 C. w: X) h+ A
- J. { J5 C5 `5 Ja = g^k ( mod p ) + o; x& U2 X$ ~9 {+ ~
再用扩展 Euclidean 算法对下面方程求解b: , e3 k8 t# d) G3 ^3 p5 e
7 s4 l1 x0 _. e# b7 X" q* E
M = xa + kb ( mod p - 1 )
1 a1 @/ f, l1 s/ z! L4 K5 {) l
9 i4 }6 F. m; r! I. D/ y) Z7 B签名就是( a, b )。随机数k须丢弃。 4 C3 M/ [9 w/ L
验证时要验证下式:
2 d/ z- z* K- t( z9 |$ Z# s 8 Y1 ~' a2 @% ]9 H. E1 _
y^a * a^b ( mod p ) = g^M ( mod p ) + N) J1 O$ o+ l: Q, d2 D
: H+ J, ^2 N/ U) ^6 x1 l' I同时一定要检验是否满足1<= a < p。否则签名容易伪造。
) k' A2 V9 e8 s1 g' v- o+ v$ Y! bElGamal用于加密。被加密信息为M,首先选择一个随机数k,k与 p - 1互质,计算
# L [& K& E* L : A. P/ v8 X: u( w; v' r7 ^& p
a = g^k ( mod p ) * d+ G1 z( P( I; B/ l/ ~% H* C
b = y^k M ( mod p ) 3 f" k6 ~# u( M' U3 h7 t
5 ~8 n6 Z: u7 Q4 i: x
6 p4 X" @2 U- C2 X w
( a, b )为密文,是明文的两倍长。解密时计算 2 Y* o2 r# ~6 E8 E* l0 a6 M, _4 H
) k) N8 s, R' p* ^3 F) ]
M = b / a^x ( mod p ) 7 a9 J( R$ e$ J* y( A5 P2 J" ~
. Q6 k) [' j* E$ y' D( {8 p2 N- J; i ElGamal签名的安全性依赖于乘法群(IFp)* 上的离散对数计算。素数p必须足够大,且p-1至少包含一个大素数 : l' w2 `1 ^2 ~" ]3 w9 F4 c
因子以抵抗Pohlig & Hellman算法的攻击。M一般都应采用信息的HASH值(如SHA算法)。ElGamal的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。D.Bleichenbache“GeneratingElGamal Signatures Without Knowing the Secret Key”中提到了一些攻击方法和对策。ElGamal的一个不足之处是它的密文成倍扩张。 $ _& _/ H+ J# `( |
! y6 M( ^) p v3 {4 r# `
美国的DSS(Digital Signature Standard)的DSA(Digital Signature Algorithm)算法是经ElGamal算法演
5 }# S+ V) r! L1 ?7 Q7 n2 V变而来。 |
|