密码学期末考试重点题目集 - 中文版
题型说明
本题目集包含四种考试题型:
- 概念解释题:解释密码学概念、定义、性质等
- 方案设计题:设计密码学方案满足特定安全需求
- 证明题:证明密码学方案的安全性或不安全性
- 计算题:进行具体的密码学计算
第一部分:对称密码工具
题型一:概念解释题
题目 1:解释 PRG 的安全性定义
题目:
请详细解释伪随机数生成器(PRG)的安全性定义,包括:
(1)形式化定义
(2)区分器的概念
(3)可忽略函数的含义
(4)为什么这个定义能够保证 PRG 的安全性
完整解答:
(1)形式化定义
设 G:{0,1}n→{0,1}l 是一个函数,其中 l>n(扩展性要求)。G 是一个安全的 PRG,如果对于所有多项式时间的区分器 D,存在可忽略函数 ϵ,使得:
∣Pr[D(G(s))=1]−Pr[D(r)=1]∣≤ϵ(n)
其中:
- s←{0,1}n 是随机种子
- r←{0,1}l 是真正的随机字符串
- D 是区分器算法,输出 0 或 1
(2)区分器的概念
区分器 D 是一个多项式时间的算法,它试图区分 PRG 的输出和真正的随机字符串:
- 如果 D 输出 1,表示它认为输入是随机的
- 如果 D 输出 0,表示它认为输入不是随机的(可能是 PRG 的输出)
区分器的目标是最大化区分优势:
AdvD=∣Pr[D(G(s))=1]−Pr[D(r)=1]∣
(3)可忽略函数的含义
可忽略函数 ϵ:N→R 满足:对于所有多项式 p,存在 N,使得对于所有 n>N,有 ϵ(n)<1/p(n)。
直观理解:可忽略函数比任何多项式的倒数衰减得更快。例如:
- ϵ(n)=2−n 是可忽略的
- ϵ(n)=n−100 是可忽略的
- ϵ(n)=1/n 不是可忽略的(因为 1/n>1/n2 对于大的 n)
(4)为什么这个定义能够保证 PRG 的安全性
如果 PRG 是安全的,那么:
- 任何多项式时间的算法都无法以不可忽略的优势区分 G(s) 和真正的随机字符串 r
- 这意味着 G(s) 在计算上与真正的随机字符串不可区分
- 因此,使用 G(s) 代替真正的随机字符串不会显著降低安全性
- 这保证了 PRG 可以安全地用于密码学应用(如生成密钥流)
如果存在区分器能够以不可忽略的优势区分,则 PRG 不安全,不能用于密码学应用。
题目 2:解释流密码中 IV 的作用
题目:
在流密码中,初始化向量(IV)的作用是什么?为什么 IV 不需要保密?如果同一个密钥和 IV 的组合被重复使用,会发生什么安全问题?请详细说明。
完整解答:
IV 的作用
初始化向量(IV)在流密码中有以下作用:
-
确保密钥流的唯一性:即使使用相同的密钥 k,不同的 IV 会产生不同的密钥流
- 密钥流:K=G(k,IV)
- 如果 IV1=IV2,则 G(k,IV1)=G(k,IV2)(对于安全的 PRG)
-
防止相同明文产生相同密文:
- 如果 IV 不同,即使明文 m 相同,密文 c=m⊕G(k,IV) 也会不同
- 这提供了语义安全性
-
支持并行加密:不同的消息可以使用不同的 IV,可以并行加密
为什么 IV 不需要保密
IV 不需要保密的原因:
-
IV 的作用是提供随机性,不是提供保密性:
- 保密性由密钥 k 和加密函数提供
- IV 的作用是确保每次加密产生不同的密文
-
即使攻击者知道 IV$,只要 IV 是随机的,流密码仍然是 CPA 安全的:
- 攻击者知道 IV 和 c=m⊕G(k,IV)
- 但由于不知道密钥 k,无法计算 G(k,IV)
- 因此无法获得明文 m 的信息
-
实际应用中的考虑:
- IV 通常与密文一起传输
- 可以公开存储
- 但必须确保 IV 的唯一性(不能重复使用)
重复使用相同密钥和 IV 的安全问题
如果同一个密钥和 IV 的组合被重复使用,会发生严重的安全问题:
攻击场景:
假设使用相同的 (k,IV) 加密两个消息 m1 和 m2:
- c1=m1⊕G(k,IV)
- c2=m2⊕G(k,IV)
攻击方法:
攻击者可以计算:
c1⊕c2=(m1⊕G(k,IV))⊕(m2⊕G(k,IV))=m1⊕m2
安全后果:
- 泄露明文的异或:攻击者获得了 m1⊕m2,这泄露了两个明文的异或值
- 如果知道一个明文,可以恢复另一个:
- 如果攻击者知道 m1,则 m2=c1⊕c2⊕m1
- 模式分析:攻击者可以分析明文的模式
实际例子:
如果 m1="HELLO",m2="WORLD",攻击者计算 c1⊕c2 可能泄露部分信息。
结论:
- 绝对禁止重复使用相同的 (k,IV) 组合
- 每次加密必须使用不同的 IV
- IV 可以是计数器、随机数或时间戳,但必须确保唯一性
题型二:方案设计题
题目 3:设计一个安全的文件传输方案
题目:
设计一个安全的文件传输方案,满足以下要求:
- 文件大小为 10GB(很大)
- 支付信息保密(没有人知道支付金额)
- 文件完整性(Integrity)
- 只有 Bob 可以检查文件内容
请:
(1)选择合适的密码学工具
(2)详细说明方案的工作过程
(3)说明方案如何满足每个要求
完整解答:
(1)选择合适的密码学工具
根据要求,我们需要以下工具:
- 对称加密:用于加密大文件(效率高)
- 公钥加密:用于传输对称密钥(只有 Bob 能解密)
- 哈希函数:用于文件完整性验证
- 数字签名:用于认证发送方身份(可选)
具体选择:
- 对称加密:AES-256-CTR(适合大文件,支持并行)
- 公钥加密:RSA-OAEP 或 Elgamal(用于加密对称密钥)
- 哈希函数:SHA-256(用于完整性)
- 数字签名:RSA-FDH 或 Schnorr(用于认证)
(2)详细方案设计
方案:使用混合加密 + 哈希 + 数字签名
步骤 1:发送方(Alice)准备文件
- 生成随机对称密钥:k←{0,1}256(AES-256 密钥)
- 选择随机 IV:IV←{0,1}128
- 使用 AES-CTR 加密文件:
- 将 10GB 文件分割成块:F1,F2,…,Fn
- 对每个块加密:Ci=Fi⊕AESk(IV+i)
- 密文文件:C=C1∣∣C2∣∣…∣∣Cn
- 计算文件哈希值:h=SHA256(F)(对整个原始文件计算)
- 使用 Bob 的公钥加密对称密钥:Kenc=RSA-OAEPpkB(k∣∣IV)
- (可选)使用 Alice 的私钥签名哈希值:σ=SignskA(h)
步骤 2:发送
Alice 发送给 Bob:
- 加密文件:C(10GB)
- 加密的密钥:Kenc
- 文件哈希值:h
- (可选)签名:σ
步骤 3:接收方(Bob)验证和解密
- 使用 Bob 的私钥解密密钥:(k∣∣IV)=RSA-OAEPskB−1(Kenc)
- 使用 AES-CTR 解密文件:
- 对每个块解密:Fi=Ci⊕AESk(IV+i)
- 恢复文件:F=F1∣∣F2∣∣…∣∣Fn
- 计算接收文件的哈希值:h′=SHA256(F)
- 验证完整性:检查 h′=h
- (可选)验证签名:VerifypkA(h,σ)
(3)说明如何满足每个要求
要求 1:文件大小为 10GB(很大)
- 解决方案:使用对称加密(AES-CTR)
- 对称加密速度快,适合大文件
- CTR 模式支持并行加密/解密
- 10GB 文件可以高效处理
- 为什么不用公钥加密直接加密文件:
- 公钥加密速度慢,不适合大文件
- RSA 只能加密小于模数的数据
- 因此使用混合加密:公钥加密小密钥,对称加密大文件
要求 2:支付信息保密(没有人知道支付金额)
- 解决方案:使用公钥加密保护对称密钥
- 只有 Bob 拥有私钥 skB,只有 Bob 能解密 Kenc 获得 k
- 没有 k,无法解密文件 C
- 因此,除了 Bob,没有人能知道文件内容(包括支付信息)
- 安全性保证:
- RSA-OAEP 是 CPA 安全的
- 即使攻击者截获 Kenc,也无法解密(除非能破解 RSA)
要求 3:文件完整性(Integrity)
- 解决方案:使用哈希函数验证完整性
- Alice 计算原始文件的哈希值 h=SHA256(F)
- Bob 解密后计算接收文件的哈希值 h′=SHA256(F′)
- 如果 h′=h,则文件完整;否则文件被篡改
- 安全性保证:
- SHA-256 具有碰撞抵抗性
- 攻击者无法找到不同的文件产生相同的哈希值
- 因此可以检测到任何篡改
要求 4:只有 Bob 可以检查文件内容
- 解决方案:使用 Bob 的公钥加密
- 对称密钥 k 使用 Bob 的公钥 pkB 加密
- 只有 Bob 拥有私钥 skB,只有 Bob 能解密获得 k
- 没有 k,无法解密文件
- 安全性保证:
- 公钥加密确保只有私钥持有者(Bob)能解密
- 即使攻击者截获所有传输数据,也无法获得文件内容
方案总结:
- ✅ 满足大文件要求:使用高效的对称加密
- ✅ 满足保密性要求:使用公钥加密保护密钥
- ✅ 满足完整性要求:使用哈希函数验证
- ✅ 满足访问控制要求:只有 Bob 能解密
题型三:证明题
题目 4:证明 ECB 模式不是 CPA 安全的
题目:
请严格证明 ECB(Electronic Codebook)模式不是 CPA(Chosen Plaintext Attack)安全的。
要求:
(1)给出 CPA 安全的形式化定义
(2)构造攻击者算法
(3)分析攻击者的成功概率
(4)得出结论
完整解答:
(1)CPA 安全的形式化定义
加密方案 (Gen,Enc,Dec) 是 CPA 安全的,如果对于所有多项式时间的攻击者 A,存在可忽略函数 ϵ,使得:
Pr[CPA-Game(A)=1]≤21+ϵ(n)
CPA 游戏:
- 挑战者生成密钥 k←Gen(1n)
- 攻击者可以查询加密预言机 Enck(⋅) 任意多项式次
- 攻击者选择两个等长的明文 m0,m1(∣m0∣=∣m1∣)
- 挑战者随机选择 b←{0,1},返回挑战密文 c∗=Enck(mb)
- 攻击者继续查询加密预言机
- 攻击者输出 b′∈{0,1}
- 如果 b′=b,攻击者获胜,游戏输出 1;否则输出 0
攻击者的优势:
AdvCPA(A)=∣Pr[CPA-Game(A)=1]−21∣
如果 AdvCPA(A)≤ϵ(n)(可忽略),则方案是 CPA 安全的。
(2)构造攻击者算法
ECB 模式的加密:
对于消息 m=P1∣∣P2∣∣…∣∣Pn(分割成块),ECB 模式加密为:
Ci=Ek(Pi)对于 i=1,2,…,n
密文:c=C1∣∣C2∣∣…∣∣Cn
攻击者 A 的构造:
算法 A:
-
选择挑战明文:
- 选择两个块 P 和 Q,使得 P=Q(例如 P=0128,Q=1128)
- 设置 m0=P∣∣P(两个相同的块)
- 设置 m1=P∣∣Q(两个不同的块)
- 发送 (m0,m1) 给挑战者
-
接收挑战密文:
- 接收挑战密文 c∗=c1∗∣∣c2∗(两个密文块)
-
区分:
- 如果 c1∗=c2∗,则输出 b′=0
- 如果 c1∗=c2∗,则输出 b′=1
(3)分析攻击者的成功概率
情况 1:b=0(加密 m0=P∣∣P)
- ECB 加密:c1∗=Ek(P),c2∗=Ek(P)
- 由于 Ek 是确定性函数,Ek(P)=Ek(P)
- 因此 c1∗=c2∗
- 攻击者观察到 c1∗=c2∗,输出 b′=0
- 成功:b′=b=0 ✓
情况 2:b=1(加密 m1=P∣∣Q)
- ECB 加密:c1∗=Ek(P),c2∗=Ek(Q)
- 由于 P=Q 且 Ek 是置换(双射),Ek(P)=Ek(Q)
- 因此 c1∗=c2∗
- 攻击者观察到 c1∗=c2∗,输出 b′=1
- 成功:b′=b=1 ✓
成功概率分析:
- Pr[CPA-Game(A)=1]=Pr[b′=b]
- 在情况 1 中:Pr[b′=0∣b=0]=1
- 在情况 2 中:Pr[b′=1∣b=1]=1
- 由于 b 是均匀随机的:Pr[b=0]=Pr[b=1]=21
- 因此:
Pr[b′=b]=Pr[b=0]⋅Pr[b′=0∣b=0]+Pr[b=1]⋅Pr[b′=1∣b=1]
=21×1+21×1=1
攻击者的优势:
AdvCPA(A)=∣Pr[CPA-Game(A)=1]−21∣=∣1−21∣=21
(4)得出结论
- 攻击者 A 的成功概率为 1(完美区分)
- 攻击者的优势为 21,这是不可忽略的(常数,不是可忽略函数)
- 根据 CPA 安全的定义,如果存在攻击者以不可忽略的优势获胜,则方案不是 CPA 安全的
- 因此,ECB 模式不是 CPA 安全的
进一步说明:
- ECB 模式的问题在于:相同的明文块总是产生相同的密文块
- 这允许攻击者通过观察密文模式来推断明文信息
- 因此,ECB 模式不应在实际应用中使用
- 应该使用 CBC、CTR 等安全的加密模式
题目 5:证明 Schnorr 签名在随机数受限时的不安全性
题目:
证明如果 Schnorr 签名中随机数 r 的取值只从集合 {r1,r2,r3} 中选择(而不是从整个 Zq 中均匀随机选择),则签名方案是不安全的。
要求给出完整的攻击构造和成功概率分析。
完整解答:
Schnorr 签名回顾:
- 私钥:x∈Zq
- 公钥:y=gxmodp
- 签名:选择 r←Zq,计算 R=gr,c=H(m∣∣R),s=r+cxmodq
- 签名:σ=(R,s)
- 验证:检查 gs=R⋅yc
(1)攻击场景设置
假设签名者使用受限的随机数集合:r∈{r1,r2,r3},而不是从整个 Zq 中随机选择。
(2)攻击者构造
攻击者 A 的目标:恢复私钥 x 或伪造签名
攻击算法:
步骤 1:观察签名
- 攻击者 A 查询签名预言机,获得消息 m 的签名 σ=(R,s)
- A 知道 R=gr,其中 r∈{r1,r2,r3}
步骤 2:穷举搜索 r
对于每个 ri∈{r1,r2,r3}:
- 计算 Ri=grimodp
- 检查 Ri=R
- 如果相等,则找到了使用的 ri
步骤 3:恢复私钥
一旦找到 ri,攻击者可以恢复私钥:
- 从签名:s=ri+cxmodq
- 其中 c=H(m∣∣R) 是已知的
- 因此:x=(s−ri)⋅c−1modq
(3)成功概率分析
找到 r 的概率:
- 随机数 r 从 {r1,r2,r3} 中均匀选择
- 攻击者需要尝试最多 3 次
- 成功概率:Pr[找到 r]=1(在最多 3 次尝试后)
恢复私钥的概率:
- 一旦找到 r,可以确定性地计算 x
- 成功概率:Pr[恢复 x∣找到 r]=1
总体成功概率:
Pr[攻击成功]=Pr[找到 r]×Pr[恢复 x∣找到 r]=1×1=1
时间复杂度:
- 需要计算 gri 最多 3 次
- 每次计算需要 O(logri) 次模幂运算
- 总时间复杂度:O(3×logq)=O(logq)(多项式时间)
(4)伪造签名
一旦攻击者获得私钥 x,可以:
- 为任意消息 m∗ 生成有效签名
- 选择任意 r∗(甚至不需要受限)
- 计算 R∗=gr∗,c∗=H(m∗∣∣R∗),s∗=r∗+c∗xmodq
- 输出签名 σ∗=(R∗,s∗)
(5)对比:如果 r 从整个 Zq 中选择
如果 r 从整个 Zq 中均匀随机选择:
- ∣Zq∣=q(通常 q≈2256)
- 攻击者需要尝试平均 q/2 次才能找到 r
- 成功概率:Pr[找到 r]≈2−256(可忽略)
- 因此攻击不可行
(6)结论
- 如果随机数 r 只从 {r1,r2,r3} 中选择,攻击者可以在多项式时间内以概率 1 恢复私钥
- 这违反了数字签名的不可伪造性(攻击者可以伪造任意签名)
- 因此,Schnorr 签名在随机数受限时是不安全的
- 必须要求 r 从整个 Zq 中均匀随机选择
题型四:计算题
题目 6:RSA 加密解密完整计算
题目:
给定 RSA 参数:
- p=17,q=19
- 公钥指数 e=5
- 明文 m=123
请完成以下计算:
(1)计算模数 n 和欧拉函数 ϕ(n)
(2)验证 e 与 ϕ(n) 互素
(3)计算私钥指数 d
(4)计算密文 c
(5)验证解密过程
完整解答:
(1)计算模数和欧拉函数
模数:
n=p×q=17×19=323
欧拉函数:
ϕ(n)=(p−1)(q−1)=(17−1)(19−1)=16×18=288
(2)验证 e 与 ϕ(n) 互素
需要验证 gcd(e,ϕ(n))=gcd(5,288)=1
使用欧几里得算法:
- 288=5×57+3
- 5=3×1+2
- 3=2×1+1
- 2=1×2+0
因此 gcd(5,288)=1 ✓
(3)计算私钥指数 d
需要找到 d 使得 ed≡1(modϕ(n)),即 5d≡1(mod288)
使用扩展欧几里得算法:
从上面的计算:
- 288=5×57+3 → 3=288−5×57
- 5=3×1+2 → 2=5−3×1
- 3=2×1+1 → 1=3−2×1
回代:
1=3−2×1
=3−(5−3×1)×1=3−5+3=2×3−5
=2×(288−5×57)−5=2×288−114×5−5
=2×288−115×5
因此 1=2×288−115×5
所以 d=−115mod288=288−115=173
验证:
5×173=865
865mod288=865−3×288=865−864=1 ✓
因此 d=173
(4)计算密文 c
公钥:pk=(n,e)=(323,5)
明文:m=123
检查明文范围:123<323 ✓(明文在有效范围内)
加密:
c=memodn=1235mod323
使用模幂算法:
首先将指数 5 表示为二进制:5=1012=22+20=4+1
计算 1232imod323:
- 1231=123mod323=123
- 1232=15129mod323
计算 15129mod323:
-
323×46=14858
-
15129−14858=271
-
因此 1232=271mod323
-
1234=(1232)2=2712mod323
计算 2712=73441mod323:
- 323×227=73321
- 73441−73321=120
- 因此 1234=120mod323
现在计算 1235:
1235=1234×1231=120×123mod323
计算 120×123=14760mod323:
- 323×45=14535
- 14760−14535=225
- 因此 c=225
(5)验证解密过程
私钥:sk=(n,d)=(323,173)
密文:c=225
解密:
m′=cdmodn=225173mod323
使用模幂算法:
将指数 173 表示为二进制:173=101011012=128+32+8+4+1
计算 2252imod323:
- 2251=225mod323=225
- 2252=50625mod323
计算 50625mod323:
-
323×156=50388
-
50625−50388=237
-
因此 2252=237mod323
-
2254=(2252)2=2372mod323
计算 2372=56169mod323:
-
323×173=55879
-
56169−55879=290
-
因此 2254=290mod323
-
2258=(2254)2=2902mod323
计算 2902=84100mod323:
-
323×260=83980
-
84100−83980=120
-
因此 2258=120mod323
-
22516=(2258)2=1202mod323
计算 1202=14400mod323:
-
323×44=14212
-
14400−14212=188
-
因此 22516=188mod323
-
22532=(22516)2=1882mod323
计算 1882=35344mod323:
-
323×109=35207
-
35344−35207=137
-
因此 22532=137mod323
-
22564=(22532)2=1372mod323
计算 1372=18769mod323:
-
323×58=18734
-
18769−18734=35
-
因此 22564=35mod323
-
225128=(22564)2=352mod323
计算 352=1225mod323:
- 323×3=969
- 1225−969=256
- 因此 225128=256mod323
现在计算 225173:
225173=225128×22532×2258×2254×2251
=256×137×120×290×225mod323
逐步计算:
- 256×137=35072mod323
计算 35072mod323:
-
323×108=34884
-
35072−34884=188
-
因此中间结果 = 188
-
188×120=22560mod323
计算 22560mod323:
-
323×69=22287
-
22560−22287=273
-
因此中间结果 = 273
-
273×290=79170mod323
计算 79170mod323:
-
323×245=79135
-
79170−79135=35
-
因此中间结果 = 35
-
35×225=7875mod323
计算 7875mod323:
- 323×24=7752
- 7875−7752=123
- 因此 m′=123
验证:
- 原始明文:m=123
- 解密明文:m′=123
- m=m′ ✓
解密成功!
题目 7:Elgamal 加密解密完整计算
题目:
给定 Elgamal 加密参数:
- p=23,g=5
- 私钥 x=6
- 明文 m=7
- 随机数 r=3
请完成:
(1)计算公钥 y
(2)计算密文 (c1,c2)
(3)验证解密过程
完整解答:
(1)计算公钥 y
私钥:x=6
生成元:g=5
模数:p=23
公钥:
y=gxmodp=56mod23
计算 56mod23:
- 52=25mod23=2
- 54=(52)2=22=4mod23=4
- 56=54×52=4×2=8mod23=8
因此 y=8
公钥:pk=(p,g,y)=(23,5,8)
(2)计算密文 (c1,c2)
明文:m=7
随机数:r=3
公钥:y=8
Elgamal 加密公式:
- c1=grmodp
- c2=m⋅yrmodp
计算 c1:
c1=grmodp=53mod23=125mod23
计算 125mod23:
- 23×5=115
- 125−115=10
因此 c1=10
计算 c2:
c2=m⋅yrmodp=7⋅83mod23
首先计算 83mod23:
- 81=8mod23=8
- 82=64mod23=64−2×23=64−46=18
- 83=82×8=18×8=144mod23
计算 144mod23:
- 23×6=138
- 144−138=6
因此 83=6mod23
所以 c2=7×6=42mod23=42−1×23=19
密文:c=(c1,c2)=(10,19)
(3)验证解密过程
私钥:x=6
密文:c=(10,19)
Elgamal 解密公式:
m=c2⋅(c1x)−1modp
步骤 1:计算 c1x
c1x=106mod23
计算 106mod23:
- 102=100mod23=100−4×23=100−92=8
- 104=(102)2=82=64mod23=18
- 106=104×102=18×8=144mod23=6
因此 c1x=6
步骤 2:计算 (c1x)−1mod23
需要找到 6−1mod23,即找到 d 使得 6d≡1(mod23)
使用扩展欧几里得算法:
- 23=6×3+5
- 6=5×1+1
- 5=1×5+0
回代:
- 1=6−5×1
- 5=23−6×3
- 1=6−(23−6×3)=6−23+6×3=6×4−23
因此 6−1≡4(mod23)
验证:6×4=24≡1(mod23) ✓
步骤 3:计算明文
m=c2⋅(c1x)−1modp=19×4mod23=76mod23
计算 76mod23:
- 23×3=69
- 76−69=7
因此 m=7
验证:
- 原始明文:m=7
- 解密明文:m=7
- 两者相等 ✓
解密成功!
题目 8:Schnorr 签名完整计算
题目:
给定 Schnorr 签名参数:
- p=23,q=11(11∣22 ✓)
- g=5(生成元)
- 私钥 x=3
- 消息 m=7
- 随机数 r=4
- 哈希函数:H(m∣∣R)=(m⋅R)mod11(简化)
请完成:
(1)计算公钥 y
(2)生成签名 (R,s)
(3)验证签名
完整解答:
(1)计算公钥 y
私钥:x=3
生成元:g=5
模数:p=23
公钥:
y=gxmodp=53mod23=125mod23=125−5×23=125−115=10
因此 y=10
公钥:pk=y=10
(2)生成签名 (R,s)
消息:m=7
随机数:r=4
步骤 1:计算承诺 R
R=grmodp=54mod23
计算 54mod23:
- 52=25mod23=2
- 54=(52)2=22=4mod23=4
因此 R=4
步骤 2:计算挑战 c
c=H(m∣∣R)=(m⋅R)mod11=(7×4)mod11=28mod11=6
因此 c=6
步骤 3:计算响应 s
s=r+cxmodq=4+6×3mod11=4+18mod11=22mod11=0
因此 s=0
签名:σ=(R,s)=(4,0)
(3)验证签名
公钥:y=10
消息:m=7
签名:σ=(R,s)=(4,0)
验证公式:检查 gs=R⋅yc(modp)
步骤 1:重新计算挑战 c
c=H(m∣∣R)=(7×4)mod11=6
步骤 2:计算左边 gs
gs=50mod23=1
步骤 3:计算右边 R⋅yc
R⋅yc=4×106mod23
首先计算 106mod23:
- 102=100mod23=100−4×23=100−92=8
- 104=(102)2=82=64mod23=18
- 106=104×102=18×8=144mod23=144−6×23=144−138=6
因此 R⋅yc=4×6=24mod23=24−23=1
步骤 4:比较
- 左边:gs=1
- 右边:R⋅yc=1
- 1=1 ✓
验证通过!签名有效!
第二部分:公钥密码学
题型一:概念解释题
题目 9:解释 Diffie-Hellman 密钥协商的安全性
题目:
请详细解释 Diffie-Hellman 密钥协商协议的安全性,包括:
(1)协议的基本原理
(2)安全性基于哪个困难问题
(3)为什么攻击者无法获得共享密钥
(4)协议的安全假设
完整解答:
(1)协议的基本原理
Diffie-Hellman 密钥协商协议允许两个通信方在不安全的信道上建立一个共享密钥。
协议步骤:
- 公开参数:选择大素数 p 和生成元 g∈Zp∗,参数 (p,g) 公开
- Alice:
- 随机选择私钥 a←Zp−1
- 计算公钥 A=gamodp
- 发送 A 给 Bob
- Bob:
- 随机选择私钥 b←Zp−1
- 计算公钥 B=gbmodp
- 发送 B 给 Alice
- 共享密钥:
- Alice 计算:K=Bamodp=(gb)amodp=gabmodp
- Bob 计算:K=Abmodp=(ga)bmodp=gabmodp
- 双方得到相同的共享密钥 K=gabmodp
(2)安全性基于哪个困难问题
Diffie-Hellman 密钥协商的安全性基于**离散对数问题(DLP)**的困难性。
离散对数问题:
给定群 G(如 Zp∗),生成元 g,和元素 h=gx,计算 x=loggh 在计算上不可行。
在 DH 协议中:
- 攻击者看到 A=ga 和 B=gb
- 攻击者想要计算 K=gab
- 这等价于计算 Diffie-Hellman 问题(CDH)
- CDH 的困难性基于 DLP 的困难性
(3)为什么攻击者无法获得共享密钥
攻击者观察到的信息:
- 公开参数:(p,g)
- Alice 的公钥:A=gamodp
- Bob 的公钥:B=gbmodp
攻击者想要计算:
- 共享密钥:K=gabmodp
攻击者的困难:
方法 1:直接计算 gab
- 攻击者需要知道 a 或 b
- 但 a 和 b 是私钥,只有 Alice 和 Bob 知道
- 攻击者无法从 A=ga 计算 a(这是 DLP,计算上不可行)
方法 2:从 A 和 B 计算 K
- 这等价于求解计算 Diffie-Hellman(CDH)问题
- CDH 问题在计算上不可行(基于 DLP 困难性)
方法 3:中间人攻击(MITM)
- 攻击者可以拦截 A 和 B,并发送自己的公钥
- 但这需要攻击者能够修改通信信道
- 在标准 DH 协议中,假设通信信道是认证的(或使用数字签名防止 MITM)
(4)协议的安全假设
计算假设:
-
离散对数假设(DL Assumption):
- 在群 Zp∗ 中,给定 g 和 gx,计算 x 在计算上不可行
- 这是协议安全性的基础
-
计算 Diffie-Hellman 假设(CDH Assumption):
- 给定 g,ga,gb,计算 gab 在计算上不可行
- 直接保证共享密钥的安全性
-
判定 Diffie-Hellman 假设(DDH Assumption)(更强的假设):
- 给定 g,ga,gb,Z,判定 Z=gab 还是 Z 是随机元素在计算上不可行
- 用于更强的安全保证
协议假设:
-
参数选择:
- p 必须是大素数(通常 2048 位或更大)
- g 必须是生成元(或大阶元素)
- 参数必须正确生成
-
随机性:
- 私钥 a 和 b 必须从 Zp−1 中均匀随机选择
- 不能使用弱随机数生成器
-
通信安全:
- 标准 DH 不提供认证,容易受到中间人攻击
- 实际应用中需要结合数字签名或证书
安全性总结:
- DH 密钥协商在 DLP/CDH 假设下是安全的
- 攻击者无法从公开信息计算共享密钥
- 但需要防止中间人攻击(使用认证机制)
题型二:方案设计题
题目 10:设计一个安全的电子投票方案
题目:
设计一个使用同态加密的电子投票方案,满足以下要求:
- 每个投票者只能投票一次
- 投票是保密的(没有人知道具体投票内容)
- 可以正确统计投票结果
- 投票者可以验证自己的投票被正确记录
请:
(1)选择合适的密码学工具
(2)详细描述投票流程
(3)说明如何满足每个要求
完整解答:
(1)选择合适的密码学工具
根据要求,需要以下工具:
- 同态加密:允许在密文上计算,用于统计投票
- 零知识证明:用于证明投票有效性(投票值在允许范围内)
- 数字签名:用于认证投票者身份
- 承诺协议:用于确保投票的绑定性
具体选择:
- 同态加密:Elgamal 同态加密(支持乘法同态)
- 零知识证明:Schnorr 签名或 Sigma 协议
- 数字签名:RSA-FDH 或 Schnorr
- 承诺协议:Pedersen 承诺
(2)详细方案设计
方案:基于 Elgamal 同态加密的投票方案
设置阶段:
- 选择 Elgamal 参数:大素数 p,生成元 g∈Zp∗
- 投票机构生成密钥对:私钥 x,公钥 y=gxmodp
- 公开参数:(p,g,y)
投票阶段(投票者 Vi):
- 身份认证:投票者使用数字签名证明身份
- 选择投票:投票者选择 b∈{0,1}(支持或反对)
- 加密投票:
- 随机选择 r←Zp−1
- 计算:c1=grmodp
- 计算:c2=gb⋅yrmodp(注意:这里 gb 表示投票,b∈{0,1})
- 密文:C=(c1,c2)
- 零知识证明:投票者生成 ZK 证明,证明 b∈{0,1}(使用 OR 证明)
- 提交:投票者提交 (C,ZK proof,signature)
统计阶段:
- 验证所有投票:
- 验证每个投票者的身份(数字签名)
- 验证每个投票的 ZK 证明(确保 b∈{0,1})
- 同态计算:
- 对于所有有效投票密文 Ci=(c1,i,c2,i),计算:
- Ctotal=∏i=1nCi=(∏i=1nc1,i,∏i=1nc2,i)
- 由于 Elgamal 的乘法同态性:
Ctotal=(g∑ri,g∑bi⋅y∑ri)
- 解密统计结果:
- 使用私钥 x 解密 Ctotal
- 计算:g∑bi=c2,total⋅(c1,total)−xmodp
- 计算离散对数:∑bi=logg(g∑bi)(由于 ∑bi 较小,可以穷举)
- 统计结果:支持票数 = ∑bi,反对票数 = n−∑bi
(3)说明如何满足每个要求
要求 1:每个投票者只能投票一次
- 解决方案:使用数字签名认证身份
- 每个投票者使用自己的私钥签名投票
- 投票机构维护已投票者列表
- 如果同一身份重复投票,拒绝第二次投票
- 技术细节:
- 投票者提交 (C,σ),其中 σ=SignskV(C∣∣timestamp)
- 投票机构验证签名并检查身份是否已投票
要求 2:投票是保密的(没有人知道具体投票内容)
- 解决方案:使用 Elgamal 加密
- 每个投票 b 被加密为 C=(c1,c2)
- 只有投票机构拥有私钥 x,可以解密
- 但投票机构只能看到统计结果,不能看到单个投票(如果使用阈值解密)
- 技术细节:
- 使用随机数 r 确保相同投票产生不同密文
- 加密是 CPA 安全的
- 可以进一步使用阈值加密,需要多个机构合作才能解密
要求 3:可以正确统计投票结果
- 解决方案:使用同态加密
- Elgamal 支持乘法同态:Enc(b1)⋅Enc(b2)=Enc(b1+b2)(在指数上)
- 所有投票密文相乘得到总投票数的加密
- 解密后得到 ∑bi,即支持票数
- 技术细节:
- 同态性:Enc(b1)⋅Enc(b2)=(gr1+r2,gb1+b2⋅yr1+r2)
- 解密后得到 gb1+b2,计算离散对数得到 b1+b2
- 对于 n 个投票,∑bi≤n,可以穷举计算离散对数
要求 4:投票者可以验证自己的投票被正确记录
- 解决方案:使用承诺和验证机制
- 投票者提交投票时,同时提交承诺 commit=Commit(b,r′)
- 投票机构公布所有投票密文(不公布对应关系)
- 投票者可以验证自己的密文在列表中
- 统计后,投票者可以验证承诺(可选)
- 技术细节:
- 投票者计算 commit=H(b∣∣r′∣∣ID)
- 提交 (C,commit)
- 投票机构公布所有 (Ci,commiti) 的列表
- 投票者检查自己的 (C,commit) 在列表中
- 统计后,可以揭示 b 和 r′ 验证承诺
方案总结:
- ✅ 满足唯一性:数字签名防止重复投票
- ✅ 满足保密性:Elgamal 加密保护投票内容
- ✅ 满足正确性:同态加密支持正确统计
- ✅ 满足可验证性:承诺机制允许验证
题型三:证明题
题目 11:证明哈希函数三个安全性质之间的关系
题目:
证明哈希函数的三个安全性质之间的关系:
(1)碰撞抵抗性(Collision Resistance)
(2)第二原像抵抗性(Second Preimage Resistance)
(3)原像抵抗性(Preimage Resistance)
请证明:
- 碰撞抵抗性 ⇒ 第二原像抵抗性
- 第二原像抵抗性 ⇒ 原像抵抗性(在随机预言机模型下)
完整解答:
(1)定义三个安全性质
原像抵抗性(Preimage Resistance):
对于所有多项式时间攻击者 A,存在可忽略函数 ϵ,使得:
Pr[x←{0,1}∗,y=H(x),A(y)=x′ 且 H(x′)=y]≤ϵ(n)
即:给定哈希值 y,找到 x 使得 H(x)=y 在计算上不可行。
第二原像抵抗性(Second Preimage Resistance):
对于所有多项式时间攻击者 A,存在可忽略函数 ϵ,使得:
Pr[x←{0,1}∗,A(x)=x′=x 且 H(x′)=H(x)]≤ϵ(n)
即:给定 x,找到 x′=x 使得 H(x)=H(x′) 在计算上不可行。
碰撞抵抗性(Collision Resistance):
对于所有多项式时间攻击者 A,存在可忽略函数 ϵ,使得:
Pr[A()=(x,x′) 且 x=x′ 且 H(x)=H(x′)]≤ϵ(n)
即:找到任意 x,x′ 使得 x=x′ 但 H(x)=H(x′) 在计算上不可行。
(2)证明:碰撞抵抗性 ⇒ 第二原像抵抗性
证明方法:反证法
假设哈希函数 H 是碰撞抵抗的,但不是第二原像抵抗的。我们将构造一个算法来找到碰撞,这与碰撞抵抗性矛盾。
构造攻击者 Acollision:
算法 Acollision:
- 随机选择 x←{0,1}∗
- 调用第二原像攻击者 A2nd(假设存在),输入 x
- A2nd 输出 x′=x 使得 H(x′)=H(x)
- 输出碰撞 (x,x′)
成功概率分析:
- 如果 A2nd 能够以不可忽略的概率 δ 找到第二原像
- 则 Acollision 能够以相同的概率 δ 找到碰撞
- 这与 H 是碰撞抵抗的假设矛盾
结论:
- 如果 H 是碰撞抵抗的,则 H 必须是第二原像抵抗的
- 因此:碰撞抵抗性 ⇒ 第二原像抵抗性
(3)证明:第二原像抵抗性 ⇒ 原像抵抗性(在随机预言机模型下)
证明方法:在随机预言机模型下,如果哈希函数是第二原像抵抗的,则也是原像抵抗的。
证明思路:
在随机预言机模型中,哈希函数 H 的行为类似于随机函数。如果 H 是第二原像抵抗的,那么:
-
随机预言机的性质:
- 对于每个输入 x,H(x) 是均匀随机的
- 不同输入的输出是独立的
-
原像攻击的困难性:
- 给定哈希值 y,攻击者需要找到 x 使得 H(x)=y
- 由于 H 是随机的,攻击者只能通过查询 H 来寻找
- 每次查询成功的概率约为 2−n(n 是输出长度)
- 需要平均 2n 次查询才能找到原像
-
与第二原像抵抗性的关系:
- 如果 H 是第二原像抵抗的,则给定 x,找到 x′ 使得 H(x′)=H(x) 是困难的
- 在随机预言机模型中,这等价于原像抵抗性
- 因为如果能够找到原像,则能够找到第二原像(通过先随机选择 x,然后找到 H(x) 的原像)
形式化证明(简化):
假设存在原像攻击者 Apreimage 能够以不可忽略的概率找到原像。构造第二原像攻击者 A2nd:
算法 A2nd(x):
- 计算 y=H(x)
- 调用 Apreimage(y),得到 x′
- 如果 x′=x 且 H(x′)=y,输出 x′
- 否则输出失败
成功概率:
- 如果 Apreimage 成功找到原像,且 x′=x(概率很高,因为输入空间很大)
- 则 A2nd 成功找到第二原像
- 这与第二原像抵抗性矛盾
结论:
- 在随机预言机模型下,第二原像抵抗性 ⇒ 原像抵抗性
- 注意:这个结论依赖于随机预言机模型,在实际哈希函数中可能不成立
(4)总结
三个安全性质之间的关系:
- ✅ 碰撞抵抗性 ⇒ 第二原像抵抗性(无条件成立)
- ✅ 第二原像抵抗性 ⇒ 原像抵抗性(在随机预言机模型下成立)
- ❌ 原像抵抗性 ⇒ 第二原像抵抗性(不成立)
- ❌ 第二原像抵抗性 ⇒ 碰撞抵抗性(不成立)
实际意义:
- 碰撞抵抗性是最强的性质
- 设计哈希函数时,通常直接证明碰撞抵抗性
- 如果哈希函数是碰撞抵抗的,则自动满足其他两个性质
题型四:计算题
题目 12:Diffie-Hellman 密钥协商完整计算
题目:
给定 Diffie-Hellman 参数:
- p=23,g=5(5 是 Z23∗ 的生成元)
- Alice 选择私钥 a=6
- Bob 选择私钥 b=15
请完成:
(1)计算 Alice 和 Bob 的公钥
(2)计算双方计算的共享密钥
(3)验证双方得到的密钥相同
(4)直接计算 gab 验证结果
完整解答:
(1)计算 Alice 和 Bob 的公钥
Alice 的公钥:
A=gamodp=56mod23
计算 56mod23:
- 52=25mod23=25−23=2
- 54=(52)2=22=4mod23=4
- 56=54×52=4×2=8mod23=8
因此 A=8
Bob 的公钥:
B=gbmodp=515mod23
计算 515mod23:
- 15=8+4+2+1=23+22+21+20
- 51=5
- 52=2(已计算)
- 54=4(已计算)
- 58=(54)2=42=16mod23=16
- 515=58×54×52×51=16×4×2×5=640mod23
计算 640mod23:
- 23×27=621
- 640−621=19
因此 B=19
(2)计算双方计算的共享密钥
Alice 计算的共享密钥:
KA=Bamodp=196mod23
计算 196mod23:
- 19mod23=19(因为 19<23)
- 192=361mod23=361−15×23=361−345=16
- 194=(192)2=162=256mod23=256−11×23=256−253=3
- 196=194×192=3×16=48mod23=48−2×23=48−46=2
因此 KA=2
Bob 计算的共享密钥:
KB=Abmodp=815mod23
计算 815mod23:
- 81=8
- 82=64mod23=64−2×23=64−46=18
- 84=(82)2=182=324mod23=324−14×23=324−322=2
- 88=(84)2=22=4mod23=4
- 15=8+4+2+1
- 815=88×84×82×81=4×2×18×8=1152mod23
计算 1152mod23:
- 23×50=1150
- 1152−1150=2
因此 KB=2
(3)验证双方得到的密钥相同
- Alice 计算的密钥:KA=2
- Bob 计算的密钥:KB=2
- KA=KB=2 ✓
共享密钥:K=2
(4)直接计算 gab 验证结果
gab=56×15=590mod23
由于 522≡1(mod23)(根据费马小定理,因为 5 与 23 互素,且 5 的阶整除 22),我们可以简化:
- 90=4×22+2
- 590=(522)4×52≡14×2≡2(mod23)
因此 gab=2,与之前计算的结果一致 ✓
验证完成!
题目 13:椭圆曲线点运算完整计算
题目:
给定椭圆曲线 E:y2=x3+2x+3(mod11),点 P=(2,2)。
请完成:
(1)验证点 P 在曲线上
(2)计算 2P(点倍乘)
(3)如果 Q=(3,6) 也在曲线上,计算 P+Q(点加)
完整解答:
(1)验证点 P 在曲线上
曲线方程:y2=x3+2x+3(mod11)
点 P=(2,2):
- 左边:y2=22=4mod11=4
- 右边:x3+2x+3=23+2×2+3=8+4+3=15mod11=4
4=4 ✓,因此点 P=(2,2) 在曲线上。
(2)计算 2P(点倍乘)
点倍乘公式(P=P):
- 斜率:λ=2y13x12+amodp
- x3=λ2−2x1modp
- y3=λ(x1−x3)−y1modp
给定参数:
- P=(x1,y1)=(2,2)
- a=2(曲线参数)
- p=11
计算斜率 λ:
λ=2y13x12+amodp=2×23×22+2mod11=43×4+2mod11=414mod11
计算 4−1mod11:
- 需要 4d≡1(mod11)
- 4×3=12≡1(mod11),所以 4−1=3
因此 λ=14×3mod11=42mod11=42−3×11=42−33=9
计算 x3:
x3=λ2−2x1modp=92−2×2mod11=81−4mod11=77mod11=0
计算 y3:
y3=λ(x1−x3)−y1modp=9(2−0)−2mod11=18−2mod11=16mod11=5
因此 2P=(0,5)
验证:检查 (0,5) 是否在曲线上
- 左边:y2=52=25mod11=3
- 右边:x3+2x+3=0+0+3=3mod11=3
- 3=3 ✓
(3)计算 P+Q(点加)
首先验证 Q=(3,6) 在曲线上:
- 左边:y2=62=36mod11=3
- 右边:x3+2x+3=33+2×3+3=27+6+3=36mod11=3
- 3=3 ✓,Q 在曲线上
点加公式(P=Q):
- 斜率:λ=x2−x1y2−y1modp
- x3=λ2−x1−x2modp
- y3=λ(x1−x3)−y1modp
给定参数:
- P=(x1,y1)=(2,2)
- Q=(x2,y2)=(3,6)
- p=11
计算斜率 λ:
λ=x2−x1y2−y1modp=3−26−2mod11=14mod11=4
计算 x3:
x3=λ2−x1−x2modp=42−2−3mod11=16−5mod11=11mod11=0
计算 y3:
y3=λ(x1−x3)−y1modp=4(2−0)−2mod11=8−2mod11=6
因此 P+Q=(0,6)
验证:检查 (0,6) 是否在曲线上
- 左边:y2=62=36mod11=3
- 右边:x3+2x+3=0+0+3=3mod11=3
- 3=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):试图伪造签名
游戏步骤:
-
初始化阶段:
- 挑战者生成密钥对:(pk,sk)←Gen(1n)
- 挑战者将公钥 pk 发送给攻击者
- 私钥 sk 保密
-
学习阶段:
- 攻击者可以查询签名预言机 Signsk(⋅) 任意多项式次
- 对于每次查询消息 mi,攻击者获得签名 σi=Signsk(mi)
- 攻击者获得签名对:(m1,σ1),(m2,σ2),…,(mq,σq)
- 其中 q 是多项式有界的查询次数
-
伪造阶段:
- 攻击者输出伪造:(m∗,σ∗)
- 要求:m∗∈/{m1,m2,…,mq}(m∗ 不是查询过的消息)
-
判定阶段:
- 挑战者验证:Verifypk(m∗,σ∗)
- 如果验证通过(输出 1),则攻击者获胜,游戏输出 1
- 否则攻击者失败,游戏输出 0
攻击者的优势:
AdvEU−CMA(A)=Pr[EU-CMA-Game(A)=1]
(2)存在性不可伪造性的含义
存在性不可伪造性(Existential Unforgeability):
- 攻击者无法为任何消息生成有效签名
- 即使该消息可能是无意义的、随机的或攻击者自己构造的
- 只要攻击者没有查询过该消息的签名,就无法伪造
与强不可伪造性的区别:
- 存在性不可伪造性:攻击者无法为新的消息伪造签名
- 强不可伪造性:攻击者即使看到消息 m 的签名 σ,也无法生成该消息的另一个有效签名 σ′=σ
实际意义:
- 存在性不可伪造性已经足够强,因为攻击者无法伪造任何新消息的签名
- 这保证了数字签名的基本安全目标
(3)适应性选择消息攻击的含义
适应性选择消息攻击(Adaptive Chosen Message Attack, CMA):
- 攻击者可以自适应地选择要查询签名的消息
- 攻击者可以根据之前查询的结果,选择下一个要查询的消息
- 这模拟了现实场景中攻击者可以观察签名并据此选择攻击策略
为什么是"适应性"的:
- 攻击者不需要一次性提交所有要查询的消息
- 可以基于之前的查询结果,动态选择下一个消息
- 这使得攻击更强大,安全模型更严格
与其他攻击模型的比较:
- 已知消息攻击(Known Message Attack):攻击者只能看到随机的消息-签名对,不能选择消息
- 选择消息攻击(Chosen Message Attack):攻击者可以选择消息,但必须一次性提交所有消息(非适应性)
- 适应性选择消息攻击(Adaptive CMA):攻击者可以自适应地选择消息(最强)
(4)为什么这个安全模型是合理的
合理性分析:
-
模拟现实攻击场景:
- 在现实中,攻击者可能能够获得某些消息的签名
- 攻击者可以根据观察到的签名,选择攻击策略
- EU-CMA 模型准确模拟了这种场景
-
足够强的安全保证:
- 即使攻击者获得了许多消息的签名,仍然无法伪造新消息的签名
- 这保证了数字签名的核心安全目标:不可伪造性
-
实际应用的安全性:
- 如果数字签名方案是 EU-CMA 安全的,则在实际应用中,即使攻击者观察到许多签名,也无法伪造
- 这适用于大多数实际应用场景
-
与其他安全目标的关系:
- EU-CMA 安全是数字签名的基本安全要求
- 更强的安全模型(如强不可伪造性)在某些特殊场景中需要,但 EU-CMA 已经足够
总结:
- EU-CMA 安全模型是数字签名方案的标准安全定义
- 它准确模拟了现实攻击场景
- 提供了足够强的安全保证
- 是评估数字签名方案安全性的合理标准
题型二:方案设计题
题目 15:设计一个安全的文件共享方案
题目:
设计一个安全的文件共享方案,满足以下要求:
- 文件大小为 10GB(很大)
- 支付信息保密(Payment - No one knows)
- 文件完整性(Integrity)
- 只有 Bob 可以检查文件内容
请:
(1)选择合适的密码学工具
(2)详细说明方案的工作过程
(3)说明方案如何满足每个要求
完整解答:
(1)选择合适的密码学工具
根据要求分析:
- 大文件(10GB):需要使用高效的对称加密
- 支付信息保密:需要使用公钥加密保护密钥
- 完整性:需要使用哈希函数或 MAC
- 只有 Bob 能访问:需要使用 Bob 的公钥加密
选择的工具:
- 对称加密:AES-256-CTR 模式(适合大文件,支持并行)
- 公钥加密:RSA-OAEP 或 Elgamal(用于加密对称密钥)
- 哈希函数:SHA-256(用于完整性验证)
- 数字签名(可选):用于认证发送方
(2)详细方案设计
方案:混合加密 + 哈希验证
步骤 1:发送方(Alice)准备文件
-
生成对称密钥:
- 随机生成对称密钥:k←{0,1}256(AES-256 密钥)
- 选择随机 IV:IV←{0,1}128
-
加密文件:
- 将 10GB 文件 F 分割成块:F1,F2,…,Fn(每块 128 位)
- 使用 AES-CTR 模式加密:
- 对每个块:Ci=Fi⊕AESk(IV+i)
- 密文文件:C=C1∣∣C2∣∣…∣∣Cn
-
计算文件哈希:
- 计算原始文件的哈希值:h=SHA256(F)
- 这用于完整性验证
-
加密对称密钥:
- 使用 Bob 的公钥加密:Kenc=RSA-OAEPpkB(k∣∣IV)
- 只有 Bob 能解密获得 k 和 IV
-
(可选)签名哈希值:
- 使用 Alice 的私钥签名:σ=SignskA(h)
- 用于认证文件来源
步骤 2:发送
Alice 发送给 Bob:
- 加密文件:C(10GB)
- 加密的密钥:Kenc
- 文件哈希值:h
- (可选)签名:σ
步骤 3:接收方(Bob)验证和解密
-
解密密钥:
- 使用 Bob 的私钥解密:(k∣∣IV)=RSA-OAEPskB−1(Kenc)
- 只有 Bob 拥有 skB,只有 Bob 能解密
-
解密文件:
- 使用 AES-CTR 解密:
- 对每个块:Fi=Ci⊕AESk(IV+i)
- 恢复文件:F=F1∣∣F2∣∣…∣∣Fn
-
验证完整性:
- 计算接收文件的哈希值:h′=SHA256(F)
- 检查 h′=h
- 如果相等,文件完整;否则文件被篡改
-
(可选)验证签名:
- 验证 VerifypkA(h,σ)
- 确认文件来自 Alice
(3)说明如何满足每个要求
要求 1:文件大小为 10GB(很大)
- 解决方案:使用对称加密(AES-CTR)
- 对称加密速度快,适合大文件
- CTR 模式支持并行加密/解密
- 10GB 文件可以高效处理
- 为什么不用公钥加密直接加密文件:
- 公钥加密速度慢(比对称加密慢 100-1000 倍)
- RSA 只能加密小于模数的数据(通常 2048 位)
- 因此使用混合加密:公钥加密小密钥(256 位),对称加密大文件(10GB)
要求 2:支付信息保密(Payment - No one knows)
- 解决方案:使用 Bob 的公钥加密对称密钥
- 对称密钥 k 使用 Bob 的公钥 pkB 加密
- 只有 Bob 拥有私钥 skB,只有 Bob 能解密 Kenc 获得 k
- 没有 k,无法解密文件 C
- 因此,除了 Bob,没有人能知道文件内容(包括支付信息)
- 安全性保证:
- RSA-OAEP 是 CPA 安全的
- 即使攻击者截获 Kenc,也无法解密(除非能破解 RSA)
- 即使攻击者截获加密文件 C,没有 k 也无法解密
要求 3:文件完整性(Integrity)
- 解决方案:使用哈希函数验证完整性
- Alice 计算原始文件的哈希值 h=SHA256(F)
- Bob 解密后计算接收文件的哈希值 h′=SHA256(F′)
- 如果 h′=h,则文件完整;否则文件被篡改
- 安全性保证:
- SHA-256 具有碰撞抵抗性
- 攻击者无法找到不同的文件产生相同的哈希值
- 因此可以检测到任何篡改
- 如果文件被篡改:
- 攻击者修改 C 得到 C′
- Bob 解密得到 F′=F
- 计算 h′=SHA256(F′)=h
- 验证失败,Bob 知道文件被篡改
要求 4:只有 Bob 可以检查文件内容
- 解决方案:使用 Bob 的公钥加密
- 对称密钥 k 使用 Bob 的公钥 pkB 加密
- 只有 Bob 拥有私钥 skB,只有 Bob 能解密获得 k
- 没有 k,无法解密文件
- 安全性保证:
- 公钥加密确保只有私钥持有者(Bob)能解密
- 即使攻击者截获所有传输数据(C、Kenc、h),也无法获得文件内容
- 这提供了访问控制
方案总结:
- ✅ 满足大文件要求:使用高效的对称加密(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)证明假设
假设:
- 底层分组密码 Ek 是伪随机置换(PRP)
- 初始化向量 IV 是随机选择的(每次加密都不同)
CBC 模式回顾:
- 加密:C0=IV,Ci=Ek(Pi⊕Ci−1) 对于 i≥1
- 解密:Pi=Dk(Ci)⊕Ci−1
(2)使用游戏跳跃技术证明
**游戏跳跃(Game Hopping)**是一种证明技术,通过一系列游戏来证明安全性,每个游戏与前一个游戏只有微小差异。
游戏 0(真实 CBC 模式):
- 挑战者生成密钥 k←Gen(1n)
- 攻击者查询加密预言机,获得 (mi,EncCBC(mi))
- 攻击者选择 (m0,m1),获得挑战密文 c∗=EncCBC(mb)
- 攻击者输出 b′
游戏 1(使用随机置换代替分组密码):
- 挑战者选择随机置换 π(而不是使用 Ek)
- 加密使用:Ci=π(Pi⊕Ci−1)
- 其他步骤与游戏 0 相同
游戏 2(使用真正的随机函数):
- 挑战者选择真正的随机函数 f(而不是置换)
- 加密使用:Ci=f(Pi⊕Ci−1)
- 其他步骤与游戏 1 相同
游戏 3(理想情况):
- 挑战者直接输出随机密文(不依赖明文)
- 攻击者无法获得任何关于 mb 的信息
(3)分析每个游戏之间的差异
游戏 0 到游戏 1 的差异:
- 使用随机置换 π 代替 Ek
- 如果 Ek 是 PRP,则游戏 0 和游戏 1 在计算上不可区分
- 差异:∣Pr[Game0]−Pr[Game1]∣≤ϵPRP(n)(可忽略)
游戏 1 到游戏 2 的差异:
- 使用随机函数 f 代替随机置换 π
- 由于置换和函数的区别很小(生日悖论),差异可忽略
- 差异:∣Pr[Game1]−Pr[Game2]∣≤ϵbirthday(n)(可忽略)
游戏 2 到游戏 3 的差异:
- 在游戏 2 中,如果 IV 是随机的,则每个块的输入 Pi⊕Ci−1 看起来是随机的
- 随机函数 f 的输出也看起来是随机的
- 因此,整个密文看起来是随机的,不依赖明文
- 差异:∣Pr[Game2]−Pr[Game3]∣≤ϵrandom(n)(可忽略)
(4)得出结论
攻击者在游戏 3 中的优势:
- 在游戏 3 中,密文是完全随机的,不包含任何关于 mb 的信息
- 攻击者的优势:AdvGame3(A)=0(无法区分)
攻击者在游戏 0 中的优势:
AdvGame0(A)≤AdvGame3(A)+ϵPRP+ϵbirthday+ϵrandom
=0+ϵPRP+ϵbirthday+ϵrandom
=ϵ(n)(可忽略函数)
结论:
- 如果底层分组密码 Ek 是 PRP,且 IV 是随机的
- 则 CBC 模式在 CPA 下是语义安全的
- 攻击者的优势是可忽略的
重要条件:
- IV 必须是随机的(每次加密都不同)
- 如果 IV 是固定的或可预测的,CBC 模式不安全
题型四:计算题
题目 17:RSA-FDH 签名完整计算
题目:
给定 RSA-FDH 参数:
- p=17,q=19
- 公钥指数 e=5
- 消息 m="Hello",假设 H("Hello")=100
请完成:
(1)计算密钥对
(2)生成签名 σ
(3)验证签名
完整解答:
(1)计算密钥对
模数:
n=p×q=17×19=323
欧拉函数:
ϕ(n)=(p−1)(q−1)=16×18=288
验证 e 与 ϕ(n) 互素:
- gcd(5,288)=1 ✓(因为 5 是素数,且 5 不整除 288)
计算私钥指数 d:
需要 5d≡1(mod288)
使用扩展欧几里得算法:
- 288=5×57+3
- 5=3×1+2
- 3=2×1+1
- 2=1×2+0
回代:
- 1=3−2×1
- 2=5−3×1
- 1=3−(5−3)=2×3−5
- 3=288−5×57
- 1=2×(288−5×57)−5=2×288−115×5
因此 d=−115mod288=288−115=173
验证:5×173=865≡1(mod288) ✓
密钥对:
- 公钥:pk=(n,e)=(323,5)
- 私钥:sk=(n,d)=(323,173)
(2)生成签名 σ
消息哈希:h=H("Hello")=100
检查范围:100<323 ✓(在有效范围内)
计算签名:
σ=hdmodn=100173mod323
使用模幂算法:
将指数 173 表示为二进制:173=101011012=128+32+8+4+1
计算 1002imod323:
- 1001=100mod323=100
- 1002=10000mod323=10000−30×323=10000−9690=310
- 1004=(1002)2=3102=96100mod323=96100−297×323=96100−95931=169
- 1008=(1004)2=1692=28561mod323=28561−88×323=28561−28424=137
- 10016=(1008)2=1372=18769mod323=18769−58×323=18769−18734=35
- 10032=(10016)2=352=1225mod323=1225−3×323=1225−969=256
- 10064=(10032)2=2562=65536mod323=65536−202×323=65536−65246=290
- 100128=(10064)2=2902=84100mod323=84100−260×323=84100−83980=120
计算 100173:
100173=100128×10032×1008×1004×1001
=120×256×137×169×100mod323
逐步计算:
- 120×256=30720mod323=30720−95×323=30720−30685=35
- 35×137=4795mod323=4795−14×323=4795−4522=273
- 273×169=46137mod323=46137−142×323=46137−45866=271
- 271×100=27100mod323=27100−83×323=27100−26809=291
因此 σ=291
(3)验证签名
公钥:(n,e)=(323,5)
消息哈希:h=100
签名:σ=291
验证:检查 h≡σe(modn),即 100≡2915(mod323)
计算 2915mod323:
- 2912=84681mod323=84681−262×323=84681−84626=55
- 2914=(2912)2=552=3025mod323=3025−9×323=3025−2907=118
- 2915=2914×2911=118×291=34338mod323
计算 34338mod323:
- 323×106=34238
- 34338−34238=100
因此 2915≡100(mod323) ✓
验证通过!签名有效!
第四部分:高级主题
题型一:概念解释题
题目 18:解释零知识证明的三个性质
题目:
请详细解释零知识证明(Zero Knowledge Proof)的三个性质:
(1)完备性(Completeness)
(2)可靠性(Soundness)
(3)零知识性(Zero-Knowledge)
并说明每个性质的实际意义。
完整解答:
(1)完备性(Completeness)
定义:
如果证明者确实知道秘密(或陈述为真),则诚实的验证者总是接受证明。
形式化定义:
Pr[Verifier accepts∣Prover knows secret]=1
直观理解:
- 如果证明者真的知道秘密,并且诚实地执行协议
- 验证者应该总是接受证明(不会错误地拒绝)
- 这保证了协议的"可用性":诚实的证明者能够成功证明
实际意义:
- 如果完备性不满足,即使证明者知道秘密,也可能被拒绝
- 这会导致协议不可用
- 完备性保证了"真陈述总能被证明"
例子:
在离散对数的零知识证明中:
- 如果证明者知道 x 使得 y=gx
- 并且诚实地执行协议(计算正确的响应 z=r+cx)
- 则验证者总是接受(因为 gz=gr⋅yc)
(2)可靠性(Soundness)
定义:
如果证明者不知道秘密(或陈述为假),则验证者以高概率拒绝证明。
形式化定义:
Pr[Verifier accepts∣Prover doesn’t know secret]≤ϵ
其中 ϵ 是可忽略函数。
直观理解:
- 如果证明者不知道秘密,但试图欺骗验证者
- 验证者应该以高概率拒绝(不会错误地接受)
- 这保证了协议的"安全性":不知道秘密的证明者无法通过验证
实际意义:
- 如果可靠性不满足,不知道秘密的证明者可能通过验证
- 这会导致协议不安全
- 可靠性保证了"假陈述几乎总是被拒绝"
例子:
在离散对数的零知识证明中:
- 如果证明者不知道 x,无法计算正确的响应 z
- 验证者检查 gz=R⋅yc 会失败
- 验证者以高概率拒绝
(3)零知识性(Zero-Knowledge)
定义:
验证者从证明过程中无法获得关于秘密的任何信息(除了证明者知道秘密这一事实)。
形式化定义(模拟器定义):
存在模拟器 S,可以在不知道秘密的情况下生成与真实证明不可区分的证明记录。
直观理解:
- 验证者只能知道"证明者知道秘密"这一事实
- 无法获得秘密本身或关于秘密的任何其他信息
- 这保证了协议的"隐私性"
实际意义:
- 如果零知识性不满足,验证者可能从证明过程中提取秘密信息
- 这会导致隐私泄露
- 零知识性保证了"除了陈述为真,不泄露其他信息"
例子:
在离散对数的零知识证明中:
- 验证者看到 (R,c,z)
- 但无法从这些值中提取 x 的信息
- 因为 R 是随机的,c 是验证者自己选择的,z 依赖于随机数 r
三个性质的关系:
- 完备性:保证协议可用(真陈述能被证明)
- 可靠性:保证协议安全(假陈述被拒绝)
- 零知识性:保证协议隐私(不泄露秘密信息)
三者缺一不可:
- 只有完备性:协议可用但不安全
- 只有可靠性:协议安全但可能不可用
- 只有零知识性:协议隐私但可能不安全
- 三者都满足:协议既可用、又安全、又保护隐私
题型二:方案设计题
题目 19:设计基于同态加密的投票方案
题目:
设计一个使用同态加密的电子投票方案,满足以下要求:
- 每个投票者只能投票一次
- 投票是保密的(没有人知道具体投票内容)
- 可以正确统计投票结果
- 如果有人撒谎(投票值不在允许范围内),使用零知识证明证明
请:
(1)选择合适的密码学工具
(2)详细描述投票流程
(3)说明如何检测和证明投票值不在 {0,1} 范围内
完整解答:
(1)选择合适的密码学工具
根据要求,需要以下工具:
- 同态加密:Elgamal 加密(支持乘法同态,可用于统计)
- 零知识证明:Sigma 协议(用于证明投票值在允许范围内)
- 数字签名:用于认证投票者身份
- 哈希函数:用于计算挑战
具体选择:
- 同态加密:Elgamal 加密(Enc(b)=(gr,gb⋅yr),其中 b∈{0,1})
- 零知识证明:OR 证明(证明 b∈{0,1})
- 数字签名:Schnorr 签名或 RSA-FDH
- 哈希函数:SHA-256
(2)详细方案设计
方案:基于 Elgamal 同态加密的投票方案
设置阶段:
- 选择 Elgamal 参数:大素数 p,生成元 g∈Zp∗
- 投票机构生成密钥对:私钥 x,公钥 y=gxmodp
- 公开参数:(p,g,y)
投票阶段(投票者 Vi):
-
身份认证:
- 投票者使用数字签名证明身份
- 投票机构验证签名并检查是否已投票
-
选择投票:
- 投票者选择 b∈{0,1}(0 = 反对,1 = 支持)
-
加密投票:
- 随机选择 r←Zp−1
- 计算:c1=grmodp
- 计算:c2=gb⋅yrmodp
- 密文:C=(c1,c2)
-
零知识证明:
- 生成 ZK 证明,证明 b∈{0,1}
- 使用 OR 证明:证明知道 logg(c2/yr0) 或 logg(c2/yr1),其中 r0,r1 是用于 b=0 和 b=1 的随机数
-
提交:
- 投票者提交 (C,ZK proof,signature)
统计阶段:
-
验证所有投票:
- 验证每个投票者的身份(数字签名)
- 验证每个投票的 ZK 证明(确保 b∈{0,1})
-
同态计算:
- 对于所有有效投票密文 Ci=(c1,i,c2,i),计算:
- Ctotal=∏i=1nCi=(∏i=1nc1,i,∏i=1nc2,i)
- 由于 Elgamal 的乘法同态性:
Ctotal=(g∑ri,g∑bi⋅y∑ri)
-
解密统计结果:
- 使用私钥 x 解密 Ctotal
- 计算:g∑bi=c2,total⋅(c1,total)−xmodp
- 计算离散对数:∑bi=logg(g∑bi)(由于 ∑bi≤n,可以穷举)
- 统计结果:支持票数 = ∑bi,反对票数 = n−∑bi
(3)说明如何检测和证明投票值不在 {0,1} 范围内
问题:如果有人撒谎,投票值 b∈/{0,1},如何检测?
解决方案:使用零知识证明
OR 证明构造:
投票者需要证明:b∈{0,1},即证明以下两个陈述之一为真:
- 陈述 1:b=0,即 c2/yr=g0=1
- 陈述 2:b=1,即 c2/yr=g1=g
OR 证明步骤:
-
对于 b=0 的情况(如果投票者真的选择 b=0):
- 真实关系:c2=yr(因为 g0=1)
- 证明者知道 r,可以生成真实证明
- 对于 b=1 的关系,生成模拟证明
-
对于 b=1 的情况(如果投票者真的选择 b=1):
- 真实关系:c2=g⋅yr,即 c2/yr=g
- 证明者知道 r,可以生成真实证明
- 对于 b=0 的关系,生成模拟证明
-
验证:
- 验证者检查 OR 证明是否有效
- 如果 b∈/{0,1},投票者无法生成有效的 OR 证明
- 验证者拒绝该投票
具体实现(简化):
投票者生成证明:
- 如果 b=0:
- 真实证明:证明知道 r 使得 c2=yr(即 c2/yr=1)
- 模拟证明:为 b=1 的情况生成模拟证明
- 如果 b=1:
- 真实证明:证明知道 r 使得 c2=g⋅yr(即 c2/yr=g)
- 模拟证明:为 b=0 的情况生成模拟证明
验证者验证:
如果有人撒谎(b∈/{0,1}):
- 投票者无法为 b=0 或 b=1 生成真实证明
- 只能生成两个模拟证明
- 但模拟证明无法通过验证(因为挑战分配不正确)
- 验证者检测到证明无效,拒绝投票
方案总结:
- ✅ 满足唯一性:数字签名防止重复投票
- ✅ 满足保密性:Elgamal 加密保护投票内容
- ✅ 满足正确性:同态加密支持正确统计
- ✅ 满足可验证性:零知识证明确保投票值在允许范围内
题型三:证明题
题目 20:证明 AND 证明满足 Soundness 性质
题目:
证明零知识证明中的 AND 证明满足 Soundness 性质。
给定:证明者要证明知道 x1 和 x2,使得 y1=g1x1 且 y2=g2x2。
请证明:如果证明者不知道 x1 或 x2,则验证者以高概率拒绝证明。
完整解答:
AND 证明协议回顾:
协议步骤:
- 承诺:证明者发送 (a1,a2),其中 a1=g1r1,a2=g2r2,r1,r2←Zq
- 挑战:验证者发送 c←Zq
- 响应:证明者发送 (z1,z2),其中 z1=r1+cx1modq,z2=r2+cx2modq
- 验证:验证者检查 g1z1=a1⋅y1c 且 g2z2=a2⋅y2c
(1)证明思路
使用反证法:假设存在攻击者能够以不可忽略的概率通过验证,即使不知道 x1 或 x2。我们将证明这与离散对数问题的困难性矛盾。
(2)情况分析
情况 1:证明者不知道 x1
假设证明者不知道 x1,但知道 x2。
攻击者策略:
- 攻击者可以正确计算 z2=r2+cx2(因为知道 x2)
- 但无法正确计算 z1=r1+cx1(因为不知道 x1)
验证失败分析:
- 验证者检查:g1z1=a1⋅y1c
- 如果攻击者不知道 x1,无法计算正确的 z1
- 假设攻击者猜测 z1′,则:
g1z1′=a1⋅y1c=g1r1⋅(g1x1)c=g1r1+cx1
- 验证失败的概率:Pr[验证失败]≥1−ϵ,其中 ϵ 是可忽略的
情况 2:证明者不知道 x2
类似地,如果证明者不知道 x2,无法正确计算 z2,验证失败。
情况 3:证明者不知道 x1 和 x2
如果证明者既不知道 x1 也不知道 x2,则无法正确计算 z1 和 z2,验证必然失败。
(3)形式化证明
假设:存在攻击者 A 能够以不可忽略的概率 δ 通过验证,即使不知道 x1 或 x2。
构造算法 B 求解离散对数问题:
给定离散对数问题实例:(g1,y1),要计算 x1=logg1y1。
算法 B:
- 设置 g2 和 y2=g2x2(B 知道 x2)
- 运行 AND 证明协议作为验证者
- 如果攻击者 A 通过验证,从响应中提取信息
关键观察:
- 如果 A 能够通过验证,则 g1z1=a1⋅y1c
- 即 g1z1=g1r1⋅y1c
- 因此 z1=r1+c⋅logg1y1modq
- 如果 B 知道 r1 和 c,可以计算:logg1y1=(z1−r1)⋅c−1modq
问题:B 不知道 r1(因为 a1=g1r1 是攻击者发送的)
使用重放技术:
- B 运行协议,获得 (a1,a2),发送挑战 c,获得 (z1,z2)
- B 重放协议,使用相同的 (a1,a2),但发送不同的挑战 c′
- 如果 A 再次通过验证,获得 (z1′,z2′)
- 从两个响应中:
- z1=r1+cx1modq
- z1′=r1+c′x1modq
- 因此:z1−z1′=(c−c′)x1modq
- 如果 c=c′,则:x1=(z1−z1′)⋅(c−c′)−1modq
成功概率:
- 如果 A 能够以概率 δ 通过验证
- 则 B 能够以概率约 δ2 求解离散对数问题
- 如果 δ 不可忽略,则 δ2 也不可忽略
- 这与离散对数问题的困难性矛盾
(4)结论
- 如果证明者不知道 x1 或 x2,无法生成有效的 AND 证明
- 验证者以高概率拒绝证明
- 因此,AND 证明满足 Soundness 性质
Soundness 错误概率:
- 如果证明者不知道秘密,通过验证的概率 ≤ϵ(可忽略函数)
- 这保证了协议的安全性
题型四:计算题
题目 21:Elgamal 同态加密投票计算
题目:
在基于 Elgamal 同态加密的投票方案中,给定:
- 参数:p=23,g=5,公钥 y=8
- 三个投票者的投票:
- 投票者 1:b1=1(支持),随机数 r1=3
- 投票者 2:b2=0(反对),随机数 r2=4
- 投票者 3:b3=1(支持),随机数 r3=5
请完成:
(1)计算每个投票的密文
(2)使用同态性质计算总投票密文
(3)如果私钥 x=6,解密得到总投票数
完整解答:
(1)计算每个投票的密文
Elgamal 加密公式:
- c1=grmodp
- c2=gb⋅yrmodp
- 密文:C=(c1,c2)
投票者 1:b1=1,r1=3
- c1,1=gr1=53mod23=125mod23=125−5×23=125−115=10
- c2,1=gb1⋅yr1=51⋅83mod23
计算 83mod23:
- 82=64mod23=18
- 83=18×8=144mod23=6
因此 c2,1=5×6=30mod23=7
投票 1 的密文:C1=(10,7)
投票者 2:b2=0,r2=4
- c1,2=gr2=54mod23=625mod23=4(从之前计算)
- c2,2=gb2⋅yr2=50⋅84mod23=1⋅84mod23
计算 84mod23:
- 84=(82)2=182=324mod23=2
因此 c2,2=1×2=2mod23=2
投票 2 的密文:C2=(4,2)
投票者 3:b3=1,r3=5
- c1,3=gr3=55mod23
计算 55mod23:
-
54=4(已计算)
-
55=54×5=4×5=20mod23=20
-
c2,3=gb3⋅yr3=51⋅85mod23
计算 85mod23:
- 84=2(已计算)
- 85=84×8=2×8=16mod23=16
因此 c2,3=5×16=80mod23=80−3×23=80−69=11
投票 3 的密文:C3=(20,11)
(2)使用同态性质计算总投票密文
Elgamal 同态性质:
Enc(b1)⋅Enc(b2)=(gr1,gb1⋅yr1)⋅(gr2,gb2⋅yr2)=(gr1+r2,gb1+b2⋅yr1+r2)
计算总密文:
Ctotal=C1⋅C2⋅C3=(∏i=13c1,i,∏i=13c2,i)
计算 c1,total:
c1,total=c1,1×c1,2×c1,3=10×4×20mod23=800mod23
计算 800mod23:
- 23×34=782
- 800−782=18
因此 c1,total=18
计算 c2,total:
c2,total=c2,1×c2,2×c2,3=7×2×11mod23=154mod23
计算 154mod23:
- 23×6=138
- 154−138=16
因此 c2,total=16
总投票密文:Ctotal=(18,16)
(3)解密得到总投票数
私钥:x=6
Elgamal 解密公式:
g∑bi=c2,total⋅(c1,total)−xmodp
步骤 1:计算 (c1,total)x
(c1,total)x=186mod23
计算 186mod23:
- 182=324mod23=324−14×23=324−322=2
- 184=(182)2=22=4mod23=4
- 186=184×182=4×2=8mod23=8
步骤 2:计算 (c1,total)−x=8−1mod23
使用扩展欧几里得算法找 8−1mod23:
- 23=8×2+7
- 8=7×1+1
- 7=1×7+0
回代:
- 1=8−7×1
- 7=23−8×2
- 1=8−(23−8×2)=8×3−23
因此 8−1≡3(mod23)
验证:8×3=24≡1(mod23) ✓
步骤 3:计算 g∑bi
g∑bi=c2,total⋅(c1,total)−x=16×3mod23=48mod23=48−2×23=48−46=2
因此 g∑bi=2mod23
步骤 4:计算离散对数 ∑bi=log52mod23
由于 ∑bi≤3(只有 3 个投票),可以穷举:
- 50=1mod23=1
- 51=5mod23=5
- 52=25mod23=2 ✓
因此 ∑bi=2
验证:
- 投票者 1:b1=1
- 投票者 2:b2=0
- 投票者 3:b3=1
- ∑bi=1+0+1=2 ✓
统计结果:
- 支持票数:∑bi=2
- 反对票数:3−2=1
计算完成!
题目 22:零知识证明 AND 证明完整计算
题目:
在零知识证明的 AND 证明中,给定:
- 群 Z23∗,生成元 g1=2,g2=3
- y1=4(假设 y1=g1x1,即 2x1=4,所以 x1=2)
- y2=9(假设 y2=g2x2,即 3x2=9,所以 x2=2)
- 证明者知道 x1=2 和 x2=2
- 证明者选择:r1=4,r2=5
- 验证者选择挑战:c=6
请完成:
(1)计算承诺 (a1,a2)
(2)计算响应 (z1,z2)
(3)验证证明
完整解答:
(1)计算承诺 (a1,a2)
证明者知道:x1=2,x2=2
证明者选择:r1=4,r2=5
计算承诺:
- a1=g1r1=24mod23=16
- a2=g2r2=35mod23
计算 35mod23:
- 32=9mod23=9
- 34=(32)2=92=81mod23=81−3×23=81−69=12
- 35=34×3=12×3=36mod23=36−1×23=13
因此 a2=13
承诺:(a1,a2)=(16,13)
(2)计算响应 (z1,z2)
验证者挑战:c=6
计算响应:
- z1=r1+cx1modq=4+6×2mod11=4+12mod11=16mod11=5
- z2=r2+cx2modq=5+6×2mod11=5+12mod11=17mod11=6
(注意:这里 q=11 是群的阶,从之前的计算知道)
响应:(z1,z2)=(5,6)
(3)验证证明
验证公式:
- 检查 g1z1=a1⋅y1c
- 检查 g2z2=a2⋅y2c
验证第一个关系:
- 左边:g1z1=25mod23=32mod23=32−23=9
- 右边:a1⋅y1c=16×46mod23
计算 46mod23:
- 42=16mod23=16
- 44=(42)2=162=256mod23=256−11×23=256−253=3
- 46=44×42=3×16=48mod23=48−2×23=48−46=2
因此右边:16×2=32mod23=9
- 左边:9
- 右边:9
- 9=9 ✓
验证第二个关系:
- 左边:g2z2=36mod23
计算 36mod23:
-
36=35×3=13×3=39mod23=39−1×23=16
-
右边:a2⋅y2c=13×96mod23
计算 96mod23:
- 92=81mod23=12
- 94=(92)2=122=144mod23=144−6×23=144−138=6
- 96=94×92=6×12=72mod23=72−3×23=72−69=3
因此右边:13×3=39mod23=16
- 左边:16
- 右边:16
- 16=16 ✓
两个验证都通过!AND 证明有效!