密码学题型

29 阅读7分钟

密码学期末考试重点题目集 - 中文版

题型说明

本题目集包含四种考试题型:

  1. 概念解释题:解释密码学概念、定义、性质等
  2. 方案设计题:设计密码学方案满足特定安全需求
  3. 证明题:证明密码学方案的安全性或不安全性
  4. 计算题:进行具体的密码学计算

第一部分:对称密码工具

题型一:概念解释题

题目 1:解释 PRG 的安全性定义

题目: 请详细解释伪随机数生成器(PRG)的安全性定义,包括: (1)形式化定义 (2)区分器的概念 (3)可忽略函数的含义 (4)为什么这个定义能够保证 PRG 的安全性

完整解答

(1)形式化定义

G:{0,1}n{0,1}lG: \{0,1\}^n \rightarrow \{0,1\}^l 是一个函数,其中 l>nl > n(扩展性要求)。GG 是一个安全的 PRG,如果对于所有多项式时间的区分器 DD,存在可忽略函数 ϵ\epsilon,使得: Pr[D(G(s))=1]Pr[D(r)=1]ϵ(n)|\Pr[D(G(s)) = 1] - \Pr[D(r) = 1]| \leq \epsilon(n) 其中:

  • s{0,1}ns \leftarrow \{0,1\}^n 是随机种子
  • r{0,1}lr \leftarrow \{0,1\}^l 是真正的随机字符串
  • DD 是区分器算法,输出 0 或 1

(2)区分器的概念

区分器 DD 是一个多项式时间的算法,它试图区分 PRG 的输出和真正的随机字符串:

  • 如果 DD 输出 1,表示它认为输入是随机的
  • 如果 DD 输出 0,表示它认为输入不是随机的(可能是 PRG 的输出)

区分器的目标是最大化区分优势: AdvD=Pr[D(G(s))=1]Pr[D(r)=1]\text{Adv}_D = |\Pr[D(G(s)) = 1] - \Pr[D(r) = 1]|

(3)可忽略函数的含义

可忽略函数 ϵ:NR\epsilon: \mathbb{N} \rightarrow \mathbb{R} 满足:对于所有多项式 pp,存在 NN,使得对于所有 n>Nn > N,有 ϵ(n)<1/p(n)\epsilon(n) < 1/p(n)

直观理解:可忽略函数比任何多项式的倒数衰减得更快。例如:

  • ϵ(n)=2n\epsilon(n) = 2^{-n} 是可忽略的
  • ϵ(n)=n100\epsilon(n) = n^{-100} 是可忽略的
  • ϵ(n)=1/n\epsilon(n) = 1/n 不是可忽略的(因为 1/n>1/n21/n > 1/n^2 对于大的 nn

(4)为什么这个定义能够保证 PRG 的安全性

如果 PRG 是安全的,那么:

  • 任何多项式时间的算法都无法以不可忽略的优势区分 G(s)G(s) 和真正的随机字符串 rr
  • 这意味着 G(s)G(s) 在计算上与真正的随机字符串不可区分
  • 因此,使用 G(s)G(s) 代替真正的随机字符串不会显著降低安全性
  • 这保证了 PRG 可以安全地用于密码学应用(如生成密钥流)

如果存在区分器能够以不可忽略的优势区分,则 PRG 不安全,不能用于密码学应用。


题目 2:解释流密码中 IV 的作用

题目: 在流密码中,初始化向量(IV)的作用是什么?为什么 IV 不需要保密?如果同一个密钥和 IV 的组合被重复使用,会发生什么安全问题?请详细说明。

完整解答

IV 的作用

初始化向量(IV)在流密码中有以下作用:

  1. 确保密钥流的唯一性:即使使用相同的密钥 kk,不同的 IV 会产生不同的密钥流

    • 密钥流:K=G(k,IV)K = G(k, IV)
    • 如果 IV1IV2IV_1 \neq IV_2,则 G(k,IV1)G(k,IV2)G(k, IV_1) \neq G(k, IV_2)(对于安全的 PRG)
  2. 防止相同明文产生相同密文

    • 如果 IVIV 不同,即使明文 mm 相同,密文 c=mG(k,IV)c = m \oplus G(k, IV) 也会不同
    • 这提供了语义安全性
  3. 支持并行加密:不同的消息可以使用不同的 IV,可以并行加密

为什么 IV 不需要保密

IV 不需要保密的原因:

  1. IV 的作用是提供随机性,不是提供保密性

    • 保密性由密钥 kk 和加密函数提供
    • IV 的作用是确保每次加密产生不同的密文
  2. 即使攻击者知道 IV$,只要 IV 是随机的,流密码仍然是 CPA 安全的

    • 攻击者知道 IVIVc=mG(k,IV)c = m \oplus G(k, IV)
    • 但由于不知道密钥 kk,无法计算 G(k,IV)G(k, IV)
    • 因此无法获得明文 mm 的信息
  3. 实际应用中的考虑

    • IV 通常与密文一起传输
    • 可以公开存储
    • 但必须确保 IV 的唯一性(不能重复使用)

重复使用相同密钥和 IV 的安全问题

如果同一个密钥和 IV 的组合被重复使用,会发生严重的安全问题:

攻击场景: 假设使用相同的 (k,IV)(k, IV) 加密两个消息 m1m_1m2m_2

  • c1=m1G(k,IV)c_1 = m_1 \oplus G(k, IV)
  • c2=m2G(k,IV)c_2 = m_2 \oplus G(k, IV)

攻击方法: 攻击者可以计算: c1c2=(m1G(k,IV))(m2G(k,IV))=m1m2c_1 \oplus c_2 = (m_1 \oplus G(k, IV)) \oplus (m_2 \oplus G(k, IV)) = m_1 \oplus m_2

安全后果

  1. 泄露明文的异或:攻击者获得了 m1m2m_1 \oplus m_2,这泄露了两个明文的异或值
  2. 如果知道一个明文,可以恢复另一个
    • 如果攻击者知道 m1m_1,则 m2=c1c2m1m_2 = c_1 \oplus c_2 \oplus m_1
  3. 模式分析:攻击者可以分析明文的模式

实际例子: 如果 m1="HELLO"m_1 = "HELLO"m2="WORLD"m_2 = "WORLD",攻击者计算 c1c2c_1 \oplus c_2 可能泄露部分信息。

结论

  • 绝对禁止重复使用相同的 (k,IV)(k, IV) 组合
  • 每次加密必须使用不同的 IV
  • IV 可以是计数器、随机数或时间戳,但必须确保唯一性

题型二:方案设计题

题目 3:设计一个安全的文件传输方案

题目: 设计一个安全的文件传输方案,满足以下要求:

  1. 文件大小为 10GB(很大)
  2. 支付信息保密(没有人知道支付金额)
  3. 文件完整性(Integrity)
  4. 只有 Bob 可以检查文件内容

请: (1)选择合适的密码学工具 (2)详细说明方案的工作过程 (3)说明方案如何满足每个要求

完整解答

(1)选择合适的密码学工具

根据要求,我们需要以下工具:

  • 对称加密:用于加密大文件(效率高)
  • 公钥加密:用于传输对称密钥(只有 Bob 能解密)
  • 哈希函数:用于文件完整性验证
  • 数字签名:用于认证发送方身份(可选)

具体选择

  • 对称加密:AES-256-CTR(适合大文件,支持并行)
  • 公钥加密:RSA-OAEP 或 Elgamal(用于加密对称密钥)
  • 哈希函数:SHA-256(用于完整性)
  • 数字签名:RSA-FDH 或 Schnorr(用于认证)

(2)详细方案设计

方案:使用混合加密 + 哈希 + 数字签名

步骤 1:发送方(Alice)准备文件

  1. 生成随机对称密钥:k{0,1}256k \leftarrow \{0,1\}^{256}(AES-256 密钥)
  2. 选择随机 IV:IV{0,1}128IV \leftarrow \{0,1\}^{128}
  3. 使用 AES-CTR 加密文件:
    • 将 10GB 文件分割成块:F1,F2,,FnF_1, F_2, \ldots, F_n
    • 对每个块加密:Ci=FiAESk(IV+i)C_i = F_i \oplus AES_k(IV + i)
    • 密文文件:C=C1C2CnC = C_1 || C_2 || \ldots || C_n
  4. 计算文件哈希值:h=SHA256(F)h = SHA256(F)(对整个原始文件计算)
  5. 使用 Bob 的公钥加密对称密钥:Kenc=RSA-OAEPpkB(kIV)K_{enc} = RSA\text{-}OAEP_{pk_B}(k || IV)
  6. (可选)使用 Alice 的私钥签名哈希值:σ=SignskA(h)\sigma = Sign_{sk_A}(h)

步骤 2:发送 Alice 发送给 Bob:

  • 加密文件:CC(10GB)
  • 加密的密钥:KencK_{enc}
  • 文件哈希值:hh
  • (可选)签名:σ\sigma

步骤 3:接收方(Bob)验证和解密

  1. 使用 Bob 的私钥解密密钥:(kIV)=RSA-OAEPskB1(Kenc)(k || IV) = RSA\text{-}OAEP_{sk_B}^{-1}(K_{enc})
  2. 使用 AES-CTR 解密文件:
    • 对每个块解密:Fi=CiAESk(IV+i)F_i = C_i \oplus AES_k(IV + i)
    • 恢复文件:F=F1F2FnF = F_1 || F_2 || \ldots || F_n
  3. 计算接收文件的哈希值:h=SHA256(F)h' = SHA256(F)
  4. 验证完整性:检查 h=hh' = h
    • 如果相等,文件完整;否则文件被篡改
  5. (可选)验证签名:VerifypkA(h,σ)Verify_{pk_A}(h, \sigma)

(3)说明如何满足每个要求

要求 1:文件大小为 10GB(很大)

  • 解决方案:使用对称加密(AES-CTR)
    • 对称加密速度快,适合大文件
    • CTR 模式支持并行加密/解密
    • 10GB 文件可以高效处理
  • 为什么不用公钥加密直接加密文件
    • 公钥加密速度慢,不适合大文件
    • RSA 只能加密小于模数的数据
    • 因此使用混合加密:公钥加密小密钥,对称加密大文件

要求 2:支付信息保密(没有人知道支付金额)

  • 解决方案:使用公钥加密保护对称密钥
    • 只有 Bob 拥有私钥 skBsk_B,只有 Bob 能解密 KencK_{enc} 获得 kk
    • 没有 kk,无法解密文件 CC
    • 因此,除了 Bob,没有人能知道文件内容(包括支付信息)
  • 安全性保证
    • RSA-OAEP 是 CPA 安全的
    • 即使攻击者截获 KencK_{enc},也无法解密(除非能破解 RSA)

要求 3:文件完整性(Integrity)

  • 解决方案:使用哈希函数验证完整性
    • Alice 计算原始文件的哈希值 h=SHA256(F)h = SHA256(F)
    • Bob 解密后计算接收文件的哈希值 h=SHA256(F)h' = SHA256(F')
    • 如果 h=hh' = h,则文件完整;否则文件被篡改
  • 安全性保证
    • SHA-256 具有碰撞抵抗性
    • 攻击者无法找到不同的文件产生相同的哈希值
    • 因此可以检测到任何篡改

要求 4:只有 Bob 可以检查文件内容

  • 解决方案:使用 Bob 的公钥加密
    • 对称密钥 kk 使用 Bob 的公钥 pkBpk_B 加密
    • 只有 Bob 拥有私钥 skBsk_B,只有 Bob 能解密获得 kk
    • 没有 kk,无法解密文件
  • 安全性保证
    • 公钥加密确保只有私钥持有者(Bob)能解密
    • 即使攻击者截获所有传输数据,也无法获得文件内容

方案总结

  • ✅ 满足大文件要求:使用高效的对称加密
  • ✅ 满足保密性要求:使用公钥加密保护密钥
  • ✅ 满足完整性要求:使用哈希函数验证
  • ✅ 满足访问控制要求:只有 Bob 能解密

题型三:证明题

题目 4:证明 ECB 模式不是 CPA 安全的

题目: 请严格证明 ECB(Electronic Codebook)模式不是 CPA(Chosen Plaintext Attack)安全的。

要求: (1)给出 CPA 安全的形式化定义 (2)构造攻击者算法 (3)分析攻击者的成功概率 (4)得出结论

完整解答

(1)CPA 安全的形式化定义

加密方案 (Gen,Enc,Dec)(Gen, Enc, Dec) 是 CPA 安全的,如果对于所有多项式时间的攻击者 AA,存在可忽略函数 ϵ\epsilon,使得: Pr[CPA-Game(A)=1]12+ϵ(n)\Pr[\text{CPA-Game}(A) = 1] \leq \frac{1}{2} + \epsilon(n)

CPA 游戏

  1. 挑战者生成密钥 kGen(1n)k \leftarrow Gen(1^n)
  2. 攻击者可以查询加密预言机 Enck()Enc_k(\cdot) 任意多项式次
  3. 攻击者选择两个等长的明文 m0,m1m_0, m_1m0=m1|m_0| = |m_1|
  4. 挑战者随机选择 b{0,1}b \leftarrow \{0,1\},返回挑战密文 c=Enck(mb)c^* = Enc_k(m_b)
  5. 攻击者继续查询加密预言机
  6. 攻击者输出 b{0,1}b' \in \{0,1\}
  7. 如果 b=bb' = b,攻击者获胜,游戏输出 1;否则输出 0

攻击者的优势AdvCPA(A)=Pr[CPA-Game(A)=1]12\text{Adv}_{CPA}(A) = |\Pr[\text{CPA-Game}(A) = 1] - \frac{1}{2}|

如果 AdvCPA(A)ϵ(n)\text{Adv}_{CPA}(A) \leq \epsilon(n)(可忽略),则方案是 CPA 安全的。

(2)构造攻击者算法

ECB 模式的加密: 对于消息 m=P1P2Pnm = P_1 || P_2 || \ldots || P_n(分割成块),ECB 模式加密为: Ci=Ek(Pi)对于 i=1,2,,nC_i = E_k(P_i) \quad \text{对于 } i = 1, 2, \ldots, n 密文:c=C1C2Cnc = C_1 || C_2 || \ldots || C_n

攻击者 AA 的构造

算法 AA

  1. 选择挑战明文

    • 选择两个块 PPQQ,使得 PQP \neq Q(例如 P=0128P = 0^{128}Q=1128Q = 1^{128}
    • 设置 m0=PPm_0 = P || P(两个相同的块)
    • 设置 m1=PQm_1 = P || Q(两个不同的块)
    • 发送 (m0,m1)(m_0, m_1) 给挑战者
  2. 接收挑战密文

    • 接收挑战密文 c=c1c2c^* = c_1^* || c_2^*(两个密文块)
  3. 区分

    • 如果 c1=c2c_1^* = c_2^*,则输出 b=0b' = 0
    • 如果 c1c2c_1^* \neq c_2^*,则输出 b=1b' = 1

(3)分析攻击者的成功概率

情况 1:b=0b = 0(加密 m0=PPm_0 = P || P

  • ECB 加密:c1=Ek(P)c_1^* = E_k(P)c2=Ek(P)c_2^* = E_k(P)
  • 由于 EkE_k 是确定性函数,Ek(P)=Ek(P)E_k(P) = E_k(P)
  • 因此 c1=c2c_1^* = c_2^*
  • 攻击者观察到 c1=c2c_1^* = c_2^*,输出 b=0b' = 0
  • 成功:b=b=0b' = b = 0

情况 2:b=1b = 1(加密 m1=PQm_1 = P || Q

  • ECB 加密:c1=Ek(P)c_1^* = E_k(P)c2=Ek(Q)c_2^* = E_k(Q)
  • 由于 PQP \neq QEkE_k 是置换(双射),Ek(P)Ek(Q)E_k(P) \neq E_k(Q)
  • 因此 c1c2c_1^* \neq c_2^*
  • 攻击者观察到 c1c2c_1^* \neq c_2^*,输出 b=1b' = 1
  • 成功:b=b=1b' = b = 1

成功概率分析

  • Pr[CPA-Game(A)=1]=Pr[b=b]\Pr[\text{CPA-Game}(A) = 1] = \Pr[b' = b]
  • 在情况 1 中:Pr[b=0b=0]=1\Pr[b' = 0 | b = 0] = 1
  • 在情况 2 中:Pr[b=1b=1]=1\Pr[b' = 1 | b = 1] = 1
  • 由于 bb 是均匀随机的:Pr[b=0]=Pr[b=1]=12\Pr[b = 0] = \Pr[b = 1] = \frac{1}{2}
  • 因此: Pr[b=b]=Pr[b=0]Pr[b=0b=0]+Pr[b=1]Pr[b=1b=1]\Pr[b' = b] = \Pr[b = 0] \cdot \Pr[b' = 0 | b = 0] + \Pr[b = 1] \cdot \Pr[b' = 1 | b = 1] =12×1+12×1=1= \frac{1}{2} \times 1 + \frac{1}{2} \times 1 = 1

攻击者的优势AdvCPA(A)=Pr[CPA-Game(A)=1]12=112=12\text{Adv}_{CPA}(A) = |\Pr[\text{CPA-Game}(A) = 1] - \frac{1}{2}| = |1 - \frac{1}{2}| = \frac{1}{2}

(4)得出结论

  • 攻击者 AA 的成功概率为 1(完美区分)
  • 攻击者的优势为 12\frac{1}{2},这是不可忽略的(常数,不是可忽略函数)
  • 根据 CPA 安全的定义,如果存在攻击者以不可忽略的优势获胜,则方案不是 CPA 安全的
  • 因此,ECB 模式不是 CPA 安全的

进一步说明

  • ECB 模式的问题在于:相同的明文块总是产生相同的密文块
  • 这允许攻击者通过观察密文模式来推断明文信息
  • 因此,ECB 模式不应在实际应用中使用
  • 应该使用 CBC、CTR 等安全的加密模式

题目 5:证明 Schnorr 签名在随机数受限时的不安全性

题目: 证明如果 Schnorr 签名中随机数 rr 的取值只从集合 {r1,r2,r3}\{r_1, r_2, r_3\} 中选择(而不是从整个 Zq\mathbb{Z}_q 中均匀随机选择),则签名方案是不安全的。

要求给出完整的攻击构造和成功概率分析。

完整解答

Schnorr 签名回顾

  • 私钥:xZqx \in \mathbb{Z}_q
  • 公钥:y=gxmodpy = g^x \bmod p
  • 签名:选择 rZqr \leftarrow \mathbb{Z}_q,计算 R=grR = g^rc=H(mR)c = H(m || R)s=r+cxmodqs = r + cx \bmod q
  • 签名:σ=(R,s)\sigma = (R, s)
  • 验证:检查 gs=Rycg^s = R \cdot y^c

(1)攻击场景设置

假设签名者使用受限的随机数集合:r{r1,r2,r3}r \in \{r_1, r_2, r_3\},而不是从整个 Zq\mathbb{Z}_q 中随机选择。

(2)攻击者构造

攻击者 AA 的目标:恢复私钥 xx 或伪造签名

攻击算法

步骤 1:观察签名

  1. 攻击者 AA 查询签名预言机,获得消息 mm 的签名 σ=(R,s)\sigma = (R, s)
  2. AA 知道 R=grR = g^r,其中 r{r1,r2,r3}r \in \{r_1, r_2, r_3\}

步骤 2:穷举搜索 rr 对于每个 ri{r1,r2,r3}r_i \in \{r_1, r_2, r_3\}

  1. 计算 Ri=grimodpR_i = g^{r_i} \bmod p
  2. 检查 Ri=RR_i = R
  3. 如果相等,则找到了使用的 rir_i

步骤 3:恢复私钥 一旦找到 rir_i,攻击者可以恢复私钥:

  • 从签名:s=ri+cxmodqs = r_i + cx \bmod q
  • 其中 c=H(mR)c = H(m || R) 是已知的
  • 因此:x=(sri)c1modqx = (s - r_i) \cdot c^{-1} \bmod q

(3)成功概率分析

找到 rr 的概率

  • 随机数 rr{r1,r2,r3}\{r_1, r_2, r_3\} 中均匀选择
  • 攻击者需要尝试最多 3 次
  • 成功概率:Pr[找到 r]=1\Pr[\text{找到 } r] = 1(在最多 3 次尝试后)

恢复私钥的概率

  • 一旦找到 rr,可以确定性地计算 xx
  • 成功概率:Pr[恢复 x找到 r]=1\Pr[\text{恢复 } x | \text{找到 } r] = 1

总体成功概率Pr[攻击成功]=Pr[找到 r]×Pr[恢复 x找到 r]=1×1=1\Pr[\text{攻击成功}] = \Pr[\text{找到 } r] \times \Pr[\text{恢复 } x | \text{找到 } r] = 1 \times 1 = 1

时间复杂度

  • 需要计算 grig^{r_i} 最多 3 次
  • 每次计算需要 O(logri)O(\log r_i) 次模幂运算
  • 总时间复杂度:O(3×logq)=O(logq)O(3 \times \log q) = O(\log q)(多项式时间)

(4)伪造签名

一旦攻击者获得私钥 xx,可以:

  1. 为任意消息 mm^* 生成有效签名
  2. 选择任意 rr^*(甚至不需要受限)
  3. 计算 R=grR^* = g^{r^*}c=H(mR)c^* = H(m^* || R^*)s=r+cxmodqs^* = r^* + c^* x \bmod q
  4. 输出签名 σ=(R,s)\sigma^* = (R^*, s^*)

(5)对比:如果 rr 从整个 Zq\mathbb{Z}_q 中选择

如果 rr 从整个 Zq\mathbb{Z}_q 中均匀随机选择:

  • Zq=q|\mathbb{Z}_q| = q(通常 q2256q \approx 2^{256}
  • 攻击者需要尝试平均 q/2q/2 次才能找到 rr
  • 成功概率:Pr[找到 r]2256\Pr[\text{找到 } r] \approx 2^{-256}(可忽略)
  • 因此攻击不可行

(6)结论

  • 如果随机数 rr 只从 {r1,r2,r3}\{r_1, r_2, r_3\} 中选择,攻击者可以在多项式时间内以概率 1 恢复私钥
  • 这违反了数字签名的不可伪造性(攻击者可以伪造任意签名)
  • 因此,Schnorr 签名在随机数受限时是不安全的
  • 必须要求 rr 从整个 Zq\mathbb{Z}_q 中均匀随机选择

题型四:计算题

题目 6:RSA 加密解密完整计算

题目: 给定 RSA 参数:

  • p=17p = 17q=19q = 19
  • 公钥指数 e=5e = 5
  • 明文 m=123m = 123

请完成以下计算: (1)计算模数 nn 和欧拉函数 ϕ(n)\phi(n) (2)验证 eeϕ(n)\phi(n) 互素 (3)计算私钥指数 dd (4)计算密文 cc (5)验证解密过程

完整解答

(1)计算模数和欧拉函数

模数n=p×q=17×19=323n = p \times q = 17 \times 19 = 323

欧拉函数ϕ(n)=(p1)(q1)=(171)(191)=16×18=288\phi(n) = (p-1)(q-1) = (17-1)(19-1) = 16 \times 18 = 288

(2)验证 eeϕ(n)\phi(n) 互素

需要验证 gcd(e,ϕ(n))=gcd(5,288)=1\gcd(e, \phi(n)) = \gcd(5, 288) = 1

使用欧几里得算法

  • 288=5×57+3288 = 5 \times 57 + 3
  • 5=3×1+25 = 3 \times 1 + 2
  • 3=2×1+13 = 2 \times 1 + 1
  • 2=1×2+02 = 1 \times 2 + 0

因此 gcd(5,288)=1\gcd(5, 288) = 1

(3)计算私钥指数 dd

需要找到 dd 使得 ed1(modϕ(n))ed \equiv 1 \pmod{\phi(n)},即 5d1(mod288)5d \equiv 1 \pmod{288}

使用扩展欧几里得算法

从上面的计算:

  • 288=5×57+3288 = 5 \times 57 + 33=2885×573 = 288 - 5 \times 57
  • 5=3×1+25 = 3 \times 1 + 22=53×12 = 5 - 3 \times 1
  • 3=2×1+13 = 2 \times 1 + 11=32×11 = 3 - 2 \times 1

回代1=32×11 = 3 - 2 \times 1 =3(53×1)×1=35+3=2×35= 3 - (5 - 3 \times 1) \times 1 = 3 - 5 + 3 = 2 \times 3 - 5 =2×(2885×57)5=2×288114×55= 2 \times (288 - 5 \times 57) - 5 = 2 \times 288 - 114 \times 5 - 5 =2×288115×5= 2 \times 288 - 115 \times 5

因此 1=2×288115×51 = 2 \times 288 - 115 \times 5

所以 d=115mod288=288115=173d = -115 \bmod 288 = 288 - 115 = 173

验证5×173=8655 \times 173 = 865 865mod288=8653×288=865864=1865 \bmod 288 = 865 - 3 \times 288 = 865 - 864 = 1

因此 d=173d = 173

(4)计算密文 cc

公钥pk=(n,e)=(323,5)pk = (n, e) = (323, 5) 明文m=123m = 123

检查明文范围123<323123 < 323 ✓(明文在有效范围内)

加密c=memodn=1235mod323c = m^e \bmod n = 123^5 \bmod 323

使用模幂算法

首先将指数 5 表示为二进制:5=1012=22+20=4+15 = 101_2 = 2^2 + 2^0 = 4 + 1

计算 1232imod323123^{2^i} \bmod 323

  • 1231=123mod323=123123^1 = 123 \bmod 323 = 123
  • 1232=15129mod323123^2 = 15129 \bmod 323

计算 15129mod32315129 \bmod 323

  • 323×46=14858323 \times 46 = 14858

  • 1512914858=27115129 - 14858 = 271

  • 因此 1232=271mod323123^2 = 271 \bmod 323

  • 1234=(1232)2=2712mod323123^4 = (123^2)^2 = 271^2 \bmod 323

计算 2712=73441mod323271^2 = 73441 \bmod 323

  • 323×227=73321323 \times 227 = 73321
  • 7344173321=12073441 - 73321 = 120
  • 因此 1234=120mod323123^4 = 120 \bmod 323

现在计算 1235123^51235=1234×1231=120×123mod323123^5 = 123^4 \times 123^1 = 120 \times 123 \bmod 323

计算 120×123=14760mod323120 \times 123 = 14760 \bmod 323

  • 323×45=14535323 \times 45 = 14535
  • 1476014535=22514760 - 14535 = 225
  • 因此 c=225c = 225

(5)验证解密过程

私钥sk=(n,d)=(323,173)sk = (n, d) = (323, 173) 密文c=225c = 225

解密m=cdmodn=225173mod323m' = c^d \bmod n = 225^{173} \bmod 323

使用模幂算法

将指数 173 表示为二进制:173=101011012=128+32+8+4+1173 = 10101101_2 = 128 + 32 + 8 + 4 + 1

计算 2252imod323225^{2^i} \bmod 323

  • 2251=225mod323=225225^1 = 225 \bmod 323 = 225
  • 2252=50625mod323225^2 = 50625 \bmod 323

计算 50625mod32350625 \bmod 323

  • 323×156=50388323 \times 156 = 50388

  • 5062550388=23750625 - 50388 = 237

  • 因此 2252=237mod323225^2 = 237 \bmod 323

  • 2254=(2252)2=2372mod323225^4 = (225^2)^2 = 237^2 \bmod 323

计算 2372=56169mod323237^2 = 56169 \bmod 323

  • 323×173=55879323 \times 173 = 55879

  • 5616955879=29056169 - 55879 = 290

  • 因此 2254=290mod323225^4 = 290 \bmod 323

  • 2258=(2254)2=2902mod323225^8 = (225^4)^2 = 290^2 \bmod 323

计算 2902=84100mod323290^2 = 84100 \bmod 323

  • 323×260=83980323 \times 260 = 83980

  • 8410083980=12084100 - 83980 = 120

  • 因此 2258=120mod323225^8 = 120 \bmod 323

  • 22516=(2258)2=1202mod323225^{16} = (225^8)^2 = 120^2 \bmod 323

计算 1202=14400mod323120^2 = 14400 \bmod 323

  • 323×44=14212323 \times 44 = 14212

  • 1440014212=18814400 - 14212 = 188

  • 因此 22516=188mod323225^{16} = 188 \bmod 323

  • 22532=(22516)2=1882mod323225^{32} = (225^{16})^2 = 188^2 \bmod 323

计算 1882=35344mod323188^2 = 35344 \bmod 323

  • 323×109=35207323 \times 109 = 35207

  • 3534435207=13735344 - 35207 = 137

  • 因此 22532=137mod323225^{32} = 137 \bmod 323

  • 22564=(22532)2=1372mod323225^{64} = (225^{32})^2 = 137^2 \bmod 323

计算 1372=18769mod323137^2 = 18769 \bmod 323

  • 323×58=18734323 \times 58 = 18734

  • 1876918734=3518769 - 18734 = 35

  • 因此 22564=35mod323225^{64} = 35 \bmod 323

  • 225128=(22564)2=352mod323225^{128} = (225^{64})^2 = 35^2 \bmod 323

计算 352=1225mod32335^2 = 1225 \bmod 323

  • 323×3=969323 \times 3 = 969
  • 1225969=2561225 - 969 = 256
  • 因此 225128=256mod323225^{128} = 256 \bmod 323

现在计算 225173225^{173}225173=225128×22532×2258×2254×2251225^{173} = 225^{128} \times 225^{32} \times 225^8 \times 225^4 \times 225^1 =256×137×120×290×225mod323= 256 \times 137 \times 120 \times 290 \times 225 \bmod 323

逐步计算:

  • 256×137=35072mod323256 \times 137 = 35072 \bmod 323

计算 35072mod32335072 \bmod 323

  • 323×108=34884323 \times 108 = 34884

  • 3507234884=18835072 - 34884 = 188

  • 因此中间结果 = 188188

  • 188×120=22560mod323188 \times 120 = 22560 \bmod 323

计算 22560mod32322560 \bmod 323

  • 323×69=22287323 \times 69 = 22287

  • 2256022287=27322560 - 22287 = 273

  • 因此中间结果 = 273273

  • 273×290=79170mod323273 \times 290 = 79170 \bmod 323

计算 79170mod32379170 \bmod 323

  • 323×245=79135323 \times 245 = 79135

  • 7917079135=3579170 - 79135 = 35

  • 因此中间结果 = 3535

  • 35×225=7875mod32335 \times 225 = 7875 \bmod 323

计算 7875mod3237875 \bmod 323

  • 323×24=7752323 \times 24 = 7752
  • 78757752=1237875 - 7752 = 123
  • 因此 m=123m' = 123

验证

  • 原始明文:m=123m = 123
  • 解密明文:m=123m' = 123
  • m=mm = m'

解密成功!


题目 7:Elgamal 加密解密完整计算

题目: 给定 Elgamal 加密参数:

  • p=23p = 23g=5g = 5
  • 私钥 x=6x = 6
  • 明文 m=7m = 7
  • 随机数 r=3r = 3

请完成: (1)计算公钥 yy (2)计算密文 (c1,c2)(c_1, c_2) (3)验证解密过程

完整解答

(1)计算公钥 yy

私钥x=6x = 6 生成元g=5g = 5 模数p=23p = 23

公钥y=gxmodp=56mod23y = g^x \bmod p = 5^6 \bmod 23

计算 56mod235^6 \bmod 23

  • 52=25mod23=25^2 = 25 \bmod 23 = 2
  • 54=(52)2=22=4mod23=45^4 = (5^2)^2 = 2^2 = 4 \bmod 23 = 4
  • 56=54×52=4×2=8mod23=85^6 = 5^4 \times 5^2 = 4 \times 2 = 8 \bmod 23 = 8

因此 y=8y = 8

公钥pk=(p,g,y)=(23,5,8)pk = (p, g, y) = (23, 5, 8)

(2)计算密文 (c1,c2)(c_1, c_2)

明文m=7m = 7 随机数r=3r = 3 公钥y=8y = 8

Elgamal 加密公式

  • c1=grmodpc_1 = g^r \bmod p
  • c2=myrmodpc_2 = m \cdot y^r \bmod p

计算 c1c_1c1=grmodp=53mod23=125mod23c_1 = g^r \bmod p = 5^3 \bmod 23 = 125 \bmod 23

计算 125mod23125 \bmod 23

  • 23×5=11523 \times 5 = 115
  • 125115=10125 - 115 = 10

因此 c1=10c_1 = 10

计算 c2c_2c2=myrmodp=783mod23c_2 = m \cdot y^r \bmod p = 7 \cdot 8^3 \bmod 23

首先计算 83mod238^3 \bmod 23

  • 81=8mod23=88^1 = 8 \bmod 23 = 8
  • 82=64mod23=642×23=6446=188^2 = 64 \bmod 23 = 64 - 2 \times 23 = 64 - 46 = 18
  • 83=82×8=18×8=144mod238^3 = 8^2 \times 8 = 18 \times 8 = 144 \bmod 23

计算 144mod23144 \bmod 23

  • 23×6=13823 \times 6 = 138
  • 144138=6144 - 138 = 6

因此 83=6mod238^3 = 6 \bmod 23

所以 c2=7×6=42mod23=421×23=19c_2 = 7 \times 6 = 42 \bmod 23 = 42 - 1 \times 23 = 19

密文c=(c1,c2)=(10,19)c = (c_1, c_2) = (10, 19)

(3)验证解密过程

私钥x=6x = 6 密文c=(10,19)c = (10, 19)

Elgamal 解密公式m=c2(c1x)1modpm = c_2 \cdot (c_1^x)^{-1} \bmod p

步骤 1:计算 c1xc_1^x c1x=106mod23c_1^x = 10^6 \bmod 23

计算 106mod2310^6 \bmod 23

  • 102=100mod23=1004×23=10092=810^2 = 100 \bmod 23 = 100 - 4 \times 23 = 100 - 92 = 8
  • 104=(102)2=82=64mod23=1810^4 = (10^2)^2 = 8^2 = 64 \bmod 23 = 18
  • 106=104×102=18×8=144mod23=610^6 = 10^4 \times 10^2 = 18 \times 8 = 144 \bmod 23 = 6

因此 c1x=6c_1^x = 6

步骤 2:计算 (c1x)1mod23(c_1^x)^{-1} \bmod 23

需要找到 61mod236^{-1} \bmod 23,即找到 dd 使得 6d1(mod23)6d \equiv 1 \pmod{23}

使用扩展欧几里得算法

  • 23=6×3+523 = 6 \times 3 + 5
  • 6=5×1+16 = 5 \times 1 + 1
  • 5=1×5+05 = 1 \times 5 + 0

回代:

  • 1=65×11 = 6 - 5 \times 1
  • 5=236×35 = 23 - 6 \times 3
  • 1=6(236×3)=623+6×3=6×4231 = 6 - (23 - 6 \times 3) = 6 - 23 + 6 \times 3 = 6 \times 4 - 23

因此 614(mod23)6^{-1} \equiv 4 \pmod{23}

验证:6×4=241(mod23)6 \times 4 = 24 \equiv 1 \pmod{23}

步骤 3:计算明文 m=c2(c1x)1modp=19×4mod23=76mod23m = c_2 \cdot (c_1^x)^{-1} \bmod p = 19 \times 4 \bmod 23 = 76 \bmod 23

计算 76mod2376 \bmod 23

  • 23×3=6923 \times 3 = 69
  • 7669=776 - 69 = 7

因此 m=7m = 7

验证

  • 原始明文:m=7m = 7
  • 解密明文:m=7m = 7
  • 两者相等 ✓

解密成功!


题目 8:Schnorr 签名完整计算

题目: 给定 Schnorr 签名参数:

  • p=23p = 23q=11q = 11112211 | 22 ✓)
  • g=5g = 5(生成元)
  • 私钥 x=3x = 3
  • 消息 m=7m = 7
  • 随机数 r=4r = 4
  • 哈希函数:H(mR)=(mR)mod11H(m || R) = (m \cdot R) \bmod 11(简化)

请完成: (1)计算公钥 yy (2)生成签名 (R,s)(R, s) (3)验证签名

完整解答

(1)计算公钥 yy

私钥x=3x = 3 生成元g=5g = 5 模数p=23p = 23

公钥y=gxmodp=53mod23=125mod23=1255×23=125115=10y = g^x \bmod p = 5^3 \bmod 23 = 125 \bmod 23 = 125 - 5 \times 23 = 125 - 115 = 10

因此 y=10y = 10

公钥pk=y=10pk = y = 10

(2)生成签名 (R,s)(R, s)

消息m=7m = 7 随机数r=4r = 4

步骤 1:计算承诺 RR R=grmodp=54mod23R = g^r \bmod p = 5^4 \bmod 23

计算 54mod235^4 \bmod 23

  • 52=25mod23=25^2 = 25 \bmod 23 = 2
  • 54=(52)2=22=4mod23=45^4 = (5^2)^2 = 2^2 = 4 \bmod 23 = 4

因此 R=4R = 4

步骤 2:计算挑战 cc c=H(mR)=(mR)mod11=(7×4)mod11=28mod11=6c = H(m || R) = (m \cdot R) \bmod 11 = (7 \times 4) \bmod 11 = 28 \bmod 11 = 6

因此 c=6c = 6

步骤 3:计算响应 ss s=r+cxmodq=4+6×3mod11=4+18mod11=22mod11=0s = r + cx \bmod q = 4 + 6 \times 3 \bmod 11 = 4 + 18 \bmod 11 = 22 \bmod 11 = 0

因此 s=0s = 0

签名σ=(R,s)=(4,0)\sigma = (R, s) = (4, 0)

(3)验证签名

公钥y=10y = 10 消息m=7m = 7 签名σ=(R,s)=(4,0)\sigma = (R, s) = (4, 0)

验证公式:检查 gs=Ryc(modp)g^s = R \cdot y^c \pmod{p}

步骤 1:重新计算挑战 cc c=H(mR)=(7×4)mod11=6c = H(m || R) = (7 \times 4) \bmod 11 = 6

步骤 2:计算左边 gsg^s gs=50mod23=1g^s = 5^0 \bmod 23 = 1

步骤 3:计算右边 RycR \cdot y^c Ryc=4×106mod23R \cdot y^c = 4 \times 10^6 \bmod 23

首先计算 106mod2310^6 \bmod 23

  • 102=100mod23=1004×23=10092=810^2 = 100 \bmod 23 = 100 - 4 \times 23 = 100 - 92 = 8
  • 104=(102)2=82=64mod23=1810^4 = (10^2)^2 = 8^2 = 64 \bmod 23 = 18
  • 106=104×102=18×8=144mod23=1446×23=144138=610^6 = 10^4 \times 10^2 = 18 \times 8 = 144 \bmod 23 = 144 - 6 \times 23 = 144 - 138 = 6

因此 Ryc=4×6=24mod23=2423=1R \cdot y^c = 4 \times 6 = 24 \bmod 23 = 24 - 23 = 1

步骤 4:比较

  • 左边:gs=1g^s = 1
  • 右边:Ryc=1R \cdot y^c = 1
  • 1=11 = 1

验证通过!签名有效!


第二部分:公钥密码学

题型一:概念解释题

题目 9:解释 Diffie-Hellman 密钥协商的安全性

题目: 请详细解释 Diffie-Hellman 密钥协商协议的安全性,包括: (1)协议的基本原理 (2)安全性基于哪个困难问题 (3)为什么攻击者无法获得共享密钥 (4)协议的安全假设

完整解答

(1)协议的基本原理

Diffie-Hellman 密钥协商协议允许两个通信方在不安全的信道上建立一个共享密钥。

协议步骤

  1. 公开参数:选择大素数 pp 和生成元 gZpg \in \mathbb{Z}_p^*,参数 (p,g)(p, g) 公开
  2. Alice
    • 随机选择私钥 aZp1a \leftarrow \mathbb{Z}_{p-1}
    • 计算公钥 A=gamodpA = g^a \bmod p
    • 发送 AA 给 Bob
  3. Bob
    • 随机选择私钥 bZp1b \leftarrow \mathbb{Z}_{p-1}
    • 计算公钥 B=gbmodpB = g^b \bmod p
    • 发送 BB 给 Alice
  4. 共享密钥
    • Alice 计算:K=Bamodp=(gb)amodp=gabmodpK = B^a \bmod p = (g^b)^a \bmod p = g^{ab} \bmod p
    • Bob 计算:K=Abmodp=(ga)bmodp=gabmodpK = A^b \bmod p = (g^a)^b \bmod p = g^{ab} \bmod p
    • 双方得到相同的共享密钥 K=gabmodpK = g^{ab} \bmod p

(2)安全性基于哪个困难问题

Diffie-Hellman 密钥协商的安全性基于**离散对数问题(DLP)**的困难性。

离散对数问题: 给定群 GG(如 Zp\mathbb{Z}_p^*),生成元 gg,和元素 h=gxh = g^x,计算 x=logghx = \log_g h 在计算上不可行。

在 DH 协议中

  • 攻击者看到 A=gaA = g^aB=gbB = g^b
  • 攻击者想要计算 K=gabK = g^{ab}
  • 这等价于计算 Diffie-Hellman 问题(CDH)
  • CDH 的困难性基于 DLP 的困难性

(3)为什么攻击者无法获得共享密钥

攻击者观察到的信息

  • 公开参数:(p,g)(p, g)
  • Alice 的公钥:A=gamodpA = g^a \bmod p
  • Bob 的公钥:B=gbmodpB = g^b \bmod p

攻击者想要计算

  • 共享密钥:K=gabmodpK = g^{ab} \bmod p

攻击者的困难

方法 1:直接计算 gabg^{ab}

  • 攻击者需要知道 aabb
  • aabb 是私钥,只有 Alice 和 Bob 知道
  • 攻击者无法从 A=gaA = g^a 计算 aa(这是 DLP,计算上不可行)

方法 2:从 AABB 计算 KK

  • 这等价于求解计算 Diffie-Hellman(CDH)问题
  • CDH 问题在计算上不可行(基于 DLP 困难性)

方法 3:中间人攻击(MITM)

  • 攻击者可以拦截 AABB,并发送自己的公钥
  • 但这需要攻击者能够修改通信信道
  • 在标准 DH 协议中,假设通信信道是认证的(或使用数字签名防止 MITM)

(4)协议的安全假设

计算假设

  1. 离散对数假设(DL Assumption)

    • 在群 Zp\mathbb{Z}_p^* 中,给定 gggxg^x,计算 xx 在计算上不可行
    • 这是协议安全性的基础
  2. 计算 Diffie-Hellman 假设(CDH Assumption)

    • 给定 gggag^agbg^b,计算 gabg^{ab} 在计算上不可行
    • 直接保证共享密钥的安全性
  3. 判定 Diffie-Hellman 假设(DDH Assumption)(更强的假设):

    • 给定 gggag^agbg^bZZ,判定 Z=gabZ = g^{ab} 还是 ZZ 是随机元素在计算上不可行
    • 用于更强的安全保证

协议假设

  1. 参数选择

    • pp 必须是大素数(通常 2048 位或更大)
    • gg 必须是生成元(或大阶元素)
    • 参数必须正确生成
  2. 随机性

    • 私钥 aabb 必须从 Zp1\mathbb{Z}_{p-1} 中均匀随机选择
    • 不能使用弱随机数生成器
  3. 通信安全

    • 标准 DH 不提供认证,容易受到中间人攻击
    • 实际应用中需要结合数字签名或证书

安全性总结

  • DH 密钥协商在 DLP/CDH 假设下是安全的
  • 攻击者无法从公开信息计算共享密钥
  • 但需要防止中间人攻击(使用认证机制)

题型二:方案设计题

题目 10:设计一个安全的电子投票方案

题目: 设计一个使用同态加密的电子投票方案,满足以下要求:

  1. 每个投票者只能投票一次
  2. 投票是保密的(没有人知道具体投票内容)
  3. 可以正确统计投票结果
  4. 投票者可以验证自己的投票被正确记录

请: (1)选择合适的密码学工具 (2)详细描述投票流程 (3)说明如何满足每个要求

完整解答

(1)选择合适的密码学工具

根据要求,需要以下工具:

  • 同态加密:允许在密文上计算,用于统计投票
  • 零知识证明:用于证明投票有效性(投票值在允许范围内)
  • 数字签名:用于认证投票者身份
  • 承诺协议:用于确保投票的绑定性

具体选择

  • 同态加密:Elgamal 同态加密(支持乘法同态)
  • 零知识证明:Schnorr 签名或 Sigma 协议
  • 数字签名:RSA-FDH 或 Schnorr
  • 承诺协议:Pedersen 承诺

(2)详细方案设计

方案:基于 Elgamal 同态加密的投票方案

设置阶段

  1. 选择 Elgamal 参数:大素数 pp,生成元 gZpg \in \mathbb{Z}_p^*
  2. 投票机构生成密钥对:私钥 xx,公钥 y=gxmodpy = g^x \bmod p
  3. 公开参数:(p,g,y)(p, g, y)

投票阶段(投票者 ViV_i):

  1. 身份认证:投票者使用数字签名证明身份
  2. 选择投票:投票者选择 b{0,1}b \in \{0, 1\}(支持或反对)
  3. 加密投票
    • 随机选择 rZp1r \leftarrow \mathbb{Z}_{p-1}
    • 计算:c1=grmodpc_1 = g^r \bmod p
    • 计算:c2=gbyrmodpc_2 = g^b \cdot y^r \bmod p(注意:这里 gbg^b 表示投票,b{0,1}b \in \{0,1\}
    • 密文:C=(c1,c2)C = (c_1, c_2)
  4. 零知识证明:投票者生成 ZK 证明,证明 b{0,1}b \in \{0, 1\}(使用 OR 证明)
  5. 提交:投票者提交 (C,ZK proof,signature)(C, \text{ZK proof}, \text{signature})

统计阶段

  1. 验证所有投票
    • 验证每个投票者的身份(数字签名)
    • 验证每个投票的 ZK 证明(确保 b{0,1}b \in \{0,1\}
  2. 同态计算
    • 对于所有有效投票密文 Ci=(c1,i,c2,i)C_i = (c_{1,i}, c_{2,i}),计算:
    • Ctotal=i=1nCi=(i=1nc1,i,i=1nc2,i)C_{total} = \prod_{i=1}^n C_i = (\prod_{i=1}^n c_{1,i}, \prod_{i=1}^n c_{2,i})
    • 由于 Elgamal 的乘法同态性: Ctotal=(gri,gbiyri)C_{total} = (g^{\sum r_i}, g^{\sum b_i} \cdot y^{\sum r_i})
  3. 解密统计结果
    • 使用私钥 xx 解密 CtotalC_{total}
    • 计算:gbi=c2,total(c1,total)xmodpg^{\sum b_i} = c_{2,total} \cdot (c_{1,total})^{-x} \bmod p
    • 计算离散对数:bi=logg(gbi)\sum b_i = \log_g (g^{\sum b_i})(由于 bi\sum b_i 较小,可以穷举)
    • 统计结果:支持票数 = bi\sum b_i,反对票数 = nbin - \sum b_i

(3)说明如何满足每个要求

要求 1:每个投票者只能投票一次

  • 解决方案:使用数字签名认证身份
    • 每个投票者使用自己的私钥签名投票
    • 投票机构维护已投票者列表
    • 如果同一身份重复投票,拒绝第二次投票
  • 技术细节
    • 投票者提交 (C,σ)(C, \sigma),其中 σ=SignskV(Ctimestamp)\sigma = Sign_{sk_V}(C || timestamp)
    • 投票机构验证签名并检查身份是否已投票

要求 2:投票是保密的(没有人知道具体投票内容)

  • 解决方案:使用 Elgamal 加密
    • 每个投票 bb 被加密为 C=(c1,c2)C = (c_1, c_2)
    • 只有投票机构拥有私钥 xx,可以解密
    • 但投票机构只能看到统计结果,不能看到单个投票(如果使用阈值解密)
  • 技术细节
    • 使用随机数 rr 确保相同投票产生不同密文
    • 加密是 CPA 安全的
    • 可以进一步使用阈值加密,需要多个机构合作才能解密

要求 3:可以正确统计投票结果

  • 解决方案:使用同态加密
    • Elgamal 支持乘法同态:Enc(b1)Enc(b2)=Enc(b1+b2)Enc(b_1) \cdot Enc(b_2) = Enc(b_1 + b_2)(在指数上)
    • 所有投票密文相乘得到总投票数的加密
    • 解密后得到 bi\sum b_i,即支持票数
  • 技术细节
    • 同态性:Enc(b1)Enc(b2)=(gr1+r2,gb1+b2yr1+r2)Enc(b_1) \cdot Enc(b_2) = (g^{r_1+r_2}, g^{b_1+b_2} \cdot y^{r_1+r_2})
    • 解密后得到 gb1+b2g^{b_1+b_2},计算离散对数得到 b1+b2b_1 + b_2
    • 对于 nn 个投票,bin\sum b_i \leq n,可以穷举计算离散对数

要求 4:投票者可以验证自己的投票被正确记录

  • 解决方案:使用承诺和验证机制
    • 投票者提交投票时,同时提交承诺 commit=Commit(b,r)commit = Commit(b, r')
    • 投票机构公布所有投票密文(不公布对应关系)
    • 投票者可以验证自己的密文在列表中
    • 统计后,投票者可以验证承诺(可选)
  • 技术细节
    • 投票者计算 commit=H(brID)commit = H(b || r' || ID)
    • 提交 (C,commit)(C, commit)
    • 投票机构公布所有 (Ci,commiti)(C_i, commit_i) 的列表
    • 投票者检查自己的 (C,commit)(C, commit) 在列表中
    • 统计后,可以揭示 bbrr' 验证承诺

方案总结

  • ✅ 满足唯一性:数字签名防止重复投票
  • ✅ 满足保密性:Elgamal 加密保护投票内容
  • ✅ 满足正确性:同态加密支持正确统计
  • ✅ 满足可验证性:承诺机制允许验证

题型三:证明题

题目 11:证明哈希函数三个安全性质之间的关系

题目: 证明哈希函数的三个安全性质之间的关系: (1)碰撞抵抗性(Collision Resistance) (2)第二原像抵抗性(Second Preimage Resistance) (3)原像抵抗性(Preimage Resistance)

请证明:

  • 碰撞抵抗性 \Rightarrow 第二原像抵抗性
  • 第二原像抵抗性 \Rightarrow 原像抵抗性(在随机预言机模型下)

完整解答

(1)定义三个安全性质

原像抵抗性(Preimage Resistance): 对于所有多项式时间攻击者 AA,存在可忽略函数 ϵ\epsilon,使得: Pr[x{0,1},y=H(x),A(y)=x 且 H(x)=y]ϵ(n)\Pr[x \leftarrow \{0,1\}^*, y = H(x), A(y) = x' \text{ 且 } H(x') = y] \leq \epsilon(n) 即:给定哈希值 yy,找到 xx 使得 H(x)=yH(x) = y 在计算上不可行。

第二原像抵抗性(Second Preimage Resistance): 对于所有多项式时间攻击者 AA,存在可忽略函数 ϵ\epsilon,使得: Pr[x{0,1},A(x)=xx 且 H(x)=H(x)]ϵ(n)\Pr[x \leftarrow \{0,1\}^*, A(x) = x' \neq x \text{ 且 } H(x') = H(x)] \leq \epsilon(n) 即:给定 xx,找到 xxx' \neq x 使得 H(x)=H(x)H(x) = H(x') 在计算上不可行。

碰撞抵抗性(Collision Resistance): 对于所有多项式时间攻击者 AA,存在可忽略函数 ϵ\epsilon,使得: Pr[A()=(x,x) 且 xx 且 H(x)=H(x)]ϵ(n)\Pr[A() = (x, x') \text{ 且 } x \neq x' \text{ 且 } H(x) = H(x')] \leq \epsilon(n) 即:找到任意 x,xx, x' 使得 xxx \neq x'H(x)=H(x)H(x) = H(x') 在计算上不可行。

(2)证明:碰撞抵抗性 \Rightarrow 第二原像抵抗性

证明方法:反证法

假设哈希函数 HH 是碰撞抵抗的,但不是第二原像抵抗的。我们将构造一个算法来找到碰撞,这与碰撞抵抗性矛盾。

构造攻击者 AcollisionA_{collision}

算法 AcollisionA_{collision}

  1. 随机选择 x{0,1}x \leftarrow \{0,1\}^*
  2. 调用第二原像攻击者 A2ndA_{2nd}(假设存在),输入 xx
  3. A2ndA_{2nd} 输出 xxx' \neq x 使得 H(x)=H(x)H(x') = H(x)
  4. 输出碰撞 (x,x)(x, x')

成功概率分析

  • 如果 A2ndA_{2nd} 能够以不可忽略的概率 δ\delta 找到第二原像
  • AcollisionA_{collision} 能够以相同的概率 δ\delta 找到碰撞
  • 这与 HH 是碰撞抵抗的假设矛盾

结论

  • 如果 HH 是碰撞抵抗的,则 HH 必须是第二原像抵抗的
  • 因此:碰撞抵抗性 \Rightarrow 第二原像抵抗性

(3)证明:第二原像抵抗性 \Rightarrow 原像抵抗性(在随机预言机模型下)

证明方法:在随机预言机模型下,如果哈希函数是第二原像抵抗的,则也是原像抵抗的。

证明思路: 在随机预言机模型中,哈希函数 HH 的行为类似于随机函数。如果 HH 是第二原像抵抗的,那么:

  1. 随机预言机的性质

    • 对于每个输入 xxH(x)H(x) 是均匀随机的
    • 不同输入的输出是独立的
  2. 原像攻击的困难性

    • 给定哈希值 yy,攻击者需要找到 xx 使得 H(x)=yH(x) = y
    • 由于 HH 是随机的,攻击者只能通过查询 HH 来寻找
    • 每次查询成功的概率约为 2n2^{-n}nn 是输出长度)
    • 需要平均 2n2^n 次查询才能找到原像
  3. 与第二原像抵抗性的关系

    • 如果 HH 是第二原像抵抗的,则给定 xx,找到 xx' 使得 H(x)=H(x)H(x') = H(x) 是困难的
    • 在随机预言机模型中,这等价于原像抵抗性
    • 因为如果能够找到原像,则能够找到第二原像(通过先随机选择 xx,然后找到 H(x)H(x) 的原像)

形式化证明(简化): 假设存在原像攻击者 ApreimageA_{preimage} 能够以不可忽略的概率找到原像。构造第二原像攻击者 A2ndA_{2nd}

算法 A2nd(x)A_{2nd}(x)

  1. 计算 y=H(x)y = H(x)
  2. 调用 Apreimage(y)A_{preimage}(y),得到 xx'
  3. 如果 xxx' \neq xH(x)=yH(x') = y,输出 xx'
  4. 否则输出失败

成功概率

  • 如果 ApreimageA_{preimage} 成功找到原像,且 xxx' \neq x(概率很高,因为输入空间很大)
  • A2ndA_{2nd} 成功找到第二原像
  • 这与第二原像抵抗性矛盾

结论

  • 在随机预言机模型下,第二原像抵抗性 \Rightarrow 原像抵抗性
  • 注意:这个结论依赖于随机预言机模型,在实际哈希函数中可能不成立

(4)总结

三个安全性质之间的关系:

  • 碰撞抵抗性 \Rightarrow 第二原像抵抗性(无条件成立)
  • 第二原像抵抗性 \Rightarrow 原像抵抗性(在随机预言机模型下成立)
  • 原像抵抗性 ⇏\not\Rightarrow 第二原像抵抗性(不成立)
  • 第二原像抵抗性 ⇏\not\Rightarrow 碰撞抵抗性(不成立)

实际意义

  • 碰撞抵抗性是最强的性质
  • 设计哈希函数时,通常直接证明碰撞抵抗性
  • 如果哈希函数是碰撞抵抗的,则自动满足其他两个性质

题型四:计算题

题目 12:Diffie-Hellman 密钥协商完整计算

题目: 给定 Diffie-Hellman 参数:

  • p=23p = 23g=5g = 555Z23\mathbb{Z}_{23}^* 的生成元)
  • Alice 选择私钥 a=6a = 6
  • Bob 选择私钥 b=15b = 15

请完成: (1)计算 Alice 和 Bob 的公钥 (2)计算双方计算的共享密钥 (3)验证双方得到的密钥相同 (4)直接计算 gabg^{ab} 验证结果

完整解答

(1)计算 Alice 和 Bob 的公钥

Alice 的公钥A=gamodp=56mod23A = g^a \bmod p = 5^6 \bmod 23

计算 56mod235^6 \bmod 23

  • 52=25mod23=2523=25^2 = 25 \bmod 23 = 25 - 23 = 2
  • 54=(52)2=22=4mod23=45^4 = (5^2)^2 = 2^2 = 4 \bmod 23 = 4
  • 56=54×52=4×2=8mod23=85^6 = 5^4 \times 5^2 = 4 \times 2 = 8 \bmod 23 = 8

因此 A=8A = 8

Bob 的公钥B=gbmodp=515mod23B = g^b \bmod p = 5^{15} \bmod 23

计算 515mod235^{15} \bmod 23

  • 15=8+4+2+1=23+22+21+2015 = 8 + 4 + 2 + 1 = 2^3 + 2^2 + 2^1 + 2^0
  • 51=55^1 = 5
  • 52=25^2 = 2(已计算)
  • 54=45^4 = 4(已计算)
  • 58=(54)2=42=16mod23=165^8 = (5^4)^2 = 4^2 = 16 \bmod 23 = 16
  • 515=58×54×52×51=16×4×2×5=640mod235^{15} = 5^8 \times 5^4 \times 5^2 \times 5^1 = 16 \times 4 \times 2 \times 5 = 640 \bmod 23

计算 640mod23640 \bmod 23

  • 23×27=62123 \times 27 = 621
  • 640621=19640 - 621 = 19

因此 B=19B = 19

(2)计算双方计算的共享密钥

Alice 计算的共享密钥KA=Bamodp=196mod23K_A = B^a \bmod p = 19^6 \bmod 23

计算 196mod2319^6 \bmod 23

  • 19mod23=1919 \bmod 23 = 19(因为 19<2319 < 23
  • 192=361mod23=36115×23=361345=1619^2 = 361 \bmod 23 = 361 - 15 \times 23 = 361 - 345 = 16
  • 194=(192)2=162=256mod23=25611×23=256253=319^4 = (19^2)^2 = 16^2 = 256 \bmod 23 = 256 - 11 \times 23 = 256 - 253 = 3
  • 196=194×192=3×16=48mod23=482×23=4846=219^6 = 19^4 \times 19^2 = 3 \times 16 = 48 \bmod 23 = 48 - 2 \times 23 = 48 - 46 = 2

因此 KA=2K_A = 2

Bob 计算的共享密钥KB=Abmodp=815mod23K_B = A^b \bmod p = 8^{15} \bmod 23

计算 815mod238^{15} \bmod 23

  • 81=88^1 = 8
  • 82=64mod23=642×23=6446=188^2 = 64 \bmod 23 = 64 - 2 \times 23 = 64 - 46 = 18
  • 84=(82)2=182=324mod23=32414×23=324322=28^4 = (8^2)^2 = 18^2 = 324 \bmod 23 = 324 - 14 \times 23 = 324 - 322 = 2
  • 88=(84)2=22=4mod23=48^8 = (8^4)^2 = 2^2 = 4 \bmod 23 = 4
  • 15=8+4+2+115 = 8 + 4 + 2 + 1
  • 815=88×84×82×81=4×2×18×8=1152mod238^{15} = 8^8 \times 8^4 \times 8^2 \times 8^1 = 4 \times 2 \times 18 \times 8 = 1152 \bmod 23

计算 1152mod231152 \bmod 23

  • 23×50=115023 \times 50 = 1150
  • 11521150=21152 - 1150 = 2

因此 KB=2K_B = 2

(3)验证双方得到的密钥相同

  • Alice 计算的密钥:KA=2K_A = 2
  • Bob 计算的密钥:KB=2K_B = 2
  • KA=KB=2K_A = K_B = 2

共享密钥K=2K = 2

(4)直接计算 gabg^{ab} 验证结果

gab=56×15=590mod23g^{ab} = 5^{6 \times 15} = 5^{90} \bmod 23

由于 5221(mod23)5^{22} \equiv 1 \pmod{23}(根据费马小定理,因为 552323 互素,且 55 的阶整除 2222),我们可以简化:

  • 90=4×22+290 = 4 \times 22 + 2
  • 590=(522)4×5214×22(mod23)5^{90} = (5^{22})^4 \times 5^2 \equiv 1^4 \times 2 \equiv 2 \pmod{23}

因此 gab=2g^{ab} = 2,与之前计算的结果一致 ✓

验证完成!


题目 13:椭圆曲线点运算完整计算

题目: 给定椭圆曲线 E:y2=x3+2x+3(mod11)E: y^2 = x^3 + 2x + 3 \pmod{11},点 P=(2,2)P = (2, 2)

请完成: (1)验证点 PP 在曲线上 (2)计算 2P2P(点倍乘) (3)如果 Q=(3,6)Q = (3, 6) 也在曲线上,计算 P+QP + Q(点加)

完整解答

(1)验证点 PP 在曲线上

曲线方程y2=x3+2x+3(mod11)y^2 = x^3 + 2x + 3 \pmod{11}

P=(2,2)P = (2, 2)

  • 左边:y2=22=4mod11=4y^2 = 2^2 = 4 \bmod 11 = 4
  • 右边:x3+2x+3=23+2×2+3=8+4+3=15mod11=4x^3 + 2x + 3 = 2^3 + 2 \times 2 + 3 = 8 + 4 + 3 = 15 \bmod 11 = 4

4=44 = 4 ✓,因此点 P=(2,2)P = (2, 2) 在曲线上。

(2)计算 2P2P(点倍乘)

点倍乘公式P=PP = P):

  • 斜率:λ=3x12+a2y1modp\lambda = \frac{3x_1^2 + a}{2y_1} \bmod p
  • x3=λ22x1modpx_3 = \lambda^2 - 2x_1 \bmod p
  • y3=λ(x1x3)y1modpy_3 = \lambda(x_1 - x_3) - y_1 \bmod p

给定参数

  • P=(x1,y1)=(2,2)P = (x_1, y_1) = (2, 2)
  • a=2a = 2(曲线参数)
  • p=11p = 11

计算斜率 λ\lambdaλ=3x12+a2y1modp=3×22+22×2mod11=3×4+24mod11=144mod11\lambda = \frac{3x_1^2 + a}{2y_1} \bmod p = \frac{3 \times 2^2 + 2}{2 \times 2} \bmod 11 = \frac{3 \times 4 + 2}{4} \bmod 11 = \frac{14}{4} \bmod 11

计算 41mod114^{-1} \bmod 11

  • 需要 4d1(mod11)4d \equiv 1 \pmod{11}
  • 4×3=121(mod11)4 \times 3 = 12 \equiv 1 \pmod{11},所以 41=34^{-1} = 3

因此 λ=14×3mod11=42mod11=423×11=4233=9\lambda = 14 \times 3 \bmod 11 = 42 \bmod 11 = 42 - 3 \times 11 = 42 - 33 = 9

计算 x3x_3x3=λ22x1modp=922×2mod11=814mod11=77mod11=0x_3 = \lambda^2 - 2x_1 \bmod p = 9^2 - 2 \times 2 \bmod 11 = 81 - 4 \bmod 11 = 77 \bmod 11 = 0

计算 y3y_3y3=λ(x1x3)y1modp=9(20)2mod11=182mod11=16mod11=5y_3 = \lambda(x_1 - x_3) - y_1 \bmod p = 9(2 - 0) - 2 \bmod 11 = 18 - 2 \bmod 11 = 16 \bmod 11 = 5

因此 2P=(0,5)2P = (0, 5)

验证:检查 (0,5)(0, 5) 是否在曲线上

  • 左边:y2=52=25mod11=3y^2 = 5^2 = 25 \bmod 11 = 3
  • 右边:x3+2x+3=0+0+3=3mod11=3x^3 + 2x + 3 = 0 + 0 + 3 = 3 \bmod 11 = 3
  • 3=33 = 3

(3)计算 P+QP + Q(点加)

首先验证 Q=(3,6)Q = (3, 6) 在曲线上

  • 左边:y2=62=36mod11=3y^2 = 6^2 = 36 \bmod 11 = 3
  • 右边:x3+2x+3=33+2×3+3=27+6+3=36mod11=3x^3 + 2x + 3 = 3^3 + 2 \times 3 + 3 = 27 + 6 + 3 = 36 \bmod 11 = 3
  • 3=33 = 3 ✓,QQ 在曲线上

点加公式PQP \neq Q):

  • 斜率:λ=y2y1x2x1modp\lambda = \frac{y_2 - y_1}{x_2 - x_1} \bmod p
  • x3=λ2x1x2modpx_3 = \lambda^2 - x_1 - x_2 \bmod p
  • y3=λ(x1x3)y1modpy_3 = \lambda(x_1 - x_3) - y_1 \bmod p

给定参数

  • P=(x1,y1)=(2,2)P = (x_1, y_1) = (2, 2)
  • Q=(x2,y2)=(3,6)Q = (x_2, y_2) = (3, 6)
  • p=11p = 11

计算斜率 λ\lambdaλ=y2y1x2x1modp=6232mod11=41mod11=4\lambda = \frac{y_2 - y_1}{x_2 - x_1} \bmod p = \frac{6 - 2}{3 - 2} \bmod 11 = \frac{4}{1} \bmod 11 = 4

计算 x3x_3x3=λ2x1x2modp=4223mod11=165mod11=11mod11=0x_3 = \lambda^2 - x_1 - x_2 \bmod p = 4^2 - 2 - 3 \bmod 11 = 16 - 5 \bmod 11 = 11 \bmod 11 = 0

计算 y3y_3y3=λ(x1x3)y1modp=4(20)2mod11=82mod11=6y_3 = \lambda(x_1 - x_3) - y_1 \bmod p = 4(2 - 0) - 2 \bmod 11 = 8 - 2 \bmod 11 = 6

因此 P+Q=(0,6)P + Q = (0, 6)

验证:检查 (0,6)(0, 6) 是否在曲线上

  • 左边:y2=62=36mod11=3y^2 = 6^2 = 36 \bmod 11 = 3
  • 右边:x3+2x+3=0+0+3=3mod11=3x^3 + 2x + 3 = 0 + 0 + 3 = 3 \bmod 11 = 3
  • 3=33 = 3

所有计算完成!


第三部分:数字签名

题型一:概念解释题

题目 14:解释数字签名的 EU-CMA 安全模型

题目: 请详细解释数字签名的 EU-CMA(Existential Unforgeability under Chosen Message Attack)安全模型,包括: (1)EU-CMA 游戏的定义 (2)存在性不可伪造性的含义 (3)适应性选择消息攻击的含义 (4)为什么这个安全模型是合理的

完整解答

(1)EU-CMA 游戏的定义

EU-CMA 安全游戏是一个交互式游戏,用于定义数字签名的安全性:

游戏参与者

  • 挑战者(Challenger):运行签名方案,生成密钥对
  • 攻击者(Attacker):试图伪造签名

游戏步骤

  1. 初始化阶段

    • 挑战者生成密钥对:(pk,sk)Gen(1n)(pk, sk) \leftarrow Gen(1^n)
    • 挑战者将公钥 pkpk 发送给攻击者
    • 私钥 sksk 保密
  2. 学习阶段

    • 攻击者可以查询签名预言机 Signsk()Sign_{sk}(\cdot) 任意多项式次
    • 对于每次查询消息 mim_i,攻击者获得签名 σi=Signsk(mi)\sigma_i = Sign_{sk}(m_i)
    • 攻击者获得签名对:(m1,σ1),(m2,σ2),,(mq,σq)(m_1, \sigma_1), (m_2, \sigma_2), \ldots, (m_q, \sigma_q)
    • 其中 qq 是多项式有界的查询次数
  3. 伪造阶段

    • 攻击者输出伪造:(m,σ)(m^*, \sigma^*)
    • 要求:m{m1,m2,,mq}m^* \notin \{m_1, m_2, \ldots, m_q\}mm^* 不是查询过的消息)
  4. 判定阶段

    • 挑战者验证:Verifypk(m,σ)Verify_{pk}(m^*, \sigma^*)
    • 如果验证通过(输出 1),则攻击者获胜,游戏输出 1
    • 否则攻击者失败,游戏输出 0

攻击者的优势AdvEUCMA(A)=Pr[EU-CMA-Game(A)=1]\text{Adv}_{EU-CMA}(A) = \Pr[\text{EU-CMA-Game}(A) = 1]

(2)存在性不可伪造性的含义

存在性不可伪造性(Existential Unforgeability)

  • 攻击者无法为任何消息生成有效签名
  • 即使该消息可能是无意义的、随机的或攻击者自己构造的
  • 只要攻击者没有查询过该消息的签名,就无法伪造

与强不可伪造性的区别

  • 存在性不可伪造性:攻击者无法为新的消息伪造签名
  • 强不可伪造性:攻击者即使看到消息 mm 的签名 σ\sigma,也无法生成该消息的另一个有效签名 σσ\sigma' \neq \sigma

实际意义

  • 存在性不可伪造性已经足够强,因为攻击者无法伪造任何新消息的签名
  • 这保证了数字签名的基本安全目标

(3)适应性选择消息攻击的含义

适应性选择消息攻击(Adaptive Chosen Message Attack, CMA)

  • 攻击者可以自适应地选择要查询签名的消息
  • 攻击者可以根据之前查询的结果,选择下一个要查询的消息
  • 这模拟了现实场景中攻击者可以观察签名并据此选择攻击策略

为什么是"适应性"的

  • 攻击者不需要一次性提交所有要查询的消息
  • 可以基于之前的查询结果,动态选择下一个消息
  • 这使得攻击更强大,安全模型更严格

与其他攻击模型的比较

  • 已知消息攻击(Known Message Attack):攻击者只能看到随机的消息-签名对,不能选择消息
  • 选择消息攻击(Chosen Message Attack):攻击者可以选择消息,但必须一次性提交所有消息(非适应性)
  • 适应性选择消息攻击(Adaptive CMA):攻击者可以自适应地选择消息(最强)

(4)为什么这个安全模型是合理的

合理性分析

  1. 模拟现实攻击场景

    • 在现实中,攻击者可能能够获得某些消息的签名
    • 攻击者可以根据观察到的签名,选择攻击策略
    • EU-CMA 模型准确模拟了这种场景
  2. 足够强的安全保证

    • 即使攻击者获得了许多消息的签名,仍然无法伪造新消息的签名
    • 这保证了数字签名的核心安全目标:不可伪造性
  3. 实际应用的安全性

    • 如果数字签名方案是 EU-CMA 安全的,则在实际应用中,即使攻击者观察到许多签名,也无法伪造
    • 这适用于大多数实际应用场景
  4. 与其他安全目标的关系

    • EU-CMA 安全是数字签名的基本安全要求
    • 更强的安全模型(如强不可伪造性)在某些特殊场景中需要,但 EU-CMA 已经足够

总结

  • EU-CMA 安全模型是数字签名方案的标准安全定义
  • 它准确模拟了现实攻击场景
  • 提供了足够强的安全保证
  • 是评估数字签名方案安全性的合理标准

题型二:方案设计题

题目 15:设计一个安全的文件共享方案

题目: 设计一个安全的文件共享方案,满足以下要求:

  1. 文件大小为 10GB(很大)
  2. 支付信息保密(Payment - No one knows)
  3. 文件完整性(Integrity)
  4. 只有 Bob 可以检查文件内容

请: (1)选择合适的密码学工具 (2)详细说明方案的工作过程 (3)说明方案如何满足每个要求

完整解答

(1)选择合适的密码学工具

根据要求分析:

  • 大文件(10GB):需要使用高效的对称加密
  • 支付信息保密:需要使用公钥加密保护密钥
  • 完整性:需要使用哈希函数或 MAC
  • 只有 Bob 能访问:需要使用 Bob 的公钥加密

选择的工具

  • 对称加密:AES-256-CTR 模式(适合大文件,支持并行)
  • 公钥加密:RSA-OAEP 或 Elgamal(用于加密对称密钥)
  • 哈希函数:SHA-256(用于完整性验证)
  • 数字签名(可选):用于认证发送方

(2)详细方案设计

方案:混合加密 + 哈希验证

步骤 1:发送方(Alice)准备文件

  1. 生成对称密钥

    • 随机生成对称密钥:k{0,1}256k \leftarrow \{0,1\}^{256}(AES-256 密钥)
    • 选择随机 IV:IV{0,1}128IV \leftarrow \{0,1\}^{128}
  2. 加密文件

    • 将 10GB 文件 FF 分割成块:F1,F2,,FnF_1, F_2, \ldots, F_n(每块 128 位)
    • 使用 AES-CTR 模式加密:
      • 对每个块:Ci=FiAESk(IV+i)C_i = F_i \oplus AES_k(IV + i)
      • 密文文件:C=C1C2CnC = C_1 || C_2 || \ldots || C_n
  3. 计算文件哈希

    • 计算原始文件的哈希值:h=SHA256(F)h = SHA256(F)
    • 这用于完整性验证
  4. 加密对称密钥

    • 使用 Bob 的公钥加密:Kenc=RSA-OAEPpkB(kIV)K_{enc} = RSA\text{-}OAEP_{pk_B}(k || IV)
    • 只有 Bob 能解密获得 kkIVIV
  5. (可选)签名哈希值

    • 使用 Alice 的私钥签名:σ=SignskA(h)\sigma = Sign_{sk_A}(h)
    • 用于认证文件来源

步骤 2:发送 Alice 发送给 Bob:

  • 加密文件:CC(10GB)
  • 加密的密钥:KencK_{enc}
  • 文件哈希值:hh
  • (可选)签名:σ\sigma

步骤 3:接收方(Bob)验证和解密

  1. 解密密钥

    • 使用 Bob 的私钥解密:(kIV)=RSA-OAEPskB1(Kenc)(k || IV) = RSA\text{-}OAEP_{sk_B}^{-1}(K_{enc})
    • 只有 Bob 拥有 skBsk_B,只有 Bob 能解密
  2. 解密文件

    • 使用 AES-CTR 解密:
      • 对每个块:Fi=CiAESk(IV+i)F_i = C_i \oplus AES_k(IV + i)
      • 恢复文件:F=F1F2FnF = F_1 || F_2 || \ldots || F_n
  3. 验证完整性

    • 计算接收文件的哈希值:h=SHA256(F)h' = SHA256(F)
    • 检查 h=hh' = h
    • 如果相等,文件完整;否则文件被篡改
  4. (可选)验证签名

    • 验证 VerifypkA(h,σ)Verify_{pk_A}(h, \sigma)
    • 确认文件来自 Alice

(3)说明如何满足每个要求

要求 1:文件大小为 10GB(很大)

  • 解决方案:使用对称加密(AES-CTR)
    • 对称加密速度快,适合大文件
    • CTR 模式支持并行加密/解密
    • 10GB 文件可以高效处理
  • 为什么不用公钥加密直接加密文件
    • 公钥加密速度慢(比对称加密慢 100-1000 倍)
    • RSA 只能加密小于模数的数据(通常 2048 位)
    • 因此使用混合加密:公钥加密小密钥(256 位),对称加密大文件(10GB)

要求 2:支付信息保密(Payment - No one knows)

  • 解决方案:使用 Bob 的公钥加密对称密钥
    • 对称密钥 kk 使用 Bob 的公钥 pkBpk_B 加密
    • 只有 Bob 拥有私钥 skBsk_B,只有 Bob 能解密 KencK_{enc} 获得 kk
    • 没有 kk,无法解密文件 CC
    • 因此,除了 Bob,没有人能知道文件内容(包括支付信息)
  • 安全性保证
    • RSA-OAEP 是 CPA 安全的
    • 即使攻击者截获 KencK_{enc},也无法解密(除非能破解 RSA)
    • 即使攻击者截获加密文件 CC,没有 kk 也无法解密

要求 3:文件完整性(Integrity)

  • 解决方案:使用哈希函数验证完整性
    • Alice 计算原始文件的哈希值 h=SHA256(F)h = SHA256(F)
    • Bob 解密后计算接收文件的哈希值 h=SHA256(F)h' = SHA256(F')
    • 如果 h=hh' = h,则文件完整;否则文件被篡改
  • 安全性保证
    • SHA-256 具有碰撞抵抗性
    • 攻击者无法找到不同的文件产生相同的哈希值
    • 因此可以检测到任何篡改
  • 如果文件被篡改
    • 攻击者修改 CC 得到 CC'
    • Bob 解密得到 FFF' \neq F
    • 计算 h=SHA256(F)hh' = SHA256(F') \neq h
    • 验证失败,Bob 知道文件被篡改

要求 4:只有 Bob 可以检查文件内容

  • 解决方案:使用 Bob 的公钥加密
    • 对称密钥 kk 使用 Bob 的公钥 pkBpk_B 加密
    • 只有 Bob 拥有私钥 skBsk_B,只有 Bob 能解密获得 kk
    • 没有 kk,无法解密文件
  • 安全性保证
    • 公钥加密确保只有私钥持有者(Bob)能解密
    • 即使攻击者截获所有传输数据(CCKencK_{enc}hh),也无法获得文件内容
    • 这提供了访问控制

方案总结

  • ✅ 满足大文件要求:使用高效的对称加密(AES-CTR)
  • ✅ 满足保密性要求:使用公钥加密保护密钥(RSA-OAEP)
  • ✅ 满足完整性要求:使用哈希函数验证(SHA-256)
  • ✅ 满足访问控制要求:只有 Bob 能解密(使用 Bob 的公钥)

安全性分析

  • 机密性:通过 RSA-OAEP 和 AES-CTR 保证
  • 完整性:通过 SHA-256 哈希验证保证
  • 认证性(可选):通过数字签名保证
  • 访问控制:通过公钥加密保证只有 Bob 能访问

题型三:证明题

题目 16:证明 CBC 模式在 CPA 下的安全性(简化证明)

题目: 请证明 CBC(Cipher Block Chaining)模式在 CPA(Chosen Plaintext Attack)下是语义安全的。

要求: (1)给出证明假设 (2)使用游戏跳跃技术(Game Hopping) (3)分析每个游戏之间的差异 (4)得出结论

完整解答

(1)证明假设

假设

  1. 底层分组密码 EkE_k 是伪随机置换(PRP)
  2. 初始化向量 IVIV 是随机选择的(每次加密都不同)

CBC 模式回顾

  • 加密:C0=IVC_0 = IVCi=Ek(PiCi1)C_i = E_k(P_i \oplus C_{i-1}) 对于 i1i \geq 1
  • 解密:Pi=Dk(Ci)Ci1P_i = D_k(C_i) \oplus C_{i-1}

(2)使用游戏跳跃技术证明

**游戏跳跃(Game Hopping)**是一种证明技术,通过一系列游戏来证明安全性,每个游戏与前一个游戏只有微小差异。

游戏 0(真实 CBC 模式)

  1. 挑战者生成密钥 kGen(1n)k \leftarrow Gen(1^n)
  2. 攻击者查询加密预言机,获得 (mi,EncCBC(mi))(m_i, Enc_{CBC}(m_i))
  3. 攻击者选择 (m0,m1)(m_0, m_1),获得挑战密文 c=EncCBC(mb)c^* = Enc_{CBC}(m_b)
  4. 攻击者输出 bb'

游戏 1(使用随机置换代替分组密码)

  1. 挑战者选择随机置换 π\pi(而不是使用 EkE_k
  2. 加密使用:Ci=π(PiCi1)C_i = \pi(P_i \oplus C_{i-1})
  3. 其他步骤与游戏 0 相同

游戏 2(使用真正的随机函数)

  1. 挑战者选择真正的随机函数 ff(而不是置换)
  2. 加密使用:Ci=f(PiCi1)C_i = f(P_i \oplus C_{i-1})
  3. 其他步骤与游戏 1 相同

游戏 3(理想情况)

  1. 挑战者直接输出随机密文(不依赖明文)
  2. 攻击者无法获得任何关于 mbm_b 的信息

(3)分析每个游戏之间的差异

游戏 0 到游戏 1 的差异

  • 使用随机置换 π\pi 代替 EkE_k
  • 如果 EkE_k 是 PRP,则游戏 0 和游戏 1 在计算上不可区分
  • 差异:Pr[Game0]Pr[Game1]ϵPRP(n)|\Pr[Game_0] - \Pr[Game_1]| \leq \epsilon_{PRP}(n)(可忽略)

游戏 1 到游戏 2 的差异

  • 使用随机函数 ff 代替随机置换 π\pi
  • 由于置换和函数的区别很小(生日悖论),差异可忽略
  • 差异:Pr[Game1]Pr[Game2]ϵbirthday(n)|\Pr[Game_1] - \Pr[Game_2]| \leq \epsilon_{birthday}(n)(可忽略)

游戏 2 到游戏 3 的差异

  • 在游戏 2 中,如果 IVIV 是随机的,则每个块的输入 PiCi1P_i \oplus C_{i-1} 看起来是随机的
  • 随机函数 ff 的输出也看起来是随机的
  • 因此,整个密文看起来是随机的,不依赖明文
  • 差异:Pr[Game2]Pr[Game3]ϵrandom(n)|\Pr[Game_2] - \Pr[Game_3]| \leq \epsilon_{random}(n)(可忽略)

(4)得出结论

攻击者在游戏 3 中的优势

  • 在游戏 3 中,密文是完全随机的,不包含任何关于 mbm_b 的信息
  • 攻击者的优势:AdvGame3(A)=0\text{Adv}_{Game_3}(A) = 0(无法区分)

攻击者在游戏 0 中的优势AdvGame0(A)AdvGame3(A)+ϵPRP+ϵbirthday+ϵrandom\text{Adv}_{Game_0}(A) \leq \text{Adv}_{Game_3}(A) + \epsilon_{PRP} + \epsilon_{birthday} + \epsilon_{random} =0+ϵPRP+ϵbirthday+ϵrandom= 0 + \epsilon_{PRP} + \epsilon_{birthday} + \epsilon_{random} =ϵ(n)= \epsilon(n)(可忽略函数)

结论

  • 如果底层分组密码 EkE_k 是 PRP,且 IVIV 是随机的
  • 则 CBC 模式在 CPA 下是语义安全的
  • 攻击者的优势是可忽略的

重要条件

  • IVIV 必须是随机的(每次加密都不同)
  • 如果 IVIV 是固定的或可预测的,CBC 模式不安全

题型四:计算题

题目 17:RSA-FDH 签名完整计算

题目: 给定 RSA-FDH 参数:

  • p=17p = 17q=19q = 19
  • 公钥指数 e=5e = 5
  • 消息 m="Hello"m = "Hello",假设 H("Hello")=100H("Hello") = 100

请完成: (1)计算密钥对 (2)生成签名 σ\sigma (3)验证签名

完整解答

(1)计算密钥对

模数n=p×q=17×19=323n = p \times q = 17 \times 19 = 323

欧拉函数ϕ(n)=(p1)(q1)=16×18=288\phi(n) = (p-1)(q-1) = 16 \times 18 = 288

验证 eeϕ(n)\phi(n) 互素

  • gcd(5,288)=1\gcd(5, 288) = 1 ✓(因为 5 是素数,且 5 不整除 288)

计算私钥指数 dd: 需要 5d1(mod288)5d \equiv 1 \pmod{288}

使用扩展欧几里得算法:

  • 288=5×57+3288 = 5 \times 57 + 3
  • 5=3×1+25 = 3 \times 1 + 2
  • 3=2×1+13 = 2 \times 1 + 1
  • 2=1×2+02 = 1 \times 2 + 0

回代:

  • 1=32×11 = 3 - 2 \times 1
  • 2=53×12 = 5 - 3 \times 1
  • 1=3(53)=2×351 = 3 - (5 - 3) = 2 \times 3 - 5
  • 3=2885×573 = 288 - 5 \times 57
  • 1=2×(2885×57)5=2×288115×51 = 2 \times (288 - 5 \times 57) - 5 = 2 \times 288 - 115 \times 5

因此 d=115mod288=288115=173d = -115 \bmod 288 = 288 - 115 = 173

验证:5×173=8651(mod288)5 \times 173 = 865 \equiv 1 \pmod{288}

密钥对

  • 公钥:pk=(n,e)=(323,5)pk = (n, e) = (323, 5)
  • 私钥:sk=(n,d)=(323,173)sk = (n, d) = (323, 173)

(2)生成签名 σ\sigma

消息哈希h=H("Hello")=100h = H("Hello") = 100

检查范围100<323100 < 323 ✓(在有效范围内)

计算签名σ=hdmodn=100173mod323\sigma = h^d \bmod n = 100^{173} \bmod 323

使用模幂算法

将指数 173 表示为二进制:173=101011012=128+32+8+4+1173 = 10101101_2 = 128 + 32 + 8 + 4 + 1

计算 1002imod323100^{2^i} \bmod 323

  • 1001=100mod323=100100^1 = 100 \bmod 323 = 100
  • 1002=10000mod323=1000030×323=100009690=310100^2 = 10000 \bmod 323 = 10000 - 30 \times 323 = 10000 - 9690 = 310
  • 1004=(1002)2=3102=96100mod323=96100297×323=9610095931=169100^4 = (100^2)^2 = 310^2 = 96100 \bmod 323 = 96100 - 297 \times 323 = 96100 - 95931 = 169
  • 1008=(1004)2=1692=28561mod323=2856188×323=2856128424=137100^8 = (100^4)^2 = 169^2 = 28561 \bmod 323 = 28561 - 88 \times 323 = 28561 - 28424 = 137
  • 10016=(1008)2=1372=18769mod323=1876958×323=1876918734=35100^{16} = (100^8)^2 = 137^2 = 18769 \bmod 323 = 18769 - 58 \times 323 = 18769 - 18734 = 35
  • 10032=(10016)2=352=1225mod323=12253×323=1225969=256100^{32} = (100^{16})^2 = 35^2 = 1225 \bmod 323 = 1225 - 3 \times 323 = 1225 - 969 = 256
  • 10064=(10032)2=2562=65536mod323=65536202×323=6553665246=290100^{64} = (100^{32})^2 = 256^2 = 65536 \bmod 323 = 65536 - 202 \times 323 = 65536 - 65246 = 290
  • 100128=(10064)2=2902=84100mod323=84100260×323=8410083980=120100^{128} = (100^{64})^2 = 290^2 = 84100 \bmod 323 = 84100 - 260 \times 323 = 84100 - 83980 = 120

计算 100173100^{173}100173=100128×10032×1008×1004×1001100^{173} = 100^{128} \times 100^{32} \times 100^8 \times 100^4 \times 100^1 =120×256×137×169×100mod323= 120 \times 256 \times 137 \times 169 \times 100 \bmod 323

逐步计算:

  • 120×256=30720mod323=3072095×323=3072030685=35120 \times 256 = 30720 \bmod 323 = 30720 - 95 \times 323 = 30720 - 30685 = 35
  • 35×137=4795mod323=479514×323=47954522=27335 \times 137 = 4795 \bmod 323 = 4795 - 14 \times 323 = 4795 - 4522 = 273
  • 273×169=46137mod323=46137142×323=4613745866=271273 \times 169 = 46137 \bmod 323 = 46137 - 142 \times 323 = 46137 - 45866 = 271
  • 271×100=27100mod323=2710083×323=2710026809=291271 \times 100 = 27100 \bmod 323 = 27100 - 83 \times 323 = 27100 - 26809 = 291

因此 σ=291\sigma = 291

(3)验证签名

公钥(n,e)=(323,5)(n, e) = (323, 5) 消息哈希h=100h = 100 签名σ=291\sigma = 291

验证:检查 hσe(modn)h \equiv \sigma^e \pmod{n},即 1002915(mod323)100 \equiv 291^5 \pmod{323}

计算 2915mod323291^5 \bmod 323

  • 2912=84681mod323=84681262×323=8468184626=55291^2 = 84681 \bmod 323 = 84681 - 262 \times 323 = 84681 - 84626 = 55
  • 2914=(2912)2=552=3025mod323=30259×323=30252907=118291^4 = (291^2)^2 = 55^2 = 3025 \bmod 323 = 3025 - 9 \times 323 = 3025 - 2907 = 118
  • 2915=2914×2911=118×291=34338mod323291^5 = 291^4 \times 291^1 = 118 \times 291 = 34338 \bmod 323

计算 34338mod32334338 \bmod 323

  • 323×106=34238323 \times 106 = 34238
  • 3433834238=10034338 - 34238 = 100

因此 2915100(mod323)291^5 \equiv 100 \pmod{323}

验证通过!签名有效!


第四部分:高级主题

题型一:概念解释题

题目 18:解释零知识证明的三个性质

题目: 请详细解释零知识证明(Zero Knowledge Proof)的三个性质: (1)完备性(Completeness) (2)可靠性(Soundness) (3)零知识性(Zero-Knowledge)

并说明每个性质的实际意义。

完整解答

(1)完备性(Completeness)

定义: 如果证明者确实知道秘密(或陈述为真),则诚实的验证者总是接受证明。

形式化定义Pr[Verifier acceptsProver knows secret]=1\Pr[\text{Verifier accepts} | \text{Prover knows secret}] = 1

直观理解

  • 如果证明者真的知道秘密,并且诚实地执行协议
  • 验证者应该总是接受证明(不会错误地拒绝)
  • 这保证了协议的"可用性":诚实的证明者能够成功证明

实际意义

  • 如果完备性不满足,即使证明者知道秘密,也可能被拒绝
  • 这会导致协议不可用
  • 完备性保证了"真陈述总能被证明"

例子: 在离散对数的零知识证明中:

  • 如果证明者知道 xx 使得 y=gxy = g^x
  • 并且诚实地执行协议(计算正确的响应 z=r+cxz = r + cx
  • 则验证者总是接受(因为 gz=grycg^z = g^r \cdot y^c

(2)可靠性(Soundness)

定义: 如果证明者不知道秘密(或陈述为假),则验证者以高概率拒绝证明。

形式化定义Pr[Verifier acceptsProver doesn’t know secret]ϵ\Pr[\text{Verifier accepts} | \text{Prover doesn't know secret}] \leq \epsilon 其中 ϵ\epsilon 是可忽略函数。

直观理解

  • 如果证明者不知道秘密,但试图欺骗验证者
  • 验证者应该以高概率拒绝(不会错误地接受)
  • 这保证了协议的"安全性":不知道秘密的证明者无法通过验证

实际意义

  • 如果可靠性不满足,不知道秘密的证明者可能通过验证
  • 这会导致协议不安全
  • 可靠性保证了"假陈述几乎总是被拒绝"

例子: 在离散对数的零知识证明中:

  • 如果证明者不知道 xx,无法计算正确的响应 zz
  • 验证者检查 gz=Rycg^z = R \cdot y^c 会失败
  • 验证者以高概率拒绝

(3)零知识性(Zero-Knowledge)

定义: 验证者从证明过程中无法获得关于秘密的任何信息(除了证明者知道秘密这一事实)。

形式化定义(模拟器定义): 存在模拟器 SS,可以在不知道秘密的情况下生成与真实证明不可区分的证明记录。

直观理解

  • 验证者只能知道"证明者知道秘密"这一事实
  • 无法获得秘密本身或关于秘密的任何其他信息
  • 这保证了协议的"隐私性"

实际意义

  • 如果零知识性不满足,验证者可能从证明过程中提取秘密信息
  • 这会导致隐私泄露
  • 零知识性保证了"除了陈述为真,不泄露其他信息"

例子: 在离散对数的零知识证明中:

  • 验证者看到 (R,c,z)(R, c, z)
  • 但无法从这些值中提取 xx 的信息
  • 因为 RR 是随机的,cc 是验证者自己选择的,zz 依赖于随机数 rr

三个性质的关系

  • 完备性:保证协议可用(真陈述能被证明)
  • 可靠性:保证协议安全(假陈述被拒绝)
  • 零知识性:保证协议隐私(不泄露秘密信息)

三者缺一不可

  • 只有完备性:协议可用但不安全
  • 只有可靠性:协议安全但可能不可用
  • 只有零知识性:协议隐私但可能不安全
  • 三者都满足:协议既可用、又安全、又保护隐私

题型二:方案设计题

题目 19:设计基于同态加密的投票方案

题目: 设计一个使用同态加密的电子投票方案,满足以下要求:

  1. 每个投票者只能投票一次
  2. 投票是保密的(没有人知道具体投票内容)
  3. 可以正确统计投票结果
  4. 如果有人撒谎(投票值不在允许范围内),使用零知识证明证明

请: (1)选择合适的密码学工具 (2)详细描述投票流程 (3)说明如何检测和证明投票值不在 {0,1}\{0,1\} 范围内

完整解答

(1)选择合适的密码学工具

根据要求,需要以下工具:

  • 同态加密:Elgamal 加密(支持乘法同态,可用于统计)
  • 零知识证明:Sigma 协议(用于证明投票值在允许范围内)
  • 数字签名:用于认证投票者身份
  • 哈希函数:用于计算挑战

具体选择

  • 同态加密:Elgamal 加密(Enc(b)=(gr,gbyr)Enc(b) = (g^r, g^b \cdot y^r),其中 b{0,1}b \in \{0,1\}
  • 零知识证明:OR 证明(证明 b{0,1}b \in \{0,1\}
  • 数字签名:Schnorr 签名或 RSA-FDH
  • 哈希函数:SHA-256

(2)详细方案设计

方案:基于 Elgamal 同态加密的投票方案

设置阶段

  1. 选择 Elgamal 参数:大素数 pp,生成元 gZpg \in \mathbb{Z}_p^*
  2. 投票机构生成密钥对:私钥 xx,公钥 y=gxmodpy = g^x \bmod p
  3. 公开参数:(p,g,y)(p, g, y)

投票阶段(投票者 ViV_i):

  1. 身份认证

    • 投票者使用数字签名证明身份
    • 投票机构验证签名并检查是否已投票
  2. 选择投票

    • 投票者选择 b{0,1}b \in \{0, 1\}(0 = 反对,1 = 支持)
  3. 加密投票

    • 随机选择 rZp1r \leftarrow \mathbb{Z}_{p-1}
    • 计算:c1=grmodpc_1 = g^r \bmod p
    • 计算:c2=gbyrmodpc_2 = g^b \cdot y^r \bmod p
    • 密文:C=(c1,c2)C = (c_1, c_2)
  4. 零知识证明

    • 生成 ZK 证明,证明 b{0,1}b \in \{0, 1\}
    • 使用 OR 证明:证明知道 logg(c2/yr0)\log_g (c_2 / y^{r_0})logg(c2/yr1)\log_g (c_2 / y^{r_1}),其中 r0,r1r_0, r_1 是用于 b=0b=0b=1b=1 的随机数
  5. 提交

    • 投票者提交 (C,ZK proof,signature)(C, \text{ZK proof}, \text{signature})

统计阶段

  1. 验证所有投票

    • 验证每个投票者的身份(数字签名)
    • 验证每个投票的 ZK 证明(确保 b{0,1}b \in \{0,1\}
  2. 同态计算

    • 对于所有有效投票密文 Ci=(c1,i,c2,i)C_i = (c_{1,i}, c_{2,i}),计算:
    • Ctotal=i=1nCi=(i=1nc1,i,i=1nc2,i)C_{total} = \prod_{i=1}^n C_i = (\prod_{i=1}^n c_{1,i}, \prod_{i=1}^n c_{2,i})
    • 由于 Elgamal 的乘法同态性: Ctotal=(gri,gbiyri)C_{total} = (g^{\sum r_i}, g^{\sum b_i} \cdot y^{\sum r_i})
  3. 解密统计结果

    • 使用私钥 xx 解密 CtotalC_{total}
    • 计算:gbi=c2,total(c1,total)xmodpg^{\sum b_i} = c_{2,total} \cdot (c_{1,total})^{-x} \bmod p
    • 计算离散对数:bi=logg(gbi)\sum b_i = \log_g (g^{\sum b_i})(由于 bin\sum b_i \leq n,可以穷举)
    • 统计结果:支持票数 = bi\sum b_i,反对票数 = nbin - \sum b_i

(3)说明如何检测和证明投票值不在 {0,1}\{0,1\} 范围内

问题:如果有人撒谎,投票值 b{0,1}b \notin \{0,1\},如何检测?

解决方案:使用零知识证明

OR 证明构造

投票者需要证明:b{0,1}b \in \{0, 1\},即证明以下两个陈述之一为真:

  • 陈述 1:b=0b = 0,即 c2/yr=g0=1c_2 / y^r = g^0 = 1
  • 陈述 2:b=1b = 1,即 c2/yr=g1=gc_2 / y^r = g^1 = g

OR 证明步骤

  1. 对于 b=0b = 0 的情况(如果投票者真的选择 b=0b = 0):

    • 真实关系:c2=yrc_2 = y^r(因为 g0=1g^0 = 1
    • 证明者知道 rr,可以生成真实证明
    • 对于 b=1b = 1 的关系,生成模拟证明
  2. 对于 b=1b = 1 的情况(如果投票者真的选择 b=1b = 1):

    • 真实关系:c2=gyrc_2 = g \cdot y^r,即 c2/yr=gc_2 / y^r = g
    • 证明者知道 rr,可以生成真实证明
    • 对于 b=0b = 0 的关系,生成模拟证明
  3. 验证

    • 验证者检查 OR 证明是否有效
    • 如果 b{0,1}b \notin \{0,1\},投票者无法生成有效的 OR 证明
    • 验证者拒绝该投票

具体实现(简化):

投票者生成证明

  • 如果 b=0b = 0
    • 真实证明:证明知道 rr 使得 c2=yrc_2 = y^r(即 c2/yr=1c_2 / y^r = 1
    • 模拟证明:为 b=1b = 1 的情况生成模拟证明
  • 如果 b=1b = 1
    • 真实证明:证明知道 rr 使得 c2=gyrc_2 = g \cdot y^r(即 c2/yr=gc_2 / y^r = g
    • 模拟证明:为 b=0b = 0 的情况生成模拟证明

验证者验证

  • 验证 OR 证明的有效性
  • 如果证明无效,拒绝投票

如果有人撒谎(b{0,1}b \notin \{0,1\}

  • 投票者无法为 b=0b = 0b=1b = 1 生成真实证明
  • 只能生成两个模拟证明
  • 但模拟证明无法通过验证(因为挑战分配不正确)
  • 验证者检测到证明无效,拒绝投票

方案总结

  • ✅ 满足唯一性:数字签名防止重复投票
  • ✅ 满足保密性:Elgamal 加密保护投票内容
  • ✅ 满足正确性:同态加密支持正确统计
  • ✅ 满足可验证性:零知识证明确保投票值在允许范围内

题型三:证明题

题目 20:证明 AND 证明满足 Soundness 性质

题目: 证明零知识证明中的 AND 证明满足 Soundness 性质。

给定:证明者要证明知道 x1x_1x2x_2,使得 y1=g1x1y_1 = g_1^{x_1}y2=g2x2y_2 = g_2^{x_2}

请证明:如果证明者不知道 x1x_1x2x_2,则验证者以高概率拒绝证明。

完整解答

AND 证明协议回顾

协议步骤

  1. 承诺:证明者发送 (a1,a2)(a_1, a_2),其中 a1=g1r1a_1 = g_1^{r_1}a2=g2r2a_2 = g_2^{r_2}r1,r2Zqr_1, r_2 \leftarrow \mathbb{Z}_q
  2. 挑战:验证者发送 cZqc \leftarrow \mathbb{Z}_q
  3. 响应:证明者发送 (z1,z2)(z_1, z_2),其中 z1=r1+cx1modqz_1 = r_1 + cx_1 \bmod qz2=r2+cx2modqz_2 = r_2 + cx_2 \bmod q
  4. 验证:验证者检查 g1z1=a1y1cg_1^{z_1} = a_1 \cdot y_1^cg2z2=a2y2cg_2^{z_2} = a_2 \cdot y_2^c

(1)证明思路

使用反证法:假设存在攻击者能够以不可忽略的概率通过验证,即使不知道 x1x_1x2x_2。我们将证明这与离散对数问题的困难性矛盾。

(2)情况分析

情况 1:证明者不知道 x1x_1

假设证明者不知道 x1x_1,但知道 x2x_2

攻击者策略

  • 攻击者可以正确计算 z2=r2+cx2z_2 = r_2 + cx_2(因为知道 x2x_2
  • 但无法正确计算 z1=r1+cx1z_1 = r_1 + cx_1(因为不知道 x1x_1

验证失败分析

  • 验证者检查:g1z1=a1y1cg_1^{z_1} = a_1 \cdot y_1^c
  • 如果攻击者不知道 x1x_1,无法计算正确的 z1z_1
  • 假设攻击者猜测 z1z_1',则: g1z1a1y1c=g1r1(g1x1)c=g1r1+cx1g_1^{z_1'} \neq a_1 \cdot y_1^c = g_1^{r_1} \cdot (g_1^{x_1})^c = g_1^{r_1 + cx_1}
  • 验证失败的概率:Pr[验证失败]1ϵ\Pr[\text{验证失败}] \geq 1 - \epsilon,其中 ϵ\epsilon 是可忽略的

情况 2:证明者不知道 x2x_2

类似地,如果证明者不知道 x2x_2,无法正确计算 z2z_2,验证失败。

情况 3:证明者不知道 x1x_1x2x_2

如果证明者既不知道 x1x_1 也不知道 x2x_2,则无法正确计算 z1z_1z2z_2,验证必然失败。

(3)形式化证明

假设:存在攻击者 AA 能够以不可忽略的概率 δ\delta 通过验证,即使不知道 x1x_1x2x_2

构造算法 BB 求解离散对数问题

给定离散对数问题实例:(g1,y1)(g_1, y_1),要计算 x1=logg1y1x_1 = \log_{g_1} y_1

算法 BB

  1. 设置 g2g_2y2=g2x2y_2 = g_2^{x_2}BB 知道 x2x_2
  2. 运行 AND 证明协议作为验证者
  3. 如果攻击者 AA 通过验证,从响应中提取信息

关键观察

  • 如果 AA 能够通过验证,则 g1z1=a1y1cg_1^{z_1} = a_1 \cdot y_1^c
  • g1z1=g1r1y1cg_1^{z_1} = g_1^{r_1} \cdot y_1^c
  • 因此 z1=r1+clogg1y1modqz_1 = r_1 + c \cdot \log_{g_1} y_1 \bmod q
  • 如果 BB 知道 r1r_1cc,可以计算:logg1y1=(z1r1)c1modq\log_{g_1} y_1 = (z_1 - r_1) \cdot c^{-1} \bmod q

问题BB 不知道 r1r_1(因为 a1=g1r1a_1 = g_1^{r_1} 是攻击者发送的)

使用重放技术

  1. BB 运行协议,获得 (a1,a2)(a_1, a_2),发送挑战 cc,获得 (z1,z2)(z_1, z_2)
  2. BB 重放协议,使用相同的 (a1,a2)(a_1, a_2),但发送不同的挑战 cc'
  3. 如果 AA 再次通过验证,获得 (z1,z2)(z_1', z_2')
  4. 从两个响应中:
    • z1=r1+cx1modqz_1 = r_1 + cx_1 \bmod q
    • z1=r1+cx1modqz_1' = r_1 + c'x_1 \bmod q
    • 因此:z1z1=(cc)x1modqz_1 - z_1' = (c - c')x_1 \bmod q
    • 如果 ccc \neq c',则:x1=(z1z1)(cc)1modqx_1 = (z_1 - z_1') \cdot (c - c')^{-1} \bmod q

成功概率

  • 如果 AA 能够以概率 δ\delta 通过验证
  • BB 能够以概率约 δ2\delta^2 求解离散对数问题
  • 如果 δ\delta 不可忽略,则 δ2\delta^2 也不可忽略
  • 这与离散对数问题的困难性矛盾

(4)结论

  • 如果证明者不知道 x1x_1x2x_2,无法生成有效的 AND 证明
  • 验证者以高概率拒绝证明
  • 因此,AND 证明满足 Soundness 性质

Soundness 错误概率

  • 如果证明者不知道秘密,通过验证的概率 ϵ\leq \epsilon(可忽略函数)
  • 这保证了协议的安全性

题型四:计算题

题目 21:Elgamal 同态加密投票计算

题目: 在基于 Elgamal 同态加密的投票方案中,给定:

  • 参数:p=23p = 23g=5g = 5,公钥 y=8y = 8
  • 三个投票者的投票:
    • 投票者 1:b1=1b_1 = 1(支持),随机数 r1=3r_1 = 3
    • 投票者 2:b2=0b_2 = 0(反对),随机数 r2=4r_2 = 4
    • 投票者 3:b3=1b_3 = 1(支持),随机数 r3=5r_3 = 5

请完成: (1)计算每个投票的密文 (2)使用同态性质计算总投票密文 (3)如果私钥 x=6x = 6,解密得到总投票数

完整解答

(1)计算每个投票的密文

Elgamal 加密公式

  • c1=grmodpc_1 = g^r \bmod p
  • c2=gbyrmodpc_2 = g^b \cdot y^r \bmod p
  • 密文:C=(c1,c2)C = (c_1, c_2)

投票者 1b1=1b_1 = 1r1=3r_1 = 3

  • c1,1=gr1=53mod23=125mod23=1255×23=125115=10c_{1,1} = g^{r_1} = 5^3 \bmod 23 = 125 \bmod 23 = 125 - 5 \times 23 = 125 - 115 = 10
  • c2,1=gb1yr1=5183mod23c_{2,1} = g^{b_1} \cdot y^{r_1} = 5^1 \cdot 8^3 \bmod 23

计算 83mod238^3 \bmod 23

  • 82=64mod23=188^2 = 64 \bmod 23 = 18
  • 83=18×8=144mod23=68^3 = 18 \times 8 = 144 \bmod 23 = 6

因此 c2,1=5×6=30mod23=7c_{2,1} = 5 \times 6 = 30 \bmod 23 = 7

投票 1 的密文C1=(10,7)C_1 = (10, 7)

投票者 2b2=0b_2 = 0r2=4r_2 = 4

  • c1,2=gr2=54mod23=625mod23=4c_{1,2} = g^{r_2} = 5^4 \bmod 23 = 625 \bmod 23 = 4(从之前计算)
  • c2,2=gb2yr2=5084mod23=184mod23c_{2,2} = g^{b_2} \cdot y^{r_2} = 5^0 \cdot 8^4 \bmod 23 = 1 \cdot 8^4 \bmod 23

计算 84mod238^4 \bmod 23

  • 84=(82)2=182=324mod23=28^4 = (8^2)^2 = 18^2 = 324 \bmod 23 = 2

因此 c2,2=1×2=2mod23=2c_{2,2} = 1 \times 2 = 2 \bmod 23 = 2

投票 2 的密文C2=(4,2)C_2 = (4, 2)

投票者 3b3=1b_3 = 1r3=5r_3 = 5

  • c1,3=gr3=55mod23c_{1,3} = g^{r_3} = 5^5 \bmod 23

计算 55mod235^5 \bmod 23

  • 54=45^4 = 4(已计算)

  • 55=54×5=4×5=20mod23=205^5 = 5^4 \times 5 = 4 \times 5 = 20 \bmod 23 = 20

  • c2,3=gb3yr3=5185mod23c_{2,3} = g^{b_3} \cdot y^{r_3} = 5^1 \cdot 8^5 \bmod 23

计算 85mod238^5 \bmod 23

  • 84=28^4 = 2(已计算)
  • 85=84×8=2×8=16mod23=168^5 = 8^4 \times 8 = 2 \times 8 = 16 \bmod 23 = 16

因此 c2,3=5×16=80mod23=803×23=8069=11c_{2,3} = 5 \times 16 = 80 \bmod 23 = 80 - 3 \times 23 = 80 - 69 = 11

投票 3 的密文C3=(20,11)C_3 = (20, 11)

(2)使用同态性质计算总投票密文

Elgamal 同态性质Enc(b1)Enc(b2)=(gr1,gb1yr1)(gr2,gb2yr2)=(gr1+r2,gb1+b2yr1+r2)Enc(b_1) \cdot Enc(b_2) = (g^{r_1}, g^{b_1} \cdot y^{r_1}) \cdot (g^{r_2}, g^{b_2} \cdot y^{r_2}) = (g^{r_1+r_2}, g^{b_1+b_2} \cdot y^{r_1+r_2})

计算总密文Ctotal=C1C2C3=(i=13c1,i,i=13c2,i)C_{total} = C_1 \cdot C_2 \cdot C_3 = (\prod_{i=1}^3 c_{1,i}, \prod_{i=1}^3 c_{2,i})

计算 c1,totalc_{1,total}c1,total=c1,1×c1,2×c1,3=10×4×20mod23=800mod23c_{1,total} = c_{1,1} \times c_{1,2} \times c_{1,3} = 10 \times 4 \times 20 \bmod 23 = 800 \bmod 23

计算 800mod23800 \bmod 23

  • 23×34=78223 \times 34 = 782
  • 800782=18800 - 782 = 18

因此 c1,total=18c_{1,total} = 18

计算 c2,totalc_{2,total}c2,total=c2,1×c2,2×c2,3=7×2×11mod23=154mod23c_{2,total} = c_{2,1} \times c_{2,2} \times c_{2,3} = 7 \times 2 \times 11 \bmod 23 = 154 \bmod 23

计算 154mod23154 \bmod 23

  • 23×6=13823 \times 6 = 138
  • 154138=16154 - 138 = 16

因此 c2,total=16c_{2,total} = 16

总投票密文Ctotal=(18,16)C_{total} = (18, 16)

(3)解密得到总投票数

私钥x=6x = 6

Elgamal 解密公式gbi=c2,total(c1,total)xmodpg^{\sum b_i} = c_{2,total} \cdot (c_{1,total})^{-x} \bmod p

步骤 1:计算 (c1,total)x(c_{1,total})^x (c1,total)x=186mod23(c_{1,total})^x = 18^6 \bmod 23

计算 186mod2318^6 \bmod 23

  • 182=324mod23=32414×23=324322=218^2 = 324 \bmod 23 = 324 - 14 \times 23 = 324 - 322 = 2
  • 184=(182)2=22=4mod23=418^4 = (18^2)^2 = 2^2 = 4 \bmod 23 = 4
  • 186=184×182=4×2=8mod23=818^6 = 18^4 \times 18^2 = 4 \times 2 = 8 \bmod 23 = 8

步骤 2:计算 (c1,total)x=81mod23(c_{1,total})^{-x} = 8^{-1} \bmod 23

使用扩展欧几里得算法找 81mod238^{-1} \bmod 23

  • 23=8×2+723 = 8 \times 2 + 7
  • 8=7×1+18 = 7 \times 1 + 1
  • 7=1×7+07 = 1 \times 7 + 0

回代:

  • 1=87×11 = 8 - 7 \times 1
  • 7=238×27 = 23 - 8 \times 2
  • 1=8(238×2)=8×3231 = 8 - (23 - 8 \times 2) = 8 \times 3 - 23

因此 813(mod23)8^{-1} \equiv 3 \pmod{23}

验证:8×3=241(mod23)8 \times 3 = 24 \equiv 1 \pmod{23}

步骤 3:计算 gbig^{\sum b_i} gbi=c2,total(c1,total)x=16×3mod23=48mod23=482×23=4846=2g^{\sum b_i} = c_{2,total} \cdot (c_{1,total})^{-x} = 16 \times 3 \bmod 23 = 48 \bmod 23 = 48 - 2 \times 23 = 48 - 46 = 2

因此 gbi=2mod23g^{\sum b_i} = 2 \bmod 23

步骤 4:计算离散对数 bi=log52mod23\sum b_i = \log_5 2 \bmod 23

由于 bi3\sum b_i \leq 3(只有 3 个投票),可以穷举:

  • 50=1mod23=15^0 = 1 \bmod 23 = 1
  • 51=5mod23=55^1 = 5 \bmod 23 = 5
  • 52=25mod23=25^2 = 25 \bmod 23 = 2

因此 bi=2\sum b_i = 2

验证

  • 投票者 1:b1=1b_1 = 1
  • 投票者 2:b2=0b_2 = 0
  • 投票者 3:b3=1b_3 = 1
  • bi=1+0+1=2\sum b_i = 1 + 0 + 1 = 2

统计结果

  • 支持票数:bi=2\sum b_i = 2
  • 反对票数:32=13 - 2 = 1

计算完成!


题目 22:零知识证明 AND 证明完整计算

题目: 在零知识证明的 AND 证明中,给定:

  • Z23\mathbb{Z}_{23}^*,生成元 g1=2g_1 = 2g2=3g_2 = 3
  • y1=4y_1 = 4(假设 y1=g1x1y_1 = g_1^{x_1},即 2x1=42^{x_1} = 4,所以 x1=2x_1 = 2
  • y2=9y_2 = 9(假设 y2=g2x2y_2 = g_2^{x_2},即 3x2=93^{x_2} = 9,所以 x2=2x_2 = 2
  • 证明者知道 x1=2x_1 = 2x2=2x_2 = 2
  • 证明者选择:r1=4r_1 = 4r2=5r_2 = 5
  • 验证者选择挑战:c=6c = 6

请完成: (1)计算承诺 (a1,a2)(a_1, a_2) (2)计算响应 (z1,z2)(z_1, z_2) (3)验证证明

完整解答

(1)计算承诺 (a1,a2)(a_1, a_2)

证明者知道x1=2x_1 = 2x2=2x_2 = 2 证明者选择r1=4r_1 = 4r2=5r_2 = 5

计算承诺

  • a1=g1r1=24mod23=16a_1 = g_1^{r_1} = 2^4 \bmod 23 = 16
  • a2=g2r2=35mod23a_2 = g_2^{r_2} = 3^5 \bmod 23

计算 35mod233^5 \bmod 23

  • 32=9mod23=93^2 = 9 \bmod 23 = 9
  • 34=(32)2=92=81mod23=813×23=8169=123^4 = (3^2)^2 = 9^2 = 81 \bmod 23 = 81 - 3 \times 23 = 81 - 69 = 12
  • 35=34×3=12×3=36mod23=361×23=133^5 = 3^4 \times 3 = 12 \times 3 = 36 \bmod 23 = 36 - 1 \times 23 = 13

因此 a2=13a_2 = 13

承诺(a1,a2)=(16,13)(a_1, a_2) = (16, 13)

(2)计算响应 (z1,z2)(z_1, z_2)

验证者挑战c=6c = 6

计算响应

  • z1=r1+cx1modq=4+6×2mod11=4+12mod11=16mod11=5z_1 = r_1 + cx_1 \bmod q = 4 + 6 \times 2 \bmod 11 = 4 + 12 \bmod 11 = 16 \bmod 11 = 5
  • z2=r2+cx2modq=5+6×2mod11=5+12mod11=17mod11=6z_2 = r_2 + cx_2 \bmod q = 5 + 6 \times 2 \bmod 11 = 5 + 12 \bmod 11 = 17 \bmod 11 = 6

(注意:这里 q=11q = 11 是群的阶,从之前的计算知道)

响应(z1,z2)=(5,6)(z_1, z_2) = (5, 6)

(3)验证证明

验证公式

  • 检查 g1z1=a1y1cg_1^{z_1} = a_1 \cdot y_1^c
  • 检查 g2z2=a2y2cg_2^{z_2} = a_2 \cdot y_2^c

验证第一个关系

  • 左边:g1z1=25mod23=32mod23=3223=9g_1^{z_1} = 2^5 \bmod 23 = 32 \bmod 23 = 32 - 23 = 9
  • 右边:a1y1c=16×46mod23a_1 \cdot y_1^c = 16 \times 4^6 \bmod 23

计算 46mod234^6 \bmod 23

  • 42=16mod23=164^2 = 16 \bmod 23 = 16
  • 44=(42)2=162=256mod23=25611×23=256253=34^4 = (4^2)^2 = 16^2 = 256 \bmod 23 = 256 - 11 \times 23 = 256 - 253 = 3
  • 46=44×42=3×16=48mod23=482×23=4846=24^6 = 4^4 \times 4^2 = 3 \times 16 = 48 \bmod 23 = 48 - 2 \times 23 = 48 - 46 = 2

因此右边:16×2=32mod23=916 \times 2 = 32 \bmod 23 = 9

  • 左边:99
  • 右边:99
  • 9=99 = 9

验证第二个关系

  • 左边:g2z2=36mod23g_2^{z_2} = 3^6 \bmod 23

计算 36mod233^6 \bmod 23

  • 36=35×3=13×3=39mod23=391×23=163^6 = 3^5 \times 3 = 13 \times 3 = 39 \bmod 23 = 39 - 1 \times 23 = 16

  • 右边:a2y2c=13×96mod23a_2 \cdot y_2^c = 13 \times 9^6 \bmod 23

计算 96mod239^6 \bmod 23

  • 92=81mod23=129^2 = 81 \bmod 23 = 12
  • 94=(92)2=122=144mod23=1446×23=144138=69^4 = (9^2)^2 = 12^2 = 144 \bmod 23 = 144 - 6 \times 23 = 144 - 138 = 6
  • 96=94×92=6×12=72mod23=723×23=7269=39^6 = 9^4 \times 9^2 = 6 \times 12 = 72 \bmod 23 = 72 - 3 \times 23 = 72 - 69 = 3

因此右边:13×3=39mod23=1613 \times 3 = 39 \bmod 23 = 16

  • 左边:1616
  • 右边:1616
  • 16=1616 = 16

两个验证都通过!AND 证明有效!