常见公钥算法加解密公式

相关基础数学知识请看:https://blog.csdn.net/weixin_43790779/article/details/105621372

RSA (大整数分解)

  1. 密钥生成:
    • 大素数:p、q (至少为1024位 );
    • n = p × q , φ ( n ) = ( p − 1 ) ( q − 1 ) n=p×q ,φ(n)=(p-1)(q-1) n=p×qφ(n)=(p1)(q1) ,其中 φ ( 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) de1mod  φ(n)
    • 公钥{e, n},私钥{d, n}。
  2. 加密:
    c ≡ m e    m o d    n c ≡ m^e \ \ mod \ \ n cme  mod  n
  3. 解密:
    m ≡ c d    m o d    n m ≡ c^d \ \ mod \ \ n mcd  mod  n

ElGamal密码 (离散对数问题)

  1. 密钥生成:
    • 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 αZp1,β=gαmod  p
    • p,g,β为公钥;α为私钥;
  2. 加密:
    随机生成一个秘密数k, k ∈ Z p − 1 k\in Z_{p-1} kZp1
    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
  3. 解密:
    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=xgakgakmod  p=x

椭圆曲线上ElGamal秘密(椭圆曲线,离散对数问题)

  1. 密钥生成:
    在椭圆曲线 E p ( a , b ) E_p(a,b) Ep(a,b) 上选取一个阶为n(n为一个大素数)的生成元P。随机选取整数x(1<x<n),计算Q=xP。公钥为Q,私钥为x。
  2. 加密:
    为了加密 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)
  3. 解密:
    为了解密一个密文 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 C2xC1=Pm+kQxkP=Pm+kxPxkP=Pm
    攻击者要想从 c = ( C 1 , C 2 ) c=(C_1,C_2) c=(C1,C2),计算出 P m P_m Pm,就必须知道k。而要从P和kP中计算出k将面临求解椭圆曲线上的离散对数问题。
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
欧拉公式可以表示为: $$e^{ix} = \cos(x) + i\sin(x)$$ 其,$i$ 是虚数单位,满足 $i^2=-1$。 RAS算法是一种非对称加密算法,其,加密和解密使用不同的密钥。 加密过程: 1. 选择两个不同的质数 $p$ 和 $q$,计算 $n=pq$。 2. 选择一个整数 $e$,满足 $1<e<\phi(n)$,且 $e$ 与 $\phi(n)$ 互质,其 $\phi(n)=(p-1)(q-1)$。 3. 将要加密的明文 $M$ 转换为整数 $m$,使得 $0\leq m<n$。 4. 计算密文 $C\equiv m^e\pmod{n}$。 解密过程: 1. 找到一个整数 $d$,满足 $ed\equiv1\pmod{\phi(n)}$。 2. 计算明文 $M\equiv C^d\pmod{n}$。 下面是用欧拉公式在C++里实现RAS加密解密算法的代码: ```c++ #include <iostream> #include <cmath> using namespace std; // 快速幂算法 long long pow_mod(long long a, long long b, long long mod) { long long res = 1; while (b) { if (b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res; } // 求最大公约数 long long gcd(long long a, long long b) { if (b == 0) return a; return gcd(b, a % b); } // 求扩展欧几里得算法 long long exgcd(long long a, long long b, long long &x, long long &y) { if (b == 0) { x = 1; y = 0; return a; } long long d = exgcd(b, a % b, x, y); long long z = x; x = y; y = z - a / b * y; return d; } // RAS加密算法 long long ras_encrypt(long long m, long long e, long long n) { return pow_mod(m, e, n); } // RAS解密算法 long long ras_decrypt(long long c, long long d, long long n) { return pow_mod(c, d, n); } // 生成密钥 void generate_key(long long p, long long q, long long &n, long long &e, long long &d) { n = p * q; long long phi = (p - 1) * (q - 1); do { e = rand() % (phi - 2) + 2; } while (gcd(e, phi) != 1); exgcd(e, phi, d, n); if (d < 0) d += phi; } int main() { long long p = 61, q = 53; // 选择两个质数 long long n, e, d; generate_key(p, q, n, e, d); // 生成公钥和私钥 cout << "公钥: (" << e << ", " << n << ")" << endl; cout << "私钥: (" << d << ", " << n << ")" << endl; long long m = 123; // 明文 long long c = ras_encrypt(m, e, n); // 加密 long long m2 = ras_decrypt(c, d, n); // 解密 cout << "明文: " << m << endl; cout << "密文: " << c << endl; cout << "解密: " << m2 << endl; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值