10. 公钥密码体制
- 定义Diffie-Hellman密钥交换:基于离散对数,保证安全交换密钥的算法。
- 流程:
- 产生私钥
- 通过离散对数计算公钥
- 交换公钥
- 计算共享密钥
- 流程:
- 理解中间人攻击:敌手拦截并获得数字共享的信息。
- 概述ElGamal密码系统:
- A生成密钥对 { q , α , Y A q,\alpha,Y_{A} q,α,YA}。
- B加密消息为 ( C 1 , C 2 ) (C_{1},C_2) (C1,C2)。
- A恢复明文: M = ( C 2 K − 1 ) m o d q M=(C_2K^{-1})\mod q M=(C2K−1)modq。
- 理解椭圆曲线算术:三次方程,ECC基于计算 Q = k P Q = kP Q=kP 中 k 的困难。
- 使用非对称密码生成伪随机数的两种技术:哈希函数、伪随机数生成器。
10.1 Diffie-Hellman 密钥交换
算法有效性依赖于计算离散对数的困难性。(基于 b ≡ a i m o d p b \equiv a^{i}\mod p b≡aimodp ( 0 ≤ i ≤ p − 1 0 \le i \le p -1 0≤i≤p−1))
算法目的:安全地交换密钥。(算法仅限于交换密钥)
算法流程:
- Alice 随机选择整数== X A X_{A} XA作为私钥并计算公钥== Y A = g X A m o d p Y_{A} = g^{X_{A}}\mod p YA=gXAmodp 。(p 为素数, g 为 p 的本源根)
- Bob随机选择== X B X_{B} XB 作为私钥并计算公钥== Y B = g X B m o d p Y_{B} = g^{X_{B}}\mod p YB=gXBmodp 。
- Alice和Bob互换公钥。
- 两人分别计算共享密钥 K = ( Y i ) X i m o d q K = (Y_{i})^{X_{i}}\mod q K=(Yi)Ximodq 。
由于缺少数字签名或证书,该算法不能抵抗中间人攻击。
10.2 中间人攻击
敌手拦截并获得数字共享的信息。(窃听)
在Diffie-Hellman中,敌手可以通过自己生成两个密钥 X D 1 X_{D_{1}} XD1 和 X D 2 X_{D{2}} XD2 ,用同样的方法和A、B分别共享密钥。
10.3 ELGamal 密码体制
基于离散对数的公钥体制,用于数字签名。
算法流程:
-
用户A生成密钥对:(q 为素数, α \alpha α 为 q 的本原根)。
- 随机生成 X A ∈ ( 0 , q − 1 ) X_{A} \in (0,q-1) XA∈(0,q−1) 。
- 计算 Y A = α X A m o d q Y_{A} = \alpha^{X_{A}} \mod q YA=αXAmodq。
- 私钥为 X A X_{A} XA ,公钥为 { q , α , Y A q,\alpha,Y_{A} q,α,YA}。
-
B通过A的公钥加密消息M ∈ [ 0 , q − 1 ] \in [0,q-1] ∈[0,q−1](长消息作为一系列分组发送):
- 选择任意整数 k ∈ [ 1 , q − 1 ] k \in [1,q-1] k∈[1,q−1]。
- 计算一次密钥 K = ( Y A ) K m o d q K = (Y_{A})^{K}\mod q K=(YA)Kmodq。
- 将 M 加密为整数对 ( C 1 , C 2 ) (C_{1},C_2) (C1,C2)。
C 1 = α k m o d q C 2 = K M m o d q C_1 = \alpha^{k}\mod q \\C_2 = KM \mod q C1=αkmodqC2=KMmodq
-
A 恢复明文:
-
恢复密钥: K = ( C 1 ) X A m o d q K = (C_1)^{X_{A}}\mod q K=(C1)XAmodq。
-
计算M = ( C 2 K − 1 ) m o d q (C_2K^{-1})\mod q (C2K−1)modq。
-
安全性基于离散对数计算困难问题。
敌手需要计算公钥和一次密钥,进行两次离散对数的计算。
10.4 椭圆曲线算术
椭圆曲线由三次方程描述。
椭圆曲线加密流程:考虑方程 Q = k P Q = kP Q=kP。( Q , P ∈ E p ( a , b ) Q,P \in E_{p} (a,b) Q,P∈Ep(a,b) 且 k < p k < p k<p)(基于算 k k k 的复杂性)
- A的密钥生成:
- 选择私钥: n A < n n_{A} < n nA<n(n 为 椭圆曲线的阶)
- 计算公钥: P A = n A ∗ G P_{A} = n_{A} * G PA=nA∗G (G为椭圆曲线上的点)
- B的密钥生成:
- 选择私钥: n B < n n_{B} < n nB<n(n 为 椭圆曲线的阶)
- 计算公钥: P B = n B ∗ G P_{B} = n_{B} * G PB=nB∗G (G为椭圆曲线上的点)
- 计算秘密钥 K:
- B : K = n B ∗ P A K = n_{B} * P_{A} K=nB∗PA
- A: K = n A ∗ P B K = n_{A} * P_{B} K=nA∗PB
- A 选择 k 加密消息发送给 B:
- 密文 C m = { k G , P m + k P B } C_{m} = \{ kG,P_{m}+kP_{B}\} Cm={kG,Pm+kPB}
{B} * P_{A}$
- A: K = n A ∗ P B K = n_{A} * P_{B} K=nA∗PB
- A 选择 k 加密消息发送给 B:
- 密文 C m = { k G , P m + k P B } C_{m} = \{ kG,P_{m}+kP_{B}\} Cm={kG,Pm+kPB}