【密码学】8. 密码协议
目录
- 密码协议
- 中国剩余定理(数论基础)
- 零知识证明
- 不经意传输
- 比特承诺
- 其他协议相关概念
密码协议
中国剩余定理(数论基础)
- 核心用途
- 重构数:已知一个数关于若干两两互素数的同余类,可唯一确定该数。
- 大数运算简化:将大数用其关于小互素数的同余类表示,通过小数运算实现大数运算。
- 直观例子
- 例 1:已知某数模 2 余 0、模 5 余 3,可确定该数为 8(1~10 范围内唯一解)。
- 例 2:15 以内的数可通过模 3(行号)和模 5(列号)的同余类表示(如 12 mod 3=0、mod 5=2,对应第 0 行第 2 列),通过行号和列号的运算(如 12+13 对应行号 0+1=1、列号 2+3=5≡0 mod5,对应第 1 行第 0 列的 10)实现大数运算。
- 物不知数问题:求解方程组xa^‰¡2mod3x≡2\mod3xa^‰¡2mod3,xa^‰¡3mod5x≡3\mod5xa^‰¡3mod5,xa^‰¡2mod7x≡2\mod7xa^‰¡2mod7,通过构造法得解 23(小于 105 的唯一解)。
- 定理内容
设m1,m2,...,mkm_1,m_2,...,m_km1,m2,...,mk是两两互素的正整数,M=m1m2...mkM=m_1m_2...m_kM=m1m2...mk,则同余方程组{xa^‰¡a1modm1xa^‰¡a2modm2...xa^‰¡akmodmk\begin{cases}x≡a_1\mod m_1\\x≡a_2\mod m_2\\...\\x≡a_k\mod m_k\end{cases}⎩⎨⎧xa^‰¡a1modm1xa^‰¡a2modm2...xa^‰¡akmodmk对模MMM有唯一解:x=(a1M1e1+a2M2e2+...+akMkek)modMx=(a_1M_1e_1 + a_2M_2e_2 + ... + a_kM_ke_k)\mod Mx=(a1M1e1+a2M2e2+...+akMkek)modM
其中,Mi=M/miM_i=M/m_iMi=M/mi,eie_iei满足Mieia^‰¡1modmiM_ie_i≡1\mod m_iMieia^‰¡1modmi(即eie_iei是MiM_iMi模mim_imi的逆元)。 - 推论(模运算性质)
若A=(a1,a2,...,ak)A=(a_1,a_2,...,a_k)A=(a1,a2,...,ak),B=(b1,b2,...,bk)B=(b_1,b_2,...,b_k)B=(b1,b2,...,bk)(其中ai,bia_i,b_iai,bi分别为A,BA,BA,B模mim_imi的同余类),则:- (A+B)modM=((a1+b1)modm1,...,(ak+bk)modmk)(A+B)\mod M=( (a_1+b_1)\mod m_1, ..., (a_k+b_k)\mod m_k )(A+B)modM=((a1+b1)modm1,...,(ak+bk)modmk)
- (A−B)modM=((a1−b1)modm1,...,(ak−bk)modmk)(A-B)\mod M=( (a_1-b_1)\mod m_1, ..., (a_k-b_k)\mod m_k )(A−B)modM=((a1−b1)modm1,...,(ak−bk)modmk)
- (AA~—B)modM=((a1A~—b1)modm1,...,(akA~—bk)modmk)(A×B)\mod M=( (a_1×b_1)\mod m_1, ..., (a_k×b_k)\mod m_k )(AA~—B)modM=((a1A~—b1)modm1,...,(akA~—bk)modmk)
零知识证明
零知识证明指证明者(P)能向验证者(V)证明自己知道某秘密,且不泄露任何与秘密相关的信息。
- 零知识洞穴协议(直观例子)
- 场景:洞穴深处 C、D 间有一扇需秘密咒语打开的门,P 知道咒语,需向 V 证明但不泄露咒语。
- 步骤:
① P 进入洞穴,随机选择 C 或 D;
② V 随机要求 P 从 A 或 B 出来;
③ 若 P 知道咒语,可根据 V 的要求从指定出口出来(若在 C 则直接从 A 出,若在 D 则开门到 C 再从 A 出,反之亦然);
④ 重复多次,若 P 均能满足要求,V 可相信 P 知道咒语。
- 破译 RSA 能力的零知识证明协议
- 场景:Alice 知道 Carol 的 RSA 私钥ddd,需向 Bob 证明但不泄露ddd。
- 步骤:
① Alice 与 Bob 商定随机数k,mk,mk,m,满足kma^‰¡emodI¨†(n)km≡e\mod φ(n)kma^‰¡emodI¨†(n)(eee为 Carol 的公钥,nnn为模数);
② 共同生成随机密文CCC;
③ Alice 用ddd计算M=CdmodnM=C^d\mod nM=Cdmodn,再计算X=MmmodnX=M^m\mod nX=Mmmodn并发送给 Bob;
④ Bob 验证Xkmodn=CX^k\mod n = CXkmodn=C(因Xk=(Mm)k=Mkm=Me=(Cd)e=Cde=CmodnX^k=(M^m)^k=M^{km}=M^e=(C^d)^e=C^{de}=C\mod nXk=(Mm)k=Mkm=Me=(Cd)e=Cde=Cmodn),若成立则相信 Alice 知道ddd。
不经意传输
指发送者(A)以特定概率向接收者(B)传递秘密,B 知道是否收到秘密,但 A 不知道 B 是否收到。
- 基于大数分解问题的不经意传输协议
- 场景:A 传递秘密为大整数n=pqn=pqn=pq(两素数积)的因数分解。
- 原理:已知某数模nnn的两个不同平方根,可分解nnn。
- 步骤:
① B 随机选xxx,发送x2modnx^2\mod nx2modn给 A;
② A 计算x2modnx^2\mod nx2modn的 4 个平方根A^±x,A^±y±x,±yA^±x,A^±y,随机发送一个给 B;
③ B 检查收到的数是否与A^±x±xA^±x同余:若同余,未获新信息;否则,获得两个不同平方根,可分解nnn(概率 1/2)。
- 基于离散对数问题的不经意传输协议(非交互)
- 系统参数:大素数ppp,GF(p)−{0}GF(p)-\{0\}GF(p)−{0}的生成元ggg,大素数ccc(离散对数未知)。
- B 的密钥生成:随机选比特iii和xxx,计算yi=gxy_i=g^xyi=gx,y1−i=cA^⋅(gx)−1y_{1-i}=c·(g^x)^{-1}y1−i=cA^⋅(gx)−1;公钥为(y0,y1)(y_0,y_1)(y0,y1),私钥为(i,x)(i,x)(i,x)(B 仅知yiy_iyi的离散对数)。
- 协议(二传一):
① A 随机选k0,k1a^ˆˆ[0,p−2]k_0,k_1∈[0,p-2]k0,k1a^ˆˆ[0,p−2],计算cj=gkjc_j=g^{k_j}cj=gkj,dj=yjkjd_j=y_j^{k_j}dj=yjkj,mj=sja^Sˇ•djm_j=s_j⊕d_jmj=sja^Sˇ•dj(s0,s1s_0,s_1s0,s1为 A 的两个秘密,⊕为异或),发送c0,c1,m0,m1c_0,c_1,m_0,m_1c0,c1,m0,m1给 B;
② B 用私钥(i,x)(i,x)(i,x)计算di=yiki=gxA^⋅ki=cixd_i=y_i^{k_i}=g^{x·k_i}=c_i^xdi=yiki=gxA^⋅ki=cix,再得si=mia^Sˇ•dis_i=m_i⊕d_isi=mia^Sˇ•di(无法获取s1−is_{1-i}s1−i,因不知y1−iy_{1-i}y1−i的离散对数)。
- “多传一” 不经意传输协议
- 基于单向函数:
① A 告知 B 单向函数fff,保密f−1f^{-1}f−1;
② B 想获取秘密sis_isi,选x1,...,xkx_1,...,x_kx1,...,xk,发送(y1,...,yk)(y_1,...,y_k)(y1,...,yk)(其中yi=f(xi)y_i=f(x_i)yi=f(xi),yjy_jyj为随机数ja^‰ij≠ija^‰i);
③ A 计算zj=f−1(yj)z_j=f^{-1}(y_j)zj=f−1(yj),发送zja^Sˇ•sjz_j⊕s_jzja^Sˇ•sj给 B;
④ B 用zi=xiz_i=x_izi=xi得si=zia^Sˇ•(zia^Sˇ•si)s_i=z_i⊕(z_i⊕s_i)si=zia^Sˇ•(zia^Sˇ•si),A 不知 B 获取的是哪个秘密。 - 基于大数分解:
① A 构造kkk个 RSA 体制(nj=pjqjn_j=p_jq_jnj=pjqj,pja^‰¡qja^‰¡3mod4p_j≡q_j≡3\mod4pja^‰¡qja^‰¡3mod4),发送加密密钥(ej,nj)(e_j,n_j)(ej,nj)及加密秘密sjejmodnjs_j^{e_j}\mod n_jsjejmodnj;
② B 选xjx_jxj,计算xj2modnjx_j^2\mod n_jxj2modnj及 Jacobi 符号:若想获取sis_isi,发送(xi2modni,J(xi,ni))(x_i^2\mod n_i, J(x_i,n_i))(xi2modni,J(xi,ni))和(xj2modnj,−J(xj,nj))(x_j^2\mod n_j, -J(x_j,n_j))(xj2modnj,−J(xj,nj))(ja^‰ij≠ija^‰i);
③ A 返回与接收的 Jacobi 符号一致的平方根;
④ B 通过xix_ixi和收到的平方根分解nin_ini,得sis_isi(ja^‰ij≠ija^‰i无法分解)。
- 基于单向函数:
- 改进的 “多传一” 不经意传输(保护双方隐私)
- 系统参数:qqq为大素数,GqG_qGq为qqq阶群,生成元g,hg,hg,h;A 的秘密m1,...,mna^ˆˆGqm_1,...,m_n∈G_qm1,...,mna^ˆˆGq,B 的选择I^±Î±I^±。
- 步骤:
① B 发送y=grhI^±′y=g^r h^{α'}y=grhI^±′,y′=gr′hI^±y'=g^{r'} h^{α}y′=gr′hI^±(r,r′,I^±′a^ˆˆZqr,r',α'∈Z_qr,r′,I^±′a^ˆˆZq随机);
② A 发送随机ca^ˆˆZqc∈Z_qca^ˆˆZq;
③ B 发送z1=(r+r′c)modqz_1=(r + r'c)\mod qz1=(r+r′c)modq,z2=(I^±+I^±′c)modqz_2=(α + α'c)\mod qz2=(I^±+I^±′c)modq;
④ A 验证yA^⋅y′c=gz1hz2y·y'^c = g^{z_1}h^{z_2}yA^⋅y′c=gz1hz2,若通过,发送ci=(gki,miA^⋅(y/hi)ki)c_i=(g^{k_i}, m_i·(y/h^i)^{k_i})ci=(gki,miA^⋅(y/hi)ki)(kia^ˆˆZqk_i∈Z_qkia^ˆˆZq随机);
⑤ B 用cI^±=(a,b)c_α=(a,b)cI^±=(a,b)计算mI^±=b/arm_α = b/a^rmI^±=b/ar(因a=gkI^±a=g^{k_α}a=gkI^±,b=mI^±A^⋅(y/hI^±)kI^±=mI^±A^⋅grkI^±b=m_α·(y/h^α)^{k_α}=m_α·g^{r k_α}b=mI^±A^⋅(y/hI^±)kI^±=mI^±A^⋅grkI^±,故b/ar=mI^±b/a^r=m_αb/ar=mI^±)。
比特承诺
承诺者(A)向验证者(B)承诺一个比特 / 消息,承诺后不可篡改,公开时可验证真实性。
- 基于对称加密的比特承诺协议
- 步骤:
① B 生成随机比特串rrr,发送给 A;
② A 选密钥kkk和承诺比特bbb,用对称加密EEE计算c=Ek(r,b)c=E_k(r,b)c=Ek(r,b),发送ccc给 B;
③ 公开时,A 发送kkk和bbb;B 用kkk解密,验证rrr和bbb的一致性。
- 步骤:
- 基于单向函数的比特承诺协议
- 步骤:
① A 生成随机数r1,r2r_1,r_2r1,r2,计算h=H(r1,r2,M)h=H(r_1,r_2,M)h=H(r1,r2,M)(HHH为单向函数 / Hash 函数),发送hhh和r1r_1r1给 B;
② 公开时,A 发送r2r_2r2和消息MMM;B 计算H(r1,r2,M)H(r_1,r_2,M)H(r1,r2,M),与hhh比对验证。
- 步骤:
- 基于离散对数的 Pedersen 承诺(消息承诺)
- 系统参数:大素数p=2q+1p=2q+1p=2q+1(qqq为大素数),GqG_qGq为Zp∗Z_p^*Zp∗的qqq阶子群,生成元ggg。
- 步骤:
① B 发送GqG_qGq中随机元素hhh给 A;
② A 选承诺密钥ra^ˆˆZq∗r∈Z_q^*ra^ˆˆZq∗,计算承诺值C=gxhrmodpC=g^x h^r \mod pC=gxhrmodp(xxx为消息),发送CCC给 B;
③ 公开时,A 发送xxx和rrr;B 验证C=gxhrmodpC=g^x h^r \mod pC=gxhrmodp。 - 性质:隐藏性(无法从CCC推出xxx)、约束性(基于离散对数难题,A 无法篡改xxx)。
其他协议相关概念
- 防止重放攻击:通过时间戳、随机数等机制,避免攻击者重复发送截获的协议消息以欺骗合法方。
- 密钥确证:协议参与方验证对方是否真正掌握协商的密钥,确保密钥一致性和安全性。
- 证书与可信第三方(TA):TA 负责初始化发放证书(含用户公钥及验证签名算法),仅在纠纷时参与,密钥协商过程无需 TA 在线;证书确保用户身份真实性(发放时 TA 验明身份)。