浅析GGH加密
上一篇对于 LWE 问题的理解可把我折磨坏了,接下来再看看 GGH 加密;
GGH加密
1. 基础概念
这种加密方法是由 Goldreich、Goldwasser、Halevi 三人在 1997 年发明的,是关于 CVP 难题的算法,据说是启发于 Ajtai 在格难题上的研究;
但是遗憾的是在 1999 年就被 Nguyen 设计的算法给破解了,直接将其转化为一个简单的 CVP 问题;(°ー°〃)
基本的 GGH 选取一组 good basic B 和一个幺模矩阵 U 作为私钥,计算得到\(B_0=UB\)作为公钥;
Enc过程:
- 明文\(m=(m_1,m_2,……,m_n)\),误差向量 e 和公钥\(B_0\),计算\(a=m*B_0=\Sigma m_ib_{0i}\);
- 得到\(c=a+e=mB_0+e\);
Dec过程:
- \(cB^{-1}=(mB_0+e)B^{-1}=mUBB^{-1}+eB^{-1}=mU+eB^{-1}\);
- 当\(eB^{-1}\)足够小时,可以通过 babai 算法来得到最近向量;
- 然后\(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 后的结果;
之后进行问题简化;
具体推导为:
其中的\(m-m_6\)中的每一项根据同余运算发现都是六的倍数,可表示为\(6m_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");

浙公网安备 33010602011771号