from secret import flag from Crypto.Util.number import *
p = getPrime(1024) q = getPrime(1024)
N = p*p*q
d= inverse(N, (p-1)*(q-1)//GCD(p-1, q-1))
m = bytes_to_long(flag)
c = pow(m, N, N)
print('c =', c) print('N =', N) print('d =', d)
# c = 1653396627113549535760516503668455111392369905404419847336187180051939350514408518095369852411718553340156505246372037811032919080426885042549723125598742783778413642221563616358386699697645814225855089454045984443096447166740882693228043505960011332616740785976743150624114653594631779427044055729185392854961786323215146318588164139423925400772680226861699990332420246447180631417523181196631188540323779487858453719444807515638025771586275969579201806909799448813112034867089866513864971414742370516244653259347267231436131850871346106316007958256749016599758599549180907260093080500469394473142003147643172770078092713912200110043214435078277125844112816260967490086038358669788006182833272351526796228536135638071670829206746835346784997437044707950580087067666459222916040902038574157577881880027391425763503693184264104932693985833980182986816664377018507487697769866530103927375926578569947076633923873193100147751463 # N = 1768427447158131856514034889456397424027937796617829756303525705316152314769129050888899742667986532346611229157207778487065194513722005516611969754197481310330149721054855689646133721600838194741123290410384315980339516947257172981002480414254023253269098539962527834174781356657779988761754582343096332391763560921491414520707112852896782970123018263505426447126195645371941116395659369152654368118569516482251442513192892626222576419747048343942947570016045016127917578272819812760632788343321742583353340158009324794626006731057267603803701663256706597904789047060978427573361035171008822467120148227698893238773305320215769410594974360573727150122036666987718934166622785421464647946084162895084248352643721808444370307254417501852264572985908550839933862563001186477021313236113690793843893640190378131373214104044465633483953616402680853776480712599669132572907096151664916118185486737463253559093537311036517461749439 # d = 20650646933118544225095544552373007455928574480175801658168105227037950105642248948645762488881219576174131624593293487325329703919313156659700002234392400636474610143032745113473842675857323774566945229148664969659797779146488402588937762391470971617163496433008501858907585683428652637958844902909796849080799141999490231877378863244093900363251415972834146031490928923962271054053278056347181254936750536280638321211545167520935870220829786490686826062142415755063724639110568511969041175019898031990455911525941036727091961083201123910761290998968240338217895275414072475701909497518616112236380389851984377079
题解
考点:Schmidt-Samoa 密码体系
密钥构造:选取大整数p和q,计算作为公钥,计算作为私钥
加密过程:对于小于p*q的明文m,计算作为密文
解密过程:对于密文c,计算得到密文
证明过程:
1 2 3 4 5 6 7 8 9 10
hexo from Crypto.Util.number import * import gmpy2
c = 1653396627113549535760516503668455111392369905404419847336187180051939350514408518095369852411718553340156505246372037811032919080426885042549723125598742783778413642221563616358386699697645814225855089454045984443096447166740882693228043505960011332616740785976743150624114653594631779427044055729185392854961786323215146318588164139423925400772680226861699990332420246447180631417523181196631188540323779487858453719444807515638025771586275969579201806909799448813112034867089866513864971414742370516244653259347267231436131850871346106316007958256749016599758599549180907260093080500469394473142003147643172770078092713912200110043214435078277125844112816260967490086038358669788006182833272351526796228536135638071670829206746835346784997437044707950580087067666459222916040902038574157577881880027391425763503693184264104932693985833980182986816664377018507487697769866530103927375926578569947076633923873193100147751463 N = 1768427447158131856514034889456397424027937796617829756303525705316152314769129050888899742667986532346611229157207778487065194513722005516611969754197481310330149721054855689646133721600838194741123290410384315980339516947257172981002480414254023253269098539962527834174781356657779988761754582343096332391763560921491414520707112852896782970123018263505426447126195645371941116395659369152654368118569516482251442513192892626222576419747048343942947570016045016127917578272819812760632788343321742583353340158009324794626006731057267603803701663256706597904789047060978427573361035171008822467120148227698893238773305320215769410594974360573727150122036666987718934166622785421464647946084162895084248352643721808444370307254417501852264572985908550839933862563001186477021313236113690793843893640190378131373214104044465633483953616402680853776480712599669132572907096151664916118185486737463253559093537311036517461749439 d = 20650646933118544225095544552373007455928574480175801658168105227037950105642248948645762488881219576174131624593293487325329703919313156659700002234392400636474610143032745113473842675857323774566945229148664969659797779146488402588937762391470971617163496433008501858907585683428652637958844902909796849080799141999490231877378863244093900363251415972834146031490928923962271054053278056347181254936750536280638321211545167520935870220829786490686826062142415755063724639110568511969041175019898031990455911525941036727091961083201123910761290998968240338217895275414072475701909497518616112236380389851984377079
pq = gmpy2.gcd(pow(2, N * d, N) - 2, N) m = pow(c, d, pq) print(long_to_bytes(int(m)))
babyNTRU
题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from secret import flag from Crypto.Util.number import *
from Crypto.Util.number import * from sage.allimport * from secret import flag
p = 75206427479775622966537995406541077245842499523456803092204668034148875719001 a = 40399280641537685263236367744605671534251002649301968428998107181223348036480 b = 34830673418515139976377184302022321848201537906033092355749226925568830384464
from Crypto.Util.number import * from tqdm import *
p = 75206427479775622966537995406541077245842499523456803092204668034148875719001 a = 40399280641537685263236367744605671534251002649301968428998107181223348036480 b = 34830673418515139976377184302022321848201537906033092355749226925568830384464 Gx = 63199291976729017585116731422181573663076311513240158412108878460234764025898 Gy = 11977959928854309700611217102917186587242105343137383979364679606977824228558
K = EC(75017275378438543246214954287362349176908042127439117734318700769768512624429,39521483276009738115474714281626894361123804837783117725653243818498259351984) print(G.order()) print(K.order()) defSmartAttack(P,Q,p): E = P.curve() Eqp = EllipticCurve(Qp(p, 2), [ ZZ(t) + randint(0,p)*p for t in E.a_invariants() ])
P_Qps = Eqp.lift_x(ZZ(P.xy()[0]), all=True) for P_Qp in P_Qps: if GF(p)(P_Qp.xy()[1]) == P.xy()[1]: break
Q_Qps = Eqp.lift_x(ZZ(Q.xy()[0]), all=True) for Q_Qp in Q_Qps: if GF(p)(Q_Qp.xy()[1]) == Q.xy()[1]: break
n= 3326716005321175474866311915397401254111950808705576293932345690533263108414883877530294339294274914837424580618375346509555627578734883357652996005817766370804842161603027636393776079113035745495508839749006773483720698066943577445977551268093247748313691392265332970992500440422951173889419377779135952537088733 c= 2709336316075650177079376244796188132561250459751152184677022745551914544884517324887652368450635995644019212878543745475885906864265559139379903049221765159852922264140740839538366147411533242116915892792672736321879694956051586399594206293685750573633107354109784921229088063124404073840557026747056910514218246 e = 196608 defPollards_p_1(N): # Pollards 光滑数算法 a = 2 n = 1 whileTrue: a = pow(a, n, N) res = gmpy2.gcd(a - 1, N) if res != 1and res != N: return res n += 1
inv_p = gmpy2.invert(p, q) inv_q = gmpy2.invert(q, p) c_list1 = [c] for i inrange(16): c_list = [] for c1 in c_list1: mp = pow(c1, (p + 1) // 4, p) mq = pow(c1, (q + 1) // 4, q) one = (inv_p * p * mq + inv_q * q * mp) % n if one notin c_list: c_list.append(one) two = n - int(one) if two notin c_list: c_list.append(two) three = (inv_p * p * mq - inv_q * q * mp) % n if three notin c_list: c_list.append(three) four = n - int(three) if four notin c_list: c_list.append(four) c_list1 = c_list
print(c_list1) for i in c_list1: flag = long_to_bytes(int(gmpy2.iroot(int(i),3)[0])) print(flag)
from sage.allimport * from secret import flag import random data = [ord(x) for x in flag]
mod = 0x42 n = 200 p = 5 q = 2**20
defE(): return vector(ZZ, [1 - random.randint(0,p) for _ inrange(n)])
defcreatematrix(): return matrix(ZZ, [[q//2 - random.randint(0,q) for _ inrange(n)] for _ inrange(mod)])
A, B, C= creatematrix(), creatematrix(), creatematrix() x = vector(ZZ, data[0:mod]) y = vector(ZZ, data[mod:2*mod]) z = vector(ZZ, data[2*mod:3*mod]) e = E() b = x*B+y*A+z*C + e res = "" res += "A=" + str(A) +'\n' res += "B=" + str(B) +'\n' res += "C=" + str(C) +'\n' res += "b=" + str(b) +'\n'
withopen("enc.out","w") as f: f.write(res)
题解
1 2 3 4 5 6 7 8 9 10 11 12
A = [...] B = [...] C = [...] b = [...] m = A + B + C + b M = matrix(ZZ, m) M = matrix(ZZ, m) L = M.LLL() print(L[0]) res = M.solve_left(L[0]) for i in res[:-1]: print(chr(abs(i)), end="")