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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[watevrCTF 2019]Baby RLWE

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [watevrCTF 2019]Baby RLWE 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

[watevrCTF 2019]Baby RLWE

題目

Mateusz carried a huge jar of small papers with public keys written on them, but he tripped and accidentally dropped them into the scanner and made a txt file out of them! D: Note: This challenge is just an introduction to RLWE, the flag is (in standard format) encoded inside the private key.

baby_rlwe.sage

from sage.stats.distributions.discrete_gaussian_polynomial import DiscreteGaussianDistributionPolynomialSampler as d_gaussflag = bytearray(raw_input()) flag = list(flag)n = len(flag) q = 40961## Finite Field of size q. F = GF(q)## Univariate Polynomial Ring in y over Finite Field of size q R.<y> = PolynomialRing(F)## Univariate Quotient Polynomial Ring in x over Finite Field of size 40961 with modulus b^n + 1 S.<x> = R.quotient(y^n + 1)def gen_small_poly():sigma = 2/sqrt(2*pi)d = d_gauss(S, n, sigma)return d()def gen_large_poly():return S.random_element()## Public key 1 a = gen_large_poly()## Secret key s = S(flag)file_out = open("downloads/public_keys.txt", "w") file_out.write("a: " + str(a) + "\n")for i in range(100):## Errore = gen_small_poly()## Public key 2b = a*s + efile_out.write("b: " + str(b) + "\n")file_out.close()

解題

Mateusz拿著一大罐寫著公鑰的小文件,但他絆倒了,不小心把它們丟進了掃描儀,并用它們制作了一個txt文件!D:注意:這個挑戰只是對RLWE的介紹,標志(標準格式)編碼在私鑰中。

RLWE是Ring learning with errors的簡稱,是基于格的環上容錯學習問題

RLWE 問題定義為:給定均勻隨機生成的多項式 a∈Rqa \in R_qaRq?s∈Rqs \in R_qsRq?e∈Rqe \in R_qeRq? 服從分布 XXXbi=ais+eib_i=a_is+e_ibi?=ai?s+ei?。搜索版本的 RLWE 問題 (Search RLWE) 為:給定多組 (ai,bi)(a_i,b_i)(ai?,bi?),找到 sss。判定版本的 RLWE 問題 (Decision RLWE) 為:將bib_ibi?和均勻隨機生成的向量區分開。
大概能看出這道題就是這種類型的了,但是怎么解呢

找到一位大佬的思路

keys = open("public_keys.txt", "r").read().split("n")[:-1] temp1 = keys[0].find("^") temp2 = keys[0].find(" ", temp1) n = Integer(keys[0][temp1+1:temp2]) + 1 q = 40961 F = GF(q) R.<y> = PolynomialRing(F) S.<x> = R.quotient(y^n + 1) a = S(keys[0].replace("a: ", "")) keys = keys[1:] counters = [] for i in range(n):counters.append({})for key in keys:b = key.replace("b: ", "")b = list(S(b))for i in range(n):try:counters[i][b[i]] += 1except:counters[i][b[i]] = 1a_s = [] for counter in counters:dict_keys = counter.keys()max_key = 0maxi = 0for key in dict_keys:if counter[key] > maxi:maxi = counter[key]max_key = keya_s.append(max_key)a_s = S(a_s) s = a_s/a print ''.join(map(chr,list(s)))

也有師傅說:
用sage解
通過觀察e的生成函數可以發現多項式e上的很多位都為0
這就說明我們可以通過統計b中的相應位上的出現次數最多的系數作為a*s的值
而a我們又是知道的
所以就可以求出s來
從而繞過e的干擾

#sage from sage.stats.distributions.discrete_gaussian_polynomial import DiscreteGaussianDistributionPolynomialSampler as d_gauss keys = open("public_keys.txt", "r").read().split("\n")[:-1] temp1 = keys[0].find("^") temp2 = keys[0].find(" ", temp1) n=int(keys[0][temp1+1:temp2])+1 print(n) q = 40961 F = GF(q) R.<y> = PolynomialRing(F) S.<x> = R.quotient(y^n + 1) num=[] for i in range(n):num.append({}) #print(num) a=S(keys[0].replace('a: ','')) #print(a) keys=keys[1:] for key in keys:b=key.replace('b: ','')li=list(S(b))#print(li)for i in range(len(num)):try:num[i][li[i]]+=1except:num[i][li[i]]=1 asnum=[] #print(num) for i in num:asnum.append(max(i,key=i.get)) #print(asnum) aspoly=S(asnum) flag=aspoly/a print(list(flag)) flag=''.join(map(chr,flag)) print(flag)

運行得到watevr{rlwe_and_statistics_are_very_trivial_when_you_reuse_same_private_keys#02849jedjdjdj202ie9395u6ky}

總結

以上是生活随笔為你收集整理的[watevrCTF 2019]Baby RLWE的全部內容,希望文章能夠幫你解決所遇到的問題。

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