Misay's blog

Back

Goldwasser-Micali公钥加密#

预处理#

  • 大整数N=p  ⋅  qN=p\;\cdot\;q

  • 取二次非剩余yy,即J(yp)=J(yq)=−1J(\frac{y}{p})=J(\frac{y}{q})=-1

  • 公钥为PK=(y,N)PK=(y,N),私钥为SK=(p,q)SK=(p,q)

加密#

  • 将明文bb转化为01数字串M=(m1,m2,⋯ )M=(m_1,m_2,\cdots)

  • 对于每一位 mim_i , 我们随机选取一个 r∈  Zn∗r\in\;Z_{n}^{*} 计算   ci≡  ymi⋅  r2  mod  n\;c_i\equiv\;y^{m_i}\cdot\;r^2\;mod\;n

  • 生成密文C=(c1,c2,⋯ )C=(c_1,c_2,\cdots)

解密#

  • 获得密文C=(c1,c2,⋯ )C=(c_1,c_2,\cdots)

  • 计算cic_i分别对p,qp,q的雅可比符号J(cip)  J(ciq)J(\frac{c_i}{p})\;J(\frac{c_i}{q})

  • 如果J(cip)  =  J(ciq)  =  1J(\frac{c_i}{p})\;=\;J(\frac{c_i}{q})\;=\;1,说明mi=0m_i=0,否则mi=1m_i=1

证明如下

因为

ci≡  ymi∗r2  mod  nc_i\equiv\;y^{m_i}*r^2\;mod\;n

当mi=0m_i=0,式子变为

ci≡  r2  mod  nc_i\equiv\;r^2\;mod\;n

此时我们可以往下转移到模pp,qq下,也就是满足cic_i是p,qp,q的二次剩余

当mi=1m_i=1,由于yy不是p,qp,q的二次剩余,那么我们就说

∀  t∈  Zp∗      y≢  t2  mod  p\forall\;t\in\;Z_p^*\;\;\;y\not\equiv\;t^2\;mod\;p

也就是说

∀  t∈  Zp∗      c≢  (rt)2  mod  p\forall\;t\in\;Z_p^*\;\;\;c\not\equiv\;(rt)^2\;mod\;p

也就是说cic_i不是p,qp,q的二次剩余,证毕

数论的香氛#

题目https://buuoj.cn/match/matches/213/challenges ↗ 我们回顾一下加密过程

c≡  ym  ⋅  x279  mod  nc\equiv\;y^m\;\cdot\;x^{2^{79}}\;mod\;n

和这个公钥加密有一定相似之处 ,但是这里的mm都是79个比特,那就是稍微进行变种的Goldwasser-Micali,

我们能找到这篇paper 435.pdf (iacr.org) ↗

我们来分析一下这篇paper中的加密原理

预处理#

  • 生成两个大素数p,qp,q满足p≡  1  mod  2kp\equiv\;1\;mod\;2^k,q≡3  mod  4q\equiv3\;mod\;4,使得群Zp∗Z^*_p的阶恰好包含一个2k2^k
  • 生成公钥 yy 满足   (yp)2k=−1  \;(\frac{y}{p})_{2^k}=-1\; ;   (yq)2k=1  \;(\frac{y}{q})_{2^k}=1\; 即 yy 是 pp 的 2k2^k 次非剩余,而是 qq 的 2k2^k 次剩余
  • 代码中为了省事直接生成 p,qp,q 的二次非剩余 yy ,如果不行多生成几次就ok

加密#

  • 计算 ci≡  ymi  ⋅  x2k  mod  nc_i\equiv\;y^{m_i}\;\cdot\;x^{2^k}\;mod\;n 即可;保证 x∈  Zn∗x\in\;Z^*_n

解密#

原理#

我们主要关注群 Zp∗Z^*_p ,它的阶是 Ord(Zp∗)=p−1=r⋅2kOrd(Z^*_p)=p-1=r\cdot2^k

注意到我们已经给xx取了2k2^k次方,后续做任何有关是否为2k2^k或者2k−i2^{k-i}次剩余的判断 它都恒定为真,毕竟

x2k=(x2i)2k−i=(x′)2k−ix^{2^k}=(x^{2^i})^{2^{k-i}}=(x^{'})^{2^{k-i}}

也就是说我们模仿GM公钥解密的过程 完全消去了无关变量xx,这其实和我们之前DLP做法有点像,先把xx干掉

接下来我们提前获得了nn的分解p,qp,q我们尝试来解这个mm

注意到py的bytes_to_long函数就是计算

m=∑  mi  2im=\sum\;m_i\;2^{i}

我们来考虑计算一个指数因子

ei=p−12k−i=r  2ie_i=\frac{p-1}{2^{k-i}}=r\;2^i

我们给加密的式子左右乘上指数因子次幂,得到

cei≡  ym  ⋅  ei  ⋅  (x2k)ei  mod  pc^{e_i}\equiv\;y^{m\;\cdot\;e_i}\;\cdot\;(x^{2^k})^{e_i}\;mod\;p

我们注意(x2k)ei(x^{2^k})^{e_i}这一项对判断2k2^k阶剩余没有影响,我们关注ym  ⋅  eiy^{m\;\cdot\;e_i},我们把它展开

由于

m=∑j=0k−1mj  ⋅  2jm=\sum^{k-1}_{j=0}m_j\;\cdot\;2^j

故

m  ei=  r  ∑j=0k−1mj  ⋅  2i+jm\;e_i=\;r\;\sum^{k-1}_{j=0}m_j\;\cdot\;2^{i+j}

分为三个部分

ym  ei=yr  (∑j+i<k⋯+mk−i2k+∑j+i>k⋯ )=yr  (∑j+i<k⋯ )  ⋅  yr  (∑j+i>k⋯ )  ⋅  yrmk−i2ky^{m\;e_i}=y^{r\;(\sum_{j+i<k}\cdots+m_{k-i}2^{k}+\sum_{j+i>k}\cdots)}=y^{r\;(\sum_{j+i<k}\cdots)}\;\cdot\;y^{r\;(\sum_{j+i>k}\cdots)}\;\cdot\;y^{rm_{k-i}2^k}
  • 对于后部分 我们的因子都可以拆分为2k+δ>2k2^{k+\delta}>2^k,它们进行2k2^k判断的结果会是1,理解为1α1^{\alpha}这部分的yr  (∑j+i>k⋯ )=(yr∑⋯)2ky^{r\;(\sum_{j+i>k}\cdots)}=(y^{r\sum\cdots})^{2^k}一定是2k2^k次剩余
  • 对于前部分 我们的因子都可以拆分为2k−β<2k2^{k-\beta}<2^k,它们进行2k2^k判断你可以理解为1−β1^{-\beta},也一定是1
  • 所以我们只要关注中间的部分,即yrmk−i2ky^{rm_{k-i}2^k}
    • 如果mk−i=0m_{k-i}=0,很好,这一项是1,最后你剩余检查出来会是1
    • 如果mk−i=1m_{k-i}=1,我们注意到这里就保留了我们不愿意看到的yy,那么∀  t∈  Zp∗      y≢  t2k  mod  p\forall\;t\in\;Z_p^*\;\;\;y\not\equiv\;t^{2^k}\;mod\;p这个时候,我们计算2k2^k次剩余出来就会是-1

我们来调整一下脚本 使得我们能从 m1m_{1} 到 mim_{i} 来进行验证,注意到我们取 eie_i ,进行 2k2^k 次剩余检查,能查出来 mk−im_{k-i} 的取值是0或者1,那么我们不妨从 k−ik-i 算 起,使得我们验证的 mim_i 下标从0开始

大致思路如上 脚本可以写出来

Goldwasser-Micali公钥加密以及拓展
https://www.zt2misay2.cn/blog/goldwasser-micali%E5%85%AC%E9%92%A5%E5%8A%A0%E5%AF%86%E4%BB%A5%E5%8F%8A%E6%8B%93%E5%B1%95
Author Misay
Published at 2025年7月7日