|
ElGamal算法既能用于数据加密也能用于数字签名,其安全性依赖于计算有限域上离散对数这一难题。
: A2 y! R+ U8 l1 d! [密钥对产生办法。首先选择一个素数p,两个随机数, g 和x,g, x < p, 计算 y = g^x ( mod p ),则其公钥为 y, g 和p。私钥是x。g和p可由一组用户共享。 2 U. e) M' s: N6 Q6 B( L- r8 I
ElGamal用于数字签名。被签信息为M,首先选择一个随机数k, k与 p - 1互质,计算 ) j' h9 Y0 j6 V) a) i
3 q5 _5 f* L b- W* J: Xa = g^k ( mod p ) 3 x/ s# ]' |& p( e. E+ r( a: ?
再用扩展 Euclidean 算法对下面方程求解b:
' }" h# ?: Y# W6 S) b4 s6 f 2 R3 z7 G6 H) |, D1 V7 T
M = xa + kb ( mod p - 1 ) $ }, m) | m. Y( \6 O! h
3 l+ f7 \- Z) \( N8 v f签名就是( a, b )。随机数k须丢弃。
8 B. z1 F; W" f1 c3 U0 A验证时要验证下式: " w- d6 J$ Z& T c3 d
, Z/ {8 U# }( o5 G$ P4 y6 H( Z
y^a * a^b ( mod p ) = g^M ( mod p )
/ X. [) ^6 T3 @. s8 P
$ \) O8 }* W) W$ p同时一定要检验是否满足1<= a < p。否则签名容易伪造。 # ^2 Q# N8 k, l4 \5 k* r5 g, Q
ElGamal用于加密。被加密信息为M,首先选择一个随机数k,k与 p - 1互质,计算 / g! x2 O7 Z/ F9 ~/ V3 d. [; F" ~. v; g/ A
/ ] g2 B( Z. D0 @: C
a = g^k ( mod p ) 1 p# k, M) }! t
b = y^k M ( mod p ) ; F/ T+ ^2 Z/ R) J/ k, \
4 D. H6 l; f6 W& s9 z/ C$ F7 g( T w, ~
U7 F! b$ x* _+ t& t L- L- A
( a, b )为密文,是明文的两倍长。解密时计算 7 ^: K1 y1 `0 g# s( A
. r* a+ a$ ?, Z& OM = b / a^x ( mod p )
& T! b( H& I( K: e) C 8 \0 t! T# h! O
ElGamal签名的安全性依赖于乘法群(IFp)* 上的离散对数计算。素数p必须足够大,且p-1至少包含一个大素数
' j6 L1 Z8 a. o" `8 m0 d: i因子以抵抗Pohlig & Hellman算法的攻击。M一般都应采用信息的HASH值(如SHA算法)。ElGamal的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。D.Bleichenbache“GeneratingElGamal Signatures Without Knowing the Secret Key”中提到了一些攻击方法和对策。ElGamal的一个不足之处是它的密文成倍扩张。 ) D |2 \0 V) q4 I* R
" y1 i; K& a5 B 美国的DSS(Digital Signature Standard)的DSA(Digital Signature Algorithm)算法是经ElGamal算法演
% A/ ^# y: |5 v8 B. H变而来。 |
|