相关基础数学知识请看:https://blog.csdn.net/weixin_43790779/article/details/105621372
RSA (大整数分解)
- 密钥生成:
- 大素数:p、q (至少为1024位 );
-
n=p×q,φ(n)=(p−1)(q−1) ,其中
φ(n) 是n的欧拉函数值;
- 选择一整数e,满足1<e<φ(n),且gcd(φ(n), e)=1;
- 计算d,满足
d⋅e≡1modφ(n);
- 公钥{e, n},私钥{d, n}。
- 加密:
c≡memodn
- 解密:
m≡cdmodn
ElGamal密码 (离散对数问题)
- 密钥生成:
- p,一个较大的素数;
- g,
Zp∗ 中的生成元;
-
α∈Zp−1,β=gαmodp ;
- p,g,β为公钥;α为私钥;
- 加密:
随机生成一个秘密数k,
k∈Zp−1 。
E(x,k)=(r,s),其中r=gkmodps=xβkmodp
- 解密:
D(r,s)=s(rα)−1modp=xgakg−akmodp=x
椭圆曲线上ElGamal秘密(椭圆曲线,离散对数问题)
- 密钥生成:
在椭圆曲线
Ep(a,b) 上选取一个阶为n(n为一个大素数)的生成元P。随机选取整数x(1<x<n),计算Q=xP。公钥为Q,私钥为x。
- 加密:
为了加密
Pm,随机选取一个整数k,1<k<n,计算
C1=kP,C2=Pm+kQ
则密文
c=(C1,C2)。
- 解密:
为了解密一个密文
c=(C1,C2),计算
C2−xC1=Pm+kQ−xkP=Pm+kxP−xkP=Pm
攻击者要想从
c=(C1,C2),计算出
Pm,就必须知道k。而要从P和kP中计算出k将面临求解椭圆曲线上的离散对数问题。