|
ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。
( @4 T8 j2 Z" l5 E# c密钥对产生办法。首先选择一个素数p,两个随机数, g 和x,g, x < p, 计算 y = g^x ( mod p ),则其公钥为 y, g 和p。私钥是x。g和p可由一组用户共享。
; o$ E# }7 v! u3 q3 z8 I6 b- rElGamal用于数字签名。被签信息为M,首先选择一个随机数k, k与 p - 1互质,计算
6 _4 T- j0 P& r2 P4 I1 q+ d
5 w6 S. ~5 R; u2 I) ?# p6 Fa = g^k ( mod p ) 2 i: V$ }2 Z/ a! Q
再用扩展 Euclidean 算法对下面方程求解b:
3 Z' i" z4 ~6 m0 V; R, G
' s0 ^2 G% O$ e2 M0 `0 t$ rM = xa + kb ( mod p - 1 ) # Q- a1 U b6 Y/ q9 m- G: o
5 b) e" A/ g6 E0 i2 B% f
签名就是( a, b )。随机数k须丢弃。
" i9 u) ]" k0 Z$ U% J/ Q验证时要验证下式: 7 D. c7 k" z$ @$ o
8 B- ~4 a+ x9 O% q0 g# m4 [* d
y^a * a^b ( mod p ) = g^M ( mod p ) # d+ X4 J$ f, b
! Z3 F5 M% S9 y; {% J6 Y) x
同时一定要检验是否满足1<= a < p。否则签名容易伪造。
5 h, z" F' H) \ ?$ JElGamal用于加密。被加密信息为M,首先选择一个随机数k,k与 p - 1互质,计算 $ @) I" p+ X6 _ D& z
& ?% o8 ?9 W: K9 ~( K+ `a = g^k ( mod p ) 5 K* b) D4 U, b. h7 P) u
b = y^k M ( mod p )
! s- y! m' a. l; Z; W# { p/ ~8 h
6 I- B- n3 i7 @0 L3 J
; O7 ]; Z+ v2 S! Z. h/ V( a, b )为密文,是明文的两倍长。解密时计算
2 {4 _8 Q; Z8 K4 x' _' A4 d # N, r7 R/ o/ L* t
M = b / a^x ( mod p )
- G% O5 i( ^$ Y2 t- @# `9 Z 9 q' g. {, e$ L+ Q
ElGamal签名的安全性依赖于乘法群(IFp)* 上的离散对数计算。素数p必须足够大,且p-1至少包含一个大素数
9 K8 p6 b* ^, Y9 P0 y6 S5 B因子以抵抗Pohlig & Hellman算法的攻击。M一般都应采用信息的HASH值(如SHA算法)。ElGamal的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。D.Bleichenbache“GeneratingElGamal Signatures Without Knowing the Secret Key”中提到了一些攻击方法和对策。ElGamal的一个不足之处是它的密文成倍扩张。 3 n @, K0 X9 w) S
! K! p0 J5 q7 V+ Y) v. Y6 S
美国的DSS(Digital Signature Standard)的DSA(Digital Signature Algorithm)算法是经ElGamal算法演 * S5 ?5 g |, m3 t! ^
变而来。 |
|