格密码学基础

格密码学—Lattice-based Crypto 是现在比较火的一个密码学分支,而且本身拥有抵抗量子计算的特性。在即将到来的NIST后量子时代加密算法标准化讨论中,基于格的加密体系就是其中的一个选择之一。其实想要理解格密码学非常简单,只需要一些最基本的线性代数知识。

格密码学就是基于格(Lattice)和格上的一些问题而定义的一套密码学体系。

关于基础数学知识及入门可参考:https://zhuanlan.zhihu.com/p/150920501

格密码

线性独立空间上有集合 v 1 , ⋯   , v n ∈ R n v_1,\cdots,v_n \in \mathbb{R}^n v1,,vnRn,格(Lattices)就是这些向量的线性组合,用公式表示为:

L = { a 1 v 1 + a 2 v 2 + ⋯ + a n v n ∣ a 1 , a 2 , ⋯   , a n ∈ Z } L=\{a_1v_1+a_2v_2+\cdots+a_nv_n \mid a_1,a_2,\cdots,a_n \in \mathbb{Z}\} L={a1v1+a2v2++anvna1,a2,,anZ}

L L L 的维数等于格中向量的个数。

假定 v 1 , v 2 , ⋯   , v n v_1,v_2,\cdots,v_n v1,v2,,vn 是格 L L L 的基, w 1 , w 2 , ⋯   , w n ∈ L w_1,w_2,\cdots,w_n \in L w1,w2,,wnL,则必然存在整系数 a i j a_{ij} aij 使得:

{ w 1 = a 11 v 1 + a 12 v 2 + ⋯ + a 1 n v n w 2 = a 21 v 1 + a 22 v 2 + ⋯ + a 2 n v n ⋮ w n = a n 1 v 1 + a n 2 v 2 + ⋯ + a n n v n \begin{cases} w_1=a_{11}v_1+a_{12}v_2+\cdots+a_{1n}v_n \\ w_2=a_{21}v_1+a_{22}v_2+\cdots+a_{2n}v_n \\ \vdots \\ w_n=a_{n1}v_1+a_{n2}v_2+\cdots+a_{nn}v_n \end{cases} w1=a11v1+a12v2++a1nvnw2=a21v1+a22v2++a2nvnwn=an1v1+an2v2++annvn

这样,格的问题就是矩阵运算了。

最短向量问题(SVP,The Shortest Vector Problem):

寻找一个格 L L L 中最短的非零向量。即,寻找一个 v ∈ L v \in L vL 满足其欧几里德范数 ∣ ∣ v ∣ ∣ \mid\mid v \mid\mid v 最小。

最接近向量问题(CVP,The Closest Vector Problem):

对于一个非格 L L L 中的向量 w w w,在格中寻找一个向量 v v v,使得 ∣ ∣ w − v ∣ ∣ \mid\mid w-v \mid\mid wv 最小。

NTRU格密码

NTRU(Number Theory Research Unit)是一种基于多项式环构造的公钥密码体制,1996年由J.Hofftstein、J.Pipher、J.H.Sliverman三位数学教授设计,可抵抗量子计算机的攻击。NTRU的优点是密钥短且容易生成,加密、解密的速度快,所需存储空间小,不足之处是解密可能出错。

NTRU是一个带有专利保护的开源公开密钥加密系统,使用基于格的加密算法来加密数据。它包括两部分算法:NTRUEncrypt用来加密,NTRUSign用来进行数字签名。与其他流行的公钥加密系统不同,它可以防止被Shor算法破解,并显著提升了性能。在同等加密强度下,NTRU执行大开销的私钥操作比RSA算法快得多。

NTRU密码体制,需要三个整数参数 ( n , p , q ) (n,p,q) (n,p,q) 和四个次数为 n − 1 n-1 n1 的整系数多项式集合 L f , L g , L φ , L m L_f,L_g,L_{\varphi},L_m Lf,Lg,Lφ,Lm;其中 n n n 为素数, p , q p,q p,q 可以不必为素数,但要求 gcd ⁡ ( p , q ) = 1 \gcd(p,q)=1 gcd(p,q)=1,且 q q q 远大于 p p p。其中 n = 263 , 503 n=263,503 n=263,503时,安全性分别与RSA1024、RSA2048相当。

NTRU工作于多项式整数环 R = Z [ x ] / ( x n − 1 ) \mathbb{R}=\mathbb{Z}[x]/(x^n-1) R=Z[x]/(xn1),表示系数小于N的整系数多项式全体,环中的元素 f ( x ) = f n − 1 x n − 1 + … + f 1 x + f 0 , g ( x ) = g n − 1 x n − 1 + … + g 1 x + g 0 f(x)=f_{n-1}x^{n-1}+…+f_1x+f_0,g(x)=g_{n-1}x^{n-1}+…+g_1x+g_0 f(x)=fn1xn1++f1x+f0,g(x)=gn1xn1++g1x+g0,定义运算为

f ( x ) + g ( x ) = ( f n − 1 + g n − 1 ) x n − 1 + … + ( f 1 + g 1 ) x + ( f 0 + g 0 ) f(x)+g(x)=(f_{n-1}+g_{n-1})x^{n-1}+…+(f_1+g_1)x+(f_0+g_0) f(x)+g(x)=(fn1+gn1)xn1++(f1+g1)x+(f0+g0)
f ( x ) ∗ g ( x ) = f ( x ) g ( x ) ( m o d x n − 1 ) = ∑ i = 1 n − 1 ( ∑ s + t ≡ i ( m o d n ) f s g t ) x i f(x)*g(x)=f(x)g(x) (mod x^n-1)=\sum\limits_{i=1}^{n-1}(\sum\limits_{s+t\equiv i \pmod n} f_sg_t)x^i f(x)g(x)=f(x)g(x)(modxn1)=i=1n1(s+ti(modn)fsgt)xi

L ( d 1 , d 2 ) = { F ∈ R : F L(d_1,d_2)=\{F \in \mathbb{R}:F L(d1,d2)={FR:F d 1 d_1 d1 个系数为 1 1 1 d 2 d_2 d2 个系数为 − 1 -1 1,其余为 0 } 0\} 0},选取三个确定的整数 d f , d g , d φ d_f,d_g,d_{\varphi} df,dg,dφ,多项式集合 L f = L ( d f , d f − 1 ) , L g = L ( d g , d g ) , L φ = L ( d φ , d φ ) L_f=L(d_f,d_{f-1}),L_g=L(d_g,d_g),L_{\varphi}=L(d_{\varphi},d_{\varphi}) Lf=L(df,df1),Lg=L(dg,dg),Lφ=L(dφ,dφ),而 L m = { m ∈ R : m L_m=\{m \in \mathbb{R}:m Lm={mR:m 的系数位于区间 [ − p − 1 2 , p − 1 2 ] [-\cfrac{p-1}{2},\cfrac{p-1}{2}] [2p1,2p1],其中 p p p 为素数 } \} }

密钥生成

随机选择两个小多项式 f f f g g g(系数时稀疏的,即系数中0的比例很高), f ∈ L f , g ∈ L g f\in L_f,g\in L_g fLf,gLg

可算出 f f f m o d    p \mod p modp m o d    q \mod q modq 的逆元 F p F_p Fp F q F_q Fq

F q ∗ f ≡ 1 ( m o d q ) 和 F p ∗ f ≡ 1 ( m o d p ) Fq*f≡1\pmod q和Fp*f≡1\pmod p Fqf1(modq)Fpf1(modp)

因此, f f f 首先应满足 gcd ⁡ ( f ( 1 ) , p q ) = 1 \gcd(f(1),pq)=1 gcd(f(1),pq)=1,如果有一个逆不存在,需重新选择 f f f

然后,计算 h ≡ p F q ∗ g ( m o d q ) h \equiv pF_q * g \pmod q hpFqg(modq),则公钥为 h h h,私钥为 ( f , F q ) (f,F_q) (f,Fq)

加密

假设A想发送信息 m ∈ L m m \in L_m mLm 给B,他将根据参数 d φ d_{\varphi} dφ 随机选择一个 φ ∈ L φ \varphi \in L_{\varphi} φLφ,然后,利用B的公钥 h h h 计算密文 c ≡ φ ∗ h + m ( m o d q ) c \equiv \varphi * h+m \pmod q cφh+m(modq)

解密

当B收到密文 c c c 后,他首先利用私钥 f f f 计算 a ≡ f ∗ c ( m o d q ) a \equiv f * c \pmod q afc(modq)

选择 a a a 的系数位于 [ − q 2 , q 2 ] [-\cfrac{q}{2},\cfrac{q}{2}] [2q,2q] 之间,然后计算

e ≡ F p ∗ a ( m o d p ) e \equiv F_p* a \pmod p eFpa(modp)

则多项式 e e e 就是明文 m m m

例题
(深育杯)

from Crypto.Util.number import *
import gmpy2
from flag import flag


def generate():
    p = getStrongPrime(2048)
    while True:
        f = getRandomNBitInteger(1024)
        g = getStrongPrime(768)
        h = gmpy2.invert(f, p) * g % p
        return (p, f, g, h)


def encrypt(plaintext, p, h):
    m = bytes_to_long(plaintext)
    r = getRandomNBitInteger(1024)
    c = (r * h + m) % p
    return c


p, f, g, h = generate()
c = encrypt(flag, p, h)
with open("cipher.txt", "w") as f:
    f.write("h = " + str(h) + "\n")
    f.write("p = " + str(p) + "\n")
    f.write("c = " + str(c) + "\n")

from gmpy2 import *
h = 3967900409518491437091166715380802161532841159072519563471354336400750930009970177101953304861954502146570721506995224520631716261108071684882841102381144720177664434981608584075201907891964214604246219441325377602163957172642582158192223452845671007585556951922415200415538060247456213608112360361636912703380306386439846269645696750929811607783895294670639202472465920599542568227657152922843001792754116981992696203788298740550812661583820191877594185184758074771316815650833195023325150218113883046328740408517222933980589974912467363367727038230703152354450353199257411964288022409128890352346036423792759938468964462267528727695183747947515480432786669353434638860350849296620606820894819933050645748656981993408399675189724419997805599649975500093890450393421897803267909569938850674774386012819838940544502656293639875120854745249463561940935651895728242282430164407574626178693654713011323376912585958110558532953333
p = 4407206782832544188667944201727813617189883940490534227436068867901196311508151544316989531306678865408607390128649278629254128753967046691736522108356971272311308455619879297358588727267184200777923695048248757115057072357087881336680504033511958280710547178971268670442650871890760916203109226852889599638484429889898210426540567794020013920566784973281560628666918122674783539653720295629054898529900882965691587718212291373734218555167591690910246380516121338139063419587750344469214004539520017140593342859857394308703001939640899189432836134392830208318268131639318655382175643272565186884496188876341460968563623529229713790076050095498053846983536874648190033735162809614805624209827336432223553914651838063614534617044557310972056169869738746432924853953258079006936103497626054364115282007843847693813896856977882285910369660539092462408790126385881581833165309032853389777355480169212478669139225609058338565029211
c = 4052491539376955553220568757544621659293304958837707160681090710624505862889512520190589879197831394720145909992216099963759496125523078969015706069688556356682711471641851937470179182960755800968587551608595725470945584970094036299764623894583379909329996337429067328575804567222496890803396234507278490116354758303807070775249711087938549824010697869930856205244006491475201993228121418890520174179969294094963249013786611889790711801269524919695653453576043288934196952437164829830756439734795068980207758771052483500272264363028346668629397497794792110170275173209377114274164087320163340547019935562316429227119346802124620682293405375798340275679831750482339301440428527223801872439611461272229275824994734898078664180541096159146759378804836952981089673755590353588900522455968721971944276318473421193690310601002295637581030417570868955379815661133148339565983621730401675643094909263098778572081973142223744746526672

M = Matrix([[1, h], [0, p]])

fg = M.LLL()[0]
f, g = abs(fg[0]), abs(fg[1])
m = (c * f % p) * invert(f, g) * invert(f, g) % g

print(bytes.fromhex(hex(m)[2:]))

GGH加密

1997年,Goldreich、Goldwasser、Halevi三人受Ajtai在格难题上的研究所启发,提出了一个基于格中最近向量难题的非对称密码学算法:GGH Cryptosystem。

1999年,Nguyen发现在这个密码学算法设计中,有一个很大的缺陷,可以使攻击者从密文中获取到明文的部分信息,且可以将原来的最近向量难题转化为一个较为简单的最近向量难题。基于这个观察,Nguyen解出了设计者放在网上的5个challenge中的4个(其中有2个被设计者认为是不可能攻破的),足以证明该密码算法是broken的。

定义
GGH包含一个私钥和一个公钥,选取格 L L L 的一组好基 B B B 和一个幺模矩阵 U U U 作为私钥,计算 L L L 的另一组基 B ’ = U B B’=UB B=UB 作为公钥。

选定 M M M 值,明文向量 ( m 1 , m 2 , ⋯   , m n ) , m i ∈ ( − M , M ) (m_1,m_2,\cdots,m_n), \quad m_i \in(-M,M) (m1,m2,,mn),mi(M,M)

加密
给定明文 m = ( m 1 , m 2 , ⋯   , m n ) m=(m_1,m_2,\cdots,m_n) m=(m1,m2,,mn),误差向量 e e e,和公钥 B ’ B’ B,计算 v = m ⋅ B ’ = ∑ m i b i ’ v=m \cdot B’=\displaystyle\sum m_ib_i’ v=mB=mibi
密文 c = v + e = m ⋅ B ’ + e c=v+e=m \cdot B’+e c=v+e=mB+e

解密
计算 c ⋅ B − 1 = ( m ⋅ B ’ + e ) B − 1 = m ⋅ U ⋅ B ⋅ B − 1 + e ⋅ B − 1 = m ⋅ U + e ⋅ B − 1 c \cdot B^{-1}=(m \cdot B’+e)B^{-1}=m \cdot U \cdot B \cdot B^{-1}+e \cdot B^{-1}=m \cdot U+e \cdot B^{-1} cB1=(mB+e)B1=mUBB1+eB1=mU+eB1
如果 e ⋅ B − 1 e \cdot B^{-1} eB1 足够小,可利用Babai最近平面算法的变种Babai rounding technique去除;
最后计算 m = m ⋅ U ⋅ U − 1 m=m \cdot U \cdot U^{-1} m=mUU1 得到明文。

GGH中的误差向量的选取是3或者-3。

参考
https://lazzzaro.github.io/2020/11/07/crypto-%E6%A0%BC%E5%AF%86%E7%A0%81/

https://4xwi11.github.io/posts/a2b6ecd3/

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值