|
|
ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。
4 \7 k* I% C( V" P* ?8 H密钥对产生办法。首先选择一个素数p,两个随机数, g 和x,g, x < p, 计算 y = g^x ( mod p ),则其公钥为 y, g 和p。私钥是x。g和p可由一组用户共享。
* z1 C% O7 x: c- kElGamal用于数字签名。被签信息为M,首先选择一个随机数k, k与 p - 1互质,计算 ( V9 l. O6 _$ n8 X
/ L% Q. K k4 t2 ]2 f3 @* K
a = g^k ( mod p )
7 p+ Z/ D6 u' k( ]# V; \# y& j再用扩展 Euclidean 算法对下面方程求解b:
* C D/ u9 a- g ' o- P* {0 X! ~% \1 Q0 r: h% `) Q
M = xa + kb ( mod p - 1 ) % t% _, D8 F, u1 l% l. O; v' }
) y$ P! [4 I0 i I8 }3 U5 l8 C
签名就是( a, b )。随机数k须丢弃。
8 ^/ U3 |; X& v6 g验证时要验证下式: 2 Q# Y* N' ]- V: v; Q, W; y9 `
! `& q1 X+ Y4 F4 C
y^a * a^b ( mod p ) = g^M ( mod p )
( I4 `* \" i$ g8 o, G
& F, o/ |9 ]; A& U% T/ c% Y同时一定要检验是否满足1<= a < p。否则签名容易伪造。 0 a6 |, l; A U+ T/ O: ~5 d9 T5 Y) h
ElGamal用于加密。被加密信息为M,首先选择一个随机数k,k与 p - 1互质,计算
1 z' b, C/ l" }9 Z
. ~5 s I7 G/ D. g2 ^" u) ca = g^k ( mod p ) " Z z W5 [* `3 @2 w3 m! b1 [
b = y^k M ( mod p )
+ r4 Z+ I4 H( i, L* T& p4 ~
% Q) Z6 O+ @ N0 R( `
% \1 y2 Z/ n' f: l" Z( a, b )为密文,是明文的两倍长。解密时计算 {$ T6 R* C2 P2 s/ v' h
0 ~! s( R+ w; }( @3 n. W; `$ [4 w
M = b / a^x ( mod p )
- c4 r4 G4 V$ r3 X; o! B; g 9 r V8 S) m: g" C D
ElGamal签名的安全性依赖于乘法群(IFp)* 上的离散对数计算。素数p必须足够大,且p-1至少包含一个大素数 ; y0 \/ G6 r- ^" N
因子以抵抗Pohlig & Hellman算法的攻击。M一般都应采用信息的HASH值(如SHA算法)。ElGamal的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。D.Bleichenbache“GeneratingElGamal Signatures Without Knowing the Secret Key”中提到了一些攻击方法和对策。ElGamal的一个不足之处是它的密文成倍扩张。 / A) K @% A3 k) g( b* T
1 I; i8 ~: R5 s3 B9 g$ M 美国的DSS(Digital Signature Standard)的DSA(Digital Signature Algorithm)算法是经ElGamal算法演 0 n7 V- w Q" O* F5 N! L+ x* m
变而来。 |
|