格基规约在ctf中的简单应用
字数 1305 2025-08-06 12:21:08
格基规约在CTF中的简单应用
1. 格密码简介
格密码(Lattice-based Cryptography)是后量子密码学的重要分支。2020年7月22日,NIST公布的后量子密码标准竞赛第三轮入选算法中,有5个属于格密码范畴。格密码的安全性基于格中的数学难题,如最短向量问题(SVP)和最近向量问题(CVP)。
2. 基础概念
2.1 格的定义
给定一组线性无关的基向量 v₁, v₂, ..., vₙ,这些基向量的所有整系数线性组合形成的集合称为格:
L = {a₁v₁ + a₂v₂ + ... + aₙvₙ | aᵢ ∈ ℤ}
2.2 格中的困难问题
- 最短向量问题(SVP):在格中找到最短的非零向量
- 最近向量问题(CVP):给定一个不在格中的向量v,找到格中离v最近的向量u
2.3 LLL算法
LLL(Lenstra-Lenstra-Lovász)算法是一种格基约化算法,可以看作是二维格上高斯约化算法在高维格上的扩展。它能找到近似最短向量,在较低维度的格中效果较好。
3. CTF中的典型应用
3.1 背包加密问题
3.1.1 问题描述
给定一个数组c和结果enc,求解xᵢ ∈ {0,1}使得:
enc ≡ ∑ cᵢxᵢ mod p
3.1.2 解题步骤
-
构造(n+1)×(n+1)的矩阵:
[1 0 ... 0 c₀] [0 1 ... 0 c₁] [... ...] [0 0 ... 1 cₙ] [0 0 ... 0 -enc] -
应用LLL算法约化基
-
寻找全由0和1组成的行向量,即为解
3.1.3 示例代码
c = [...] # 无序序列
p = ... # 模数
enc = ... # 加密结果
for i in range(30): # 考虑模数带来的多解可能
current_enc = enc + i*p
nbit = len(c)
A = Matrix(ZZ, nbit+1, nbit+1)
for i in range(nbit):
A[i,i] = 1
for i in range(nbit):
A[i,nbit] = c[i]
A[nbit,nbit] = -current_enc
res = A.LLL()
for row in res:
if all(x in (0,1) for x in row[:-1]):
solution = row[:-1]
print(''.join(str(x) for x in solution))
break
3.2 NTRU加密系统
3.2.1 算法描述
- 选择公共参数q
- 选择小整数f,g满足f ≪ g
- 计算公钥:h ≡ f⁻¹ * g mod q
- 加密:c ≡ r*h + m mod q
- 解密:
- a ≡ f*c mod q
- b ≡ a mod g
- m ≡ b*f⁻¹ mod g
3.2.2 攻击方法
寻找满足F*h ≡ G mod q的(F,G),可以构造格:
[[1, h],
[0, q]]
应用LLL算法找到最短向量(F,G),即可用于解密。
3.3 [羊城杯 2022]LRSA题目解析
3.3.1 题目分析
给定:
- P²Q和PQ²,可求出P和Q
- t = (pP - 58P + q) mod Q
- 目标:恢复p,q
3.3.2 解题步骤
-
计算PQ = gcd(P²Q, PQ²)
-
分别求出P和Q
-
构造格:
[[1, P], [0, Q]] -
应用LLL找到最短向量(p-58, t-q)
-
恢复p和q
-
正常RSA解密
3.3.3 示例代码
from Crypto.Util.number import *
B = 1023
PPQ = 1755077239... # 题目给定的大数
PQQ = 1763250373... # 题目给定的大数
t = 44
c = 4364802217... # 密文
e = 65537
# 计算P和Q
PQ = gcd(PPQ, PQQ)
P = PPQ // PQ
Q = PQQ // PQ
# 构造格并应用LLL
L = matrix(ZZ, [[1, P], [0, Q]])
v = L.LLL()[0]
p_58, t_q = map(abs, v)
# 恢复p和q
p = p_58 + 58
q = t_q + t
# RSA解密
n = p*q
phi = (p-1)*(q-1)
d = inverse_mod(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
# 输出: DASCTF{8f3djoj9wedj2_dkc903cwckckdk}
4. 总结
- 背包问题可以通过构造特定格并应用LLL算法解决
- NTRU等格密码系统可能因参数选择不当而被LLL攻击
- 在CTF中,遇到模方程、小未知数等问题时,可考虑格基约化方法
- LLL算法在低维格中效果较好,高维时效果会下降
5. 关键点
- 问题转换:将加密问题转化为寻找格中短向量的问题
- 矩阵构造:正确构造格基矩阵是应用LLL的关键
- 参数范围:LLL适用于小未知数情况,大数效果不佳
- 多解处理:模运算可能带来多解,需要遍历可能的解空间
6. 参考资料
- 格密码学习笔记 - gal2xy's blog
- 格密码简介 - lazzzaro's blog
- 格密码基础 - ruanx.net
- NIST后量子密码标准化项目