浅析GGH加密

上一篇对于 LWE 问题的理解可把我折磨坏了,接下来再看看 GGH 加密;

GGH加密

1. 基础概念

这种加密方法是由 Goldreich、Goldwasser、Halevi 三人在 1997 年发明的,是关于 CVP 难题的算法,据说是启发于 Ajtai 在格难题上的研究;
但是遗憾的是在 1999 年就被 Nguyen 设计的算法给破解了,直接将其转化为一个简单的 CVP 问题;(°ー°〃)
基本的 GGH 选取一组 good basic B 和一个幺模矩阵 U 作为私钥,计算得到\(B_0=UB\)作为公钥;
Enc过程:

  1. 明文\(m=(m_1,m_2,……,m_n)\),误差向量 e 和公钥\(B_0\),计算\(a=m*B_0=\Sigma m_ib_{0i}\)
  2. 得到\(c=a+e=mB_0+e\)

Dec过程:

  1. \(cB^{-1}=(mB_0+e)B^{-1}=mUBB^{-1}+eB^{-1}=mU+eB^{-1}\)
  2. \(eB^{-1}\)足够小时,可以通过 babai 算法来得到最近向量;
  3. 然后\(m=mUU^{-1}\),结束;

2. 分析过程

在加密过程中,误差向量 e 的每一项不是 3 就是 -3 ,这给问题简化提供了条件;
我们的已知条件为 c、B,需要得到 m ;
先试着对上式模 3 运算\(c_3=m_3B_3+e_3 \ (mod \ 3)\),考虑到 e 的数值,这里的式子就是:\(c_3=m_3B_3\ (mod\ 3)\),因此可以得到明文 mod 3 的结果;
后来 Nguyen 分析出模 6 是一个更好的选择,先取\(s=(3,3,……,3)\),可得 s+e 中每一项的值都是 6 或者 0,取模 6 后也 0;
式子两边都加上 s 得到:\(c+s=mB+(e+s)\),取模后得到:\(c_6=m_6B_6\ (mod\ 6)\),这样得到明文 mod 6 后的结果;
之后进行问题简化;
具体推导为:

\[c-m_6B=(m-m_6)B+e \]

其中的\(m-m_6\)中的每一项根据同余运算发现都是六的倍数,可表示为\(6m_0\),然后进行以下推导:

\[\frac{c-m_6B}{6}=\frac{(m-m_6)B}{6}+\frac{e}{6} \]

\[\frac{c-m_6B}{6}=m_0B+\frac{e}{6} \]

\[c_0=m_0B+e_0 \]

对于上述式子,\(c_0\)可得,\(e_0\)的每一项都为 1/2 或 -1/2;
这样就简化了原本复杂的CVP问题,得到的\(e_0、c_0\)都比原本要小;
然后通过 embedded technique 把问题转化为 SVP ,再通过 LLL 求解,即可得到\(e_0\),进一步算出明文;

下面是Lazzaro大佬的脚本 @ https://lazzzaro.github.io

点击查看代码
# Sage
# Read ciphertext and public key.
c = []
c = vector(ZZ, c)

B = []
B = matrix(ZZ, B)

# Nguyen's Attack.
n = 150
delta = 3
s = vector(ZZ, [delta]*n)
B6 = B.change_ring(Zmod(2*delta))
left = (c + s).change_ring(Zmod(2*delta))
m6 = (B6.solve_left(left)).change_ring(ZZ)
new_c = (c - m6*B) * 2 / (2*delta)

# embedded technique
new_B = (B*2).stack(new_c).augment(vector(ZZ, [0]*n + [1]))
new_B = new_B.change_ring(ZZ)

new_B_BKZ = new_B.BKZ()
shortest_vector = new_B_BKZ[0]
mbar = (B*2).solve_left(new_c - shortest_vector[:-1])
m = mbar * (2*delta) + m6

print(bytes.fromhex(hex(m)[2:]))
参考:
[Intended Solution to GGH in GYCTF 2020](https://blog.soreatu.com/posts/intended-solution-to-ggh-in-gyctf-2020/ "Intended Solution to GGH in GYCTF 2020");
posted @ 2023-05-04 00:06  Vect0r  阅读(310)  评论(0)    收藏  举报