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