ElGamal加密
ElGamal加密算法是一种基于离散对数问题的非对称加密算法,它的安全性建立在求解离散对数问题的困难性之上。
1. 密钥生成
- 选择大素数p:选择一个足够大的素数p,作为有限域的基础。
- 选择生成元g:选择一个整数g,使得g是模p乘法群Zp*的生成元。
- 选择私钥x:随机选择一个整数x作为私钥,其中1 ≤ x ≤ p-1。
- 计算公钥y:计算y = g^x mod p,并将y作为公钥公开。
2. 加密
假设Alice要向Bob发送一条消息m,Bob的公钥为(p, g, y)。
-
随机选择整数k:Alice随机选择一个整数k,其中1 ≤ k ≤ p-1。
-
计算密文c1:计算c1 = g k m o d p g^k \ mod \ p gk mod p。
-
计算密文c2:计算c2 = m ∗ y k m o d p m * y^k \ mod \ p m∗yk mod p。
-
发送密文:Alice将密文(c1, c2)发送给Bob。
3. 解密
Bob收到密文(c1, c2)后,使用自己的私钥x进行解密。
- 计算中间值:计算 α = ( c 1 x ) − 1 m o d p \alpha = (c1^x)^{-1} \ mod \ p α=(c1x)−1 mod p,即计算 α ( g k ) − x m o d p \alpha (g^k)^{-x} \ mod \ p α(gk)−x mod p。
- 解密消息:计算 m = c 2 ∗ ( c 1 x ) − 1 m o d p = c 2 ∗ α m o d p m = c2 * (c1^x)^{-1} \ mod \ p = c2 * \alpha \ mod \ p m=c2∗(c1x)−1 mod p=c2∗α mod p。
RSA加密
RSA算法的安全性是基于 大整数因数分解 的困难性。
1. 生成公钥和私钥:
- 选择两个大素数p和q。 计算它们的乘积N = p * q。
- 计算欧拉函数φ(N) = (p-1)(q-1)。
- 选择一个与 φ ( N ) \varphi(N) φ(N)互质的整数e作为公钥指数。
- 计算d,使得 d ∗ e ≡ 1 ( m o d φ ( N ) ) d*e \equiv 1 (mod \ \varphi(N)) d∗e≡1(mod φ(N)),d作为私钥指数。 公钥为(N, e),私钥为(N, d)。
2. 加密
- 明文为m,密文为c。
- 计算 c = m e m o d N c = m^e \ mod \ N c=me mod N。
3. 解密
- 计算 m = c d m o d N m = c^d \ mod \ N m=cd mod N。