|
|
ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。 + n) [: q D2 Q9 ]
密钥对产生办法。首先选择一个素数p,两个随机数, g 和x,g, x < p, 计算 y = g^x ( mod p ),则其公钥为 y, g 和p。私钥是x。g和p可由一组用户共享。 * ?- @( D, C* \8 J- N1 L' h
ElGamal用于数字签名。被签信息为M,首先选择一个随机数k, k与 p - 1互质,计算
0 |, ?2 z! g1 ^/ r) h L) D2 O ) a1 U& r) ^6 q2 C2 D
a = g^k ( mod p )
# d2 i# U m4 `7 n. R再用扩展 Euclidean 算法对下面方程求解b:
4 r6 t+ m% ]5 C- }6 ^+ s" x0 W! K 6 X& O1 T3 a7 C! V5 b8 H" J7 b
M = xa + kb ( mod p - 1 ) 5 u7 v' \ w; ?2 Y% r; r
4 r- g0 T" `* M }签名就是( a, b )。随机数k须丢弃。
4 x3 W! Q3 E* l0 e: j) y% @0 e验证时要验证下式:
8 t) _: |8 [$ g6 W2 t3 m+ d. W
4 R, q7 V w9 [y^a * a^b ( mod p ) = g^M ( mod p )
! y1 e7 [- W- p) k: E
! c( j+ H" L7 \& j2 o同时一定要检验是否满足1<= a < p。否则签名容易伪造。 1 M$ ]$ A2 U8 p6 p% i9 k
ElGamal用于加密。被加密信息为M,首先选择一个随机数k,k与 p - 1互质,计算 ; m5 `) U$ G6 ]2 l4 y! k
2 ], ]2 |# H2 V5 I3 Q( i
a = g^k ( mod p )
* x, u& k& Q0 q# [" G6 s7 v1 D& [4 Y1 [b = y^k M ( mod p )
, n" `8 _/ f3 G' A
$ U- I2 U7 D b$ a* Y& p; K [4 s9 L8 ]7 s2 P, w+ b, c. C0 T; i
( a, b )为密文,是明文的两倍长。解密时计算 " ] h2 H, B. f( G% r4 W9 H$ Z
$ h9 @& T" _# ~3 I2 e( l. P
M = b / a^x ( mod p ) 5 c# M8 r8 F; I& P( r
. z7 |- P% i. v! l: u
ElGamal签名的安全性依赖于乘法群(IFp)* 上的离散对数计算。素数p必须足够大,且p-1至少包含一个大素数
B9 L F$ J1 u! C0 W0 w9 \7 m! n因子以抵抗Pohlig & Hellman算法的攻击。M一般都应采用信息的HASH值(如SHA算法)。ElGamal的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。D.Bleichenbache“GeneratingElGamal Signatures Without Knowing the Secret Key”中提到了一些攻击方法和对策。ElGamal的一个不足之处是它的密文成倍扩张。
- D6 H& t3 w; T! n ) [% Q% f& {; g* e$ [' S5 `' ~
美国的DSS(Digital Signature Standard)的DSA(Digital Signature Algorithm)算法是经ElGamal算法演
7 Y5 i0 P1 z" l4 ]$ n变而来。 |
|