日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

格密码学基础

發布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 格密码学基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

格密碼學—Lattice-based Crypto 是現在比較火的一個密碼學分支,而且本身擁有抵抗量子計算的特性。在即將到來的NIST后量子時代加密算法標準化討論中,基于格的加密體系就是其中的一個選擇之一。其實想要理解格密碼學非常簡單,只需要一些最基本的線性代數知識。

格密碼學就是基于格(Lattice)和格上的一些問題而定義的一套密碼學體系。

關于基礎數學知識及入門可參考:https://zhuanlan.zhihu.com/p/150920501

格密碼

線性獨立空間上有集合 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 的維數等于格中向量的個數。

假定 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,則必然存在整系數 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??

這樣,格的問題就是矩陣運算了。

最短向量問題(SVP,The Shortest Vector Problem):

尋找一個格 LLL 中最短的非零向量。即,尋找一個 v∈Lv \in LvL 滿足其歐幾里德范數 ∣∣v∣∣\mid\mid v \mid\midv 最小。

最接近向量問題(CVP,The Closest Vector Problem):

對于一個非格 LLL 中的向量 www,在格中尋找一個向量 vvv,使得 ∣∣w?v∣∣\mid\mid w-v \mid\midw?v 最小。

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?1n-1n?1 的整系數多項式集合 Lf,Lg,Lφ,LmL_f,L_g,L_{\varphi},L_mLf?,Lg?,Lφ?,Lm?;其中 nnn 為素數,p,qp,qp,q 可以不必為素數,但要求 gcd?(p,q)=1\gcd(p,q)=1gcd(p,q)=1,且 qqq 遠大于 ppp。其中n=263,503n=263,503n=263,503時,安全性分別與RSA1024、RSA2048相當。

NTRU工作于多項式整數環 R=Z[x]/(xn?1)\mathbb{R}=\mathbb{Z}[x]/(x^n-1)R=Z[x]/(xn?1),表示系數小于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?,定義運算為

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=1n?1?(s+ti(modn)?fs?gt?)xi

L(d1,d2)={F∈R:FL(d_1,d_2)=\{F \in \mathbb{R}:FL(d1?,d2?)={FR:Fd1d_1d1? 個系數為 111d2d_2d2? 個系數為 ?1-1?1,其余為 0}0\}0},選取三個確定的整數 df,dg,dφd_f,d_g,d_{\varphi}df?,dg?,dφ?,多項式集合 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?={mR:m 的系數位于區間 [?p?12,p?12][-\cfrac{p-1}{2},\cfrac{p-1}{2}][?2p?1?,2p?1?],其中 ppp 為素數 }\}}

密鑰生成

隨機選擇兩個小多項式 fffggg(系數時稀疏的,即系數中0的比例很高),f∈Lf,g∈Lgf\in L_f,g\in L_gfLf?,gLg?

可算出fffmodp\mod pmodpmodq\mod qmodq 的逆元FpF_pFp?FqF_qFq?

Fq?f≡1(modq)和Fp?f≡1(modp)Fq*f≡1\pmod q和Fp*f≡1\pmod pFq?f1(modq)Fp?f1(modp)

因此, fff 首先應滿足 gcd?(f(1),pq)=1\gcd(f(1),pq)=1gcd(f(1),pq)=1,如果有一個逆不存在,需重新選擇 fff

然后,計算 h≡pFq?g(modq)h \equiv pF_q * g \pmod qhpFq??g(modq),則公鑰為 hhh,私鑰為 (f,Fq)(f,F_q)(f,Fq?)

加密

假設A想發送信息 m∈Lmm \in L_mmLm? 給B,他將根據參數 dφd_{\varphi}dφ? 隨機選擇一個 φ∈Lφ\varphi \in L_{\varphi}φLφ?,然后,利用B的公鑰 hhh 計算密文 c≡φ?h+m(modq)c \equiv \varphi * h+m \pmod qcφ?h+m(modq)

解密

當B收到密文 ccc 后,他首先利用私鑰 fff 計算 a≡f?c(modq)a \equiv f * c \pmod qaf?c(modq)

選擇 aaa 的系數位于 [?q2,q2][-\cfrac{q}{2},\cfrac{q}{2}][?2q?,2q?] 之間,然后計算

e≡Fp?a(modp)e \equiv F_p* a \pmod peFp??a(modp)

則多項式 eee 就是明文 mmm

例題
(深育杯)

from Crypto.Util.number import * import gmpy2 from flag import flagdef generate():p = getStrongPrime(2048)while True:f = getRandomNBitInteger(1024)g = getStrongPrime(768)h = gmpy2.invert(f, p) * g % preturn (p, f, g, h)def encrypt(plaintext, p, h):m = bytes_to_long(plaintext)r = getRandomNBitInteger(1024)c = (r * h + m) % preturn cp, 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 = 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在格難題上的研究所啟發,提出了一個基于格中最近向量難題的非對稱密碼學算法:GGH Cryptosystem。

1999年,Nguyen發現在這個密碼學算法設計中,有一個很大的缺陷,可以使攻擊者從密文中獲取到明文的部分信息,且可以將原來的最近向量難題轉化為一個較為簡單的最近向量難題。基于這個觀察,Nguyen解出了設計者放在網上的5個challenge中的4個(其中有2個被設計者認為是不可能攻破的),足以證明該密碼算法是broken的。

定義
GGH包含一個私鑰和一個公鑰,選取格 LLL 的一組好基 BBB 和一個幺模矩陣 UUU 作為私鑰,計算 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,計算 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

解密
計算 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去除;
最后計算 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/

總結

以上是生活随笔為你收集整理的格密码学基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。