|
ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。 / B1 c) d! r" P. S, T' q0 A5 o7 C
密钥对产生办法。首先选择一个素数p,两个随机数, g 和x,g, x < p, 计算 y = g^x ( mod p ),则其公钥为 y, g 和p。私钥是x。g和p可由一组用户共享。
2 I7 g5 O3 Z" [2 V1 |+ h) }ElGamal用于数字签名。被签信息为M,首先选择一个随机数k, k与 p - 1互质,计算 . y( o8 j9 `. o
" w2 E% G/ j- o- K# v7 o
a = g^k ( mod p )
" {3 T" y+ J' y4 g. V2 T9 e; F再用扩展 Euclidean 算法对下面方程求解b: 0 s# m: q* X9 a1 `
% f. k6 J; v( ]8 b9 t3 Y, _+ ]7 V2 GM = xa + kb ( mod p - 1 )
9 P/ }( X$ j9 y) j) U: Y$ X
4 V. P4 X; i6 l8 H) G: @签名就是( a, b )。随机数k须丢弃。
& y. ^! E6 S% S) I9 p( e6 Z验证时要验证下式: ' Q* N* z5 q# m" X3 t0 o4 V3 ?5 ?
^" g" Y7 D. Z7 C5 q: b$ E6 _0 L5 N
y^a * a^b ( mod p ) = g^M ( mod p )
! v6 W- u& c$ d8 T8 c- u3 t 7 j: }5 {8 Z$ q9 Z4 A
同时一定要检验是否满足1<= a < p。否则签名容易伪造。
9 r. g+ l$ s) G# @% ^) u* x6 @ElGamal用于加密。被加密信息为M,首先选择一个随机数k,k与 p - 1互质,计算 # o* r, u( [9 ?' n2 }
8 Z" S/ N+ V* b. Aa = g^k ( mod p )
5 ~7 u8 K: t1 D) ub = y^k M ( mod p ) + C- ]3 t3 Z% M! b) b* n6 U& e) K+ K
_ {$ r8 o$ B8 P
4 n% k: E# K- q2 s) _
( a, b )为密文,是明文的两倍长。解密时计算 # |& v1 y/ N, r- `8 X
" D. ^* @& a- d! g# Q. a5 GM = b / a^x ( mod p )
) h2 m9 j' I$ h3 ?4 c1 U0 D& \# u/ E2 P
& ~3 k3 F A. `- Z0 W+ _ ElGamal签名的安全性依赖于乘法群(IFp)* 上的离散对数计算。素数p必须足够大,且p-1至少包含一个大素数
8 d! q9 M+ y2 w( C" u, q因子以抵抗Pohlig & Hellman算法的攻击。M一般都应采用信息的HASH值(如SHA算法)。ElGamal的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。D.Bleichenbache“GeneratingElGamal Signatures Without Knowing the Secret Key”中提到了一些攻击方法和对策。ElGamal的一个不足之处是它的密文成倍扩张。 2 v, m2 P p0 `. b1 q, B" v
) R, k& m, {) c3 U W 美国的DSS(Digital Signature Standard)的DSA(Digital Signature Algorithm)算法是经ElGamal算法演 ( D0 d0 y2 n! f! v, x
变而来。 |
|