|
|
ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。
1 K9 ^; B$ H, n, D密钥对产生办法。首先选择一个素数p,两个随机数, g 和x,g, x < p, 计算 y = g^x ( mod p ),则其公钥为 y, g 和p。私钥是x。g和p可由一组用户共享。 / f! [ y! K6 l0 T+ I, K9 U3 V4 i& d
ElGamal用于数字签名。被签信息为M,首先选择一个随机数k, k与 p - 1互质,计算 / e3 Z/ t3 M$ a# N* V
. j6 f9 f4 N) E1 sa = g^k ( mod p )
# v$ z4 B: ~3 |& m& c再用扩展 Euclidean 算法对下面方程求解b:
3 o4 I$ w m8 h7 U3 d/ }$ U J$ U6 Y3 k, Z4 Y/ d
M = xa + kb ( mod p - 1 ) ' I( M9 |0 W6 i: A$ q" r
, L6 U1 h9 R* u' \6 ]0 F8 B
签名就是( a, b )。随机数k须丢弃。 " L/ B+ b! R! Z& Y$ n8 ]
验证时要验证下式:
. l, A9 H+ d) d$ y1 w* Q( F. `' U / ]& o; T- {& X1 c* b# u S' u
y^a * a^b ( mod p ) = g^M ( mod p )
6 Q' _3 ^6 C/ ?( H$ M( J; h ! V8 x( e1 l' i# C8 N! F# v" v
同时一定要检验是否满足1<= a < p。否则签名容易伪造。
1 X) O* C, ?0 o. T& rElGamal用于加密。被加密信息为M,首先选择一个随机数k,k与 p - 1互质,计算 2 l5 a# R( @) R8 ?6 h! @8 I
, ?- V/ I# M; j* Y' U+ `* b
a = g^k ( mod p ) + M0 J3 G9 e9 b9 k( t6 |# \ K
b = y^k M ( mod p )
9 F3 I2 t* p+ ~" ]6 z8 N6 f $ v* Y- o* Y/ G; e' m' m
X: j7 S! S" M3 h S7 D H( a, b )为密文,是明文的两倍长。解密时计算 ) @9 h, z l) D) M
# A( a& ~' W3 A/ mM = b / a^x ( mod p ) 1 A" }) o& W0 P% D( u* n
& [4 ?- F1 n. ^+ e
ElGamal签名的安全性依赖于乘法群(IFp)* 上的离散对数计算。素数p必须足够大,且p-1至少包含一个大素数
0 ?( W( [! f; U; x* h因子以抵抗Pohlig & Hellman算法的攻击。M一般都应采用信息的HASH值(如SHA算法)。ElGamal的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。D.Bleichenbache“GeneratingElGamal Signatures Without Knowing the Secret Key”中提到了一些攻击方法和对策。ElGamal的一个不足之处是它的密文成倍扩张。
T' {) \ `& C( N; I* K9 D B% z 2 J- I7 ]; j! V0 s( P- p8 Q" d
美国的DSS(Digital Signature Standard)的DSA(Digital Signature Algorithm)算法是经ElGamal算法演 9 m0 m5 z- A$ D3 H% O! @, m: d, i
变而来。 |
|