格密码学基础
格密碼學(xué)—Lattice-based Crypto 是現(xiàn)在比較火的一個(gè)密碼學(xué)分支,而且本身擁有抵抗量子計(jì)算的特性。在即將到來的NIST后量子時(shí)代加密算法標(biāo)準(zhǔn)化討論中,基于格的加密體系就是其中的一個(gè)選擇之一。其實(shí)想要理解格密碼學(xué)非常簡單,只需要一些最基本的線性代數(shù)知識(shí)。
格密碼學(xué)就是基于格(Lattice)和格上的一些問題而定義的一套密碼學(xué)體系。
關(guān)于基礎(chǔ)數(shù)學(xué)知識(shí)及入門可參考:https://zhuanlan.zhihu.com/p/150920501
格密碼
線性獨(dú)立空間上有集合 v1,?,vn∈Rnv_1,\cdots,v_n \in \mathbb{R}^nv1?,?,vn?∈Rn,格(Lattices)就是這些向量的線性組合,用公式表示為:
L={a1v1+a2v2+?+anvn∣a1,a2,?,an∈Z}L=\{a_1v_1+a_2v_2+\cdots+a_nv_n \mid a_1,a_2,\cdots,a_n \in \mathbb{Z}\}L={a1?v1?+a2?v2?+?+an?vn?∣a1?,a2?,?,an?∈Z}。
格 LLL 的維數(shù)等于格中向量的個(gè)數(shù)。
假定 v1,v2,?,vnv_1,v_2,\cdots,v_nv1?,v2?,?,vn? 是格 LLL 的基,w1,w2,?,wn∈Lw_1,w_2,\cdots,w_n \in Lw1?,w2?,?,wn?∈L,則必然存在整系數(shù) aija_{ij}aij? 使得:
{w1=a11v1+a12v2+?+a1nvnw2=a21v1+a22v2+?+a2nvn?wn=an1v1+an2v2+?+annvn\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?=a11?v1?+a12?v2?+?+a1n?vn?w2?=a21?v1?+a22?v2?+?+a2n?vn??wn?=an1?v1?+an2?v2?+?+ann?vn??
這樣,格的問題就是矩陣運(yùn)算了。
最短向量問題(SVP,The Shortest Vector Problem):
尋找一個(gè)格 LLL 中最短的非零向量。即,尋找一個(gè) v∈Lv \in Lv∈L 滿足其歐幾里德范數(shù) ∣∣v∣∣\mid\mid v \mid\mid∣∣v∣∣ 最小。
最接近向量問題(CVP,The Closest Vector Problem):
對(duì)于一個(gè)非格 LLL 中的向量 www,在格中尋找一個(gè)向量 vvv,使得 ∣∣w?v∣∣\mid\mid w-v \mid\mid∣∣w?v∣∣ 最小。
NTRU格密碼
NTRU(Number Theory Research Unit)是一種基于多項(xiàng)式環(huán)構(gòu)造的公鑰密碼體制,1996年由J.Hofftstein、J.Pipher、J.H.Sliverman三位數(shù)學(xué)教授設(shè)計(jì),可抵抗量子計(jì)算機(jī)的攻擊。NTRU的優(yōu)點(diǎn)是密鑰短且容易生成,加密、解密的速度快,所需存儲(chǔ)空間小,不足之處是解密可能出錯(cuò)。
NTRU是一個(gè)帶有專利保護(hù)的開源公開密鑰加密系統(tǒng),使用基于格的加密算法來加密數(shù)據(jù)。它包括兩部分算法:NTRUEncrypt用來加密,NTRUSign用來進(jìn)行數(shù)字簽名。與其他流行的公鑰加密系統(tǒng)不同,它可以防止被Shor算法破解,并顯著提升了性能。在同等加密強(qiáng)度下,NTRU執(zhí)行大開銷的私鑰操作比RSA算法快得多。
NTRU密碼體制,需要三個(gè)整數(shù)參數(shù) (n,p,q)(n,p,q)(n,p,q) 和四個(gè)次數(shù)為 n?1n-1n?1 的整系數(shù)多項(xiàng)式集合 Lf,Lg,Lφ,LmL_f,L_g,L_{\varphi},L_mLf?,Lg?,Lφ?,Lm?;其中 nnn 為素?cái)?shù),p,qp,qp,q 可以不必為素?cái)?shù),但要求 gcd?(p,q)=1\gcd(p,q)=1gcd(p,q)=1,且 qqq 遠(yuǎn)大于 ppp。其中n=263,503n=263,503n=263,503時(shí),安全性分別與RSA1024、RSA2048相當(dāng)。
NTRU工作于多項(xiàng)式整數(shù)環(huán) R=Z[x]/(xn?1)\mathbb{R}=\mathbb{Z}[x]/(x^n-1)R=Z[x]/(xn?1),表示系數(shù)小于N的整系數(shù)多項(xiàng)式全體,環(huán)中的元素f(x)=fn?1xn?1+…+f1x+f0,g(x)=gn?1xn?1+…+g1x+g0f(x)=f_{n-1}x^{n-1}+…+f_1x+f_0,g(x)=g_{n-1}x^{n-1}+…+g_1x+g_0f(x)=fn?1?xn?1+…+f1?x+f0?,g(x)=gn?1?xn?1+…+g1?x+g0?,定義運(yùn)算為
f(x)+g(x)=(fn?1+gn?1)xn?1+…+(f1+g1)x+(f0+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)=(fn?1?+gn?1?)xn?1+…+(f1?+g1?)x+(f0?+g0?)
f(x)?g(x)=f(x)g(x)(modxn?1)=∑i=1n?1(∑s+t≡i(modn)fsgt)xif(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^if(x)?g(x)=f(x)g(x)(modxn?1)=i=1∑n?1?(s+t≡i(modn)∑?fs?gt?)xi
記 L(d1,d2)={F∈R:FL(d_1,d_2)=\{F \in \mathbb{R}:FL(d1?,d2?)={F∈R:F 有 d1d_1d1? 個(gè)系數(shù)為 111,d2d_2d2? 個(gè)系數(shù)為 ?1-1?1,其余為 0}0\}0},選取三個(gè)確定的整數(shù) df,dg,dφd_f,d_g,d_{\varphi}df?,dg?,dφ?,多項(xiàng)式集合 Lf=L(df,df?1),Lg=L(dg,dg),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?,df?1?),Lg?=L(dg?,dg?),Lφ?=L(dφ?,dφ?),而 Lm={m∈R:mL_m=\{m \in \mathbb{R}:mLm?={m∈R:m 的系數(shù)位于區(qū)間 [?p?12,p?12][-\cfrac{p-1}{2},\cfrac{p-1}{2}][?2p?1?,2p?1?],其中 ppp 為素?cái)?shù) }\}}。
密鑰生成
隨機(jī)選擇兩個(gè)小多項(xiàng)式 fff 和 ggg(系數(shù)時(shí)稀疏的,即系數(shù)中0的比例很高),f∈Lf,g∈Lgf\in L_f,g\in L_gf∈Lf?,g∈Lg?
可算出fff對(duì)modp\mod pmodp和modq\mod qmodq 的逆元FpF_pFp? 和 FqF_qFq?。
Fq?f≡1(modq)和Fp?f≡1(modp)Fq*f≡1\pmod q和Fp*f≡1\pmod pFq?f≡1(modq)和Fp?f≡1(modp)
因此, fff 首先應(yīng)滿足 gcd?(f(1),pq)=1\gcd(f(1),pq)=1gcd(f(1),pq)=1,如果有一個(gè)逆不存在,需重新選擇 fff。
然后,計(jì)算 h≡pFq?g(modq)h \equiv pF_q * g \pmod qh≡pFq??g(modq),則公鑰為 hhh,私鑰為 (f,Fq)(f,F_q)(f,Fq?)。
加密
假設(shè)A想發(fā)送信息 m∈Lmm \in L_mm∈Lm? 給B,他將根據(jù)參數(shù) dφd_{\varphi}dφ? 隨機(jī)選擇一個(gè) φ∈Lφ\varphi \in L_{\varphi}φ∈Lφ?,然后,利用B的公鑰 hhh 計(jì)算密文 c≡φ?h+m(modq)c \equiv \varphi * h+m \pmod qc≡φ?h+m(modq)
解密
當(dāng)B收到密文 ccc 后,他首先利用私鑰 fff 計(jì)算 a≡f?c(modq)a \equiv f * c \pmod qa≡f?c(modq)
選擇 aaa 的系數(shù)位于 [?q2,q2][-\cfrac{q}{2},\cfrac{q}{2}][?2q?,2q?] 之間,然后計(jì)算
e≡Fp?a(modp)e \equiv F_p* a \pmod pe≡Fp??a(modp)
則多項(xiàng)式 eee 就是明文 mmm。
例題
(深育杯)
解
from gmpy2 import * h = 3967900409518491437091166715380802161532841159072519563471354336400750930009970177101953304861954502146570721506995224520631716261108071684882841102381144720177664434981608584075201907891964214604246219441325377602163957172642582158192223452845671007585556951922415200415538060247456213608112360361636912703380306386439846269645696750929811607783895294670639202472465920599542568227657152922843001792754116981992696203788298740550812661583820191877594185184758074771316815650833195023325150218113883046328740408517222933980589974912467363367727038230703152354450353199257411964288022409128890352346036423792759938468964462267528727695183747947515480432786669353434638860350849296620606820894819933050645748656981993408399675189724419997805599649975500093890450393421897803267909569938850674774386012819838940544502656293639875120854745249463561940935651895728242282430164407574626178693654713011323376912585958110558532953333 p = 4407206782832544188667944201727813617189883940490534227436068867901196311508151544316989531306678865408607390128649278629254128753967046691736522108356971272311308455619879297358588727267184200777923695048248757115057072357087881336680504033511958280710547178971268670442650871890760916203109226852889599638484429889898210426540567794020013920566784973281560628666918122674783539653720295629054898529900882965691587718212291373734218555167591690910246380516121338139063419587750344469214004539520017140593342859857394308703001939640899189432836134392830208318268131639318655382175643272565186884496188876341460968563623529229713790076050095498053846983536874648190033735162809614805624209827336432223553914651838063614534617044557310972056169869738746432924853953258079006936103497626054364115282007843847693813896856977882285910369660539092462408790126385881581833165309032853389777355480169212478669139225609058338565029211 c = 4052491539376955553220568757544621659293304958837707160681090710624505862889512520190589879197831394720145909992216099963759496125523078969015706069688556356682711471641851937470179182960755800968587551608595725470945584970094036299764623894583379909329996337429067328575804567222496890803396234507278490116354758303807070775249711087938549824010697869930856205244006491475201993228121418890520174179969294094963249013786611889790711801269524919695653453576043288934196952437164829830756439734795068980207758771052483500272264363028346668629397497794792110170275173209377114274164087320163340547019935562316429227119346802124620682293405375798340275679831750482339301440428527223801872439611461272229275824994734898078664180541096159146759378804836952981089673755590353588900522455968721971944276318473421193690310601002295637581030417570868955379815661133148339565983621730401675643094909263098778572081973142223744746526672M = 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) % gprint(bytes.fromhex(hex(m)[2:]))GGH加密
1997年,Goldreich、Goldwasser、Halevi三人受Ajtai在格難題上的研究所啟發(fā),提出了一個(gè)基于格中最近向量難題的非對(duì)稱密碼學(xué)算法:GGH Cryptosystem。
1999年,Nguyen發(fā)現(xiàn)在這個(gè)密碼學(xué)算法設(shè)計(jì)中,有一個(gè)很大的缺陷,可以使攻擊者從密文中獲取到明文的部分信息,且可以將原來的最近向量難題轉(zhuǎn)化為一個(gè)較為簡單的最近向量難題。基于這個(gè)觀察,Nguyen解出了設(shè)計(jì)者放在網(wǎng)上的5個(gè)challenge中的4個(gè)(其中有2個(gè)被設(shè)計(jì)者認(rèn)為是不可能攻破的),足以證明該密碼算法是broken的。
定義
GGH包含一個(gè)私鑰和一個(gè)公鑰,選取格 LLL 的一組好基 BBB 和一個(gè)幺模矩陣 UUU 作為私鑰,計(jì)算 LLL 的另一組基 B’=UBB’=UBB’=UB 作為公鑰。
選定 MMM 值,明文向量 (m1,m2,?,mn),mi∈(?M,M)(m_1,m_2,\cdots,m_n), \quad m_i \in(-M,M)(m1?,m2?,?,mn?),mi?∈(?M,M)。
加密
給定明文 m=(m1,m2,?,mn)m=(m_1,m_2,\cdots,m_n)m=(m1?,m2?,?,mn?),誤差向量 eee,和公鑰 B’B’B’,計(jì)算 v=m?B’=∑mibi’v=m \cdot B’=\displaystyle\sum m_ib_i’v=m?B’=∑mi?bi?’;
密文 c=v+e=m?B’+ec=v+e=m \cdot B’+ec=v+e=m?B’+e。
解密
計(jì)算 c?B?1=(m?B’+e)B?1=m?U?B?B?1+e?B?1=m?U+e?B?1c \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}c?B?1=(m?B’+e)B?1=m?U?B?B?1+e?B?1=m?U+e?B?1;
如果 e?B?1e \cdot B^{-1}e?B?1 足夠小,可利用Babai最近平面算法的變種Babai rounding technique去除;
最后計(jì)算 m=m?U?U?1m=m \cdot U \cdot U^{-1}m=m?U?U?1 得到明文。
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/
總結(jié)
- 上一篇: ByteCTF 2021(Crypto部
- 下一篇: 2021-11-28