一、背景

在密码学中,ElGamal加密算法是一个基于迪菲-赫尔曼密钥交换的非对称加密算法。它在1985年由塔希尔·盖莫尔提出。GnuPG和PGP等很多密码学系统中都应用到了ElGamal算法。
ElGamal加密算法可以定义在任何循环群G上。它的安全性基于离散对数难题

  • elgama算法可分别用作加解密与数字签名。

二、加解密算法细节

2.1 公私钥产生算法(KeyGenKeyGenKeyGen):

  • 随机选择一个满足安全要求的大素数ppp(通常1024bits),并生成有限域ZpZ_pZp的一个生成元g∈Zp∗g∈Z_p^*gZp
    • 通常ppp产生方法:
    • p=2x∗q+1p=2^x *q+1p=2xq+1qqq为160bits大素数
  • 随机选择一个随机数x(1<x<p−1)x(1<x<p-1)x(1<x<p1),计算y≡gx(mod p)y≡g^x (mod\ p)ygx(mod p),则公钥为(y,g,p)(y,g,p)(y,g,p),私钥为xxx

2.2 加密过程(EncryptionEncryptionEncryption

  • 对消息mmm进行加密;
  • 随机选择整数r(1<r<p−1)r(1<r<p-1)r(1<r<p1)
  • 计算密文C=(c,c′)C=(c, c^{'})C=(c,c),其中:c≡gr(mod p),c′≡myr(mod p)c≡g^r (mod\ p), c^{'}≡my^r(mod\ p)cgr(mod p),cmyr(mod p)

2.3 解密过程(DecryptionDecryptionDecryption

  • 收到密文C=(c,c′)C=(c, c^{'})C=(c,c)
  • 使用密钥xxx对密文CCC解密得到消息mmmm=c′/cx=(myr)/(gx)r=(myr)/yr(mod p)m= c^{'}/c^x =(my^r)/(g^x )^r =(my^r)/y^r (mod\ p)m=c/cx=(myr)/(gx)r=(myr)/yr(mod p)

三、数字签名算法

3.1 公私钥产生算法(KeyGenKeyGenKeyGen):

  • 随机选择一个满足安全要求的大素数ppp(通常1024bits),并生成有限域ZpZ_pZp的一个生成元g∈Zp∗g∈Z_p^*gZp
    • 通常ppp产生方法:
    • p=2x∗q+1p=2^x *q+1p=2xq+1qqq为160bits大素数
  • 随机选择一个随机数x(1<x<p−1)x(1<x<p-1)x(1<x<p1),计算y≡gx(mod p)y≡g^x (mod\ p)ygx(mod p),则公钥为(y,g,p)(y,g,p)(y,g,p),私钥为xxx

3.2 签名算法(SignSignSign

  • 对消息m进行签名;
  • 随机选择整数k(1<k<p−1)k(1<k<p-1)k(1<k<p1)
  • 计算rrrr≡gk(modp)r≡g^k (mod p)rgk(modp)
  • 计算ssss≡[h(m)−xr]k−1(mod(p−1))s≡[h(m)-xr] k^{-1} (mod (p-1))s[h(m)xr]k1(mod(p1))h(m)h(m)h(m)表示哈希函数;
  • 得出数字签名(r,s)(r, s)(r,s)

3.3 签名验证(VerifyVerifyVerify

  • 根据公钥yyy,消息mmm验证数字签名(r,s)(r, s)(r,s)
  • 计算gh(m)′g^{h(m)'}gh(m)gh(m)′=yrrs=(gx)r(gk)(h(m)−xr)/kg^{h(m)'}=y^r r^s=(g^x )^r (g^k )^{(h(m)-xr)/k}gh(m)=yrrs=(gx)r(gk)(h(m)xr)/k
  • 验证等式gh(m)′=gh(m)g^{h(m)'}=g^{h(m)}gh(m)=gh(m)是否成立,若成立则为真,否则为假。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐