2021能源安全大赛RSA-number
import gmpy2
from Crypto.Util.number import *
nbits = 1024
p = getPrime(nbits)
q = getPrime(nbits)
e = 65537
n = p*q
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
pinv = gmpy2.invert(p, q)
qinv = gmpy2.invert(q, p)
flag = "********************"
m = bytes_to_long(flag)
c = pow(m, e, n)
print(e)
print(phi)
print(c)
print(pinv)
print(qinv)
#e=65537
#phi=16214196677409842191749663213231966223463566653203568400729814072064956461861752278166553612908715656550967320972074537503601239318720270129995303074646212737965783268459229106835490417712668363359171821708318720809832159572282727511389992615663441511503229704750580492198821606998317710868668828833141425196622473234579399775579260766468635789016596133769105704618517033189110246711345632295573082254981344927876365625171289065905073217354890942522382600791119629881635451001620199711984737382369947788979240377635737790856929955955970018372806837656838074878040088010958855603338894383834400898168898618138035821760
#c=10604018404112829207653109426421330872764960317584135942976846332774968746963495249471791454332018210024138118402034077993086458923434620824648601296546049400784253605007345552068039256920909136573149623993650033977431024066666079287398686091212994858934967000073682790106585918576271349858494852312801806759693201090168582692590718584072906358808826192436677670097858207614448463997654563107791219248280328276122250827703702624009318075976748693174206978841677406243656787173843544323747984786489504681386107186529318709829786795782849615751624805732251794730394312662114841018929734575979077218728057604916282584549
#pinv=41227525122641731027803576353121502216886898566530090754910822233885820938630571029851581473120591477480350097934822292149235531143326884563227004577488643415686764380038498101774124058390324990260637107448524600734605221941232886887041892234469421509329336000703903447902913943927720581260808815020884284053
#qinv=96682167531431432828019735553573344641300497261009819846367358362042455665591587442956765031952285358537009209824632767606759833549222627721046066423193573378463757319043876813146540965827319020631984549384593998428481208271733978137361346913047429919163939654471574485561505945941232191428058440607575906773
根据题意,易得 d = gmpy2.invert(e,phi)
有了 c , d , pinv, qinv 求m :m = c^d % n , n = p * q
根据费马小定理
sympy解方程
c = pow(m, 2, r)
from sympy.ntheory.residue_ntheory import nthroot_mod
# nthroot_mod(a,n,p) Find the solutions to x**n = a mod p
m = nthroot_mod(c,2,r)
from Crypto.Util.number import *
print(long_to_bytes(m))
换表
在Python 2.x中。该表是256个字符的字符串。可以使用string.maketrans:
>>> import string >>> tbl = string.maketrans('ac', 'dx') >>> "abcabc".translate(tbl) 'dbxdbx'
在Python 3.x中
>>> "abcabc".translate({ord('a'): 'd', ord('c'): 'x'}) 'dbxdbx'
[2021]XOR
参考文章 [GKCTF 2021]XOR_m0_57291352的博客-CSDN博客[GKCTF 2021]XOR题目from Crypto.Util.number import *from hashlib import md5a = getPrime(512)b = getPrime(512)c = getPrime(512)d = getPrime(512)d1 = int(bin(d)[2:][::-1] , 2)n1 = a*bx1 = a^bn2 = c*dx2 = c^d1flag = md5(str(a+b+c+d).encode()).hexdihttps://blog.csdn.net/m0_57291352/article/details/119974008DASCTF|June GKCTF X DASCTF应急挑战杯WriteUP-MISC&CRYPTO篇 - 云+社区 - 腾讯云本次竞赛涵盖WEB、CRYPTO、MISC、PWN、REVERSE常规CTF五大类赛题。
https://cloud.tencent.com/developer/article/1844889
题目
from Crypto.Util.number import *
from hashlib import md5
a = getPrime(512)
b = getPrime(512)
c = getPrime(512)
d = getPrime(512)
d1 = int(bin(d)[2:][::-1] , 2)
n1 = a*b
x1 = a^b
n2 = c*d
x2 = c^d1
flag = md5(str(a+b+c+d).encode()).hexdigest()
print("n1 =",n1)
print("x1 =",x1)
print("n2 =",n2)
print("x2 =",x2)
#n1 = 83876349443792695800858107026041183982320923732817788196403038436907852045968678032744364820591254653790102051548732974272946672219653204468640915315703578520430635535892870037920414827506578157530920987388471203455357776260856432484054297100045972527097719870947170053306375598308878558204734888246779716599
#x1 = 4700741767515367755988979759237706359789790281090690245800324350837677624645184526110027943983952690246679445279368999008839183406301475579349891952257846
#n2 = 65288148454377101841888871848806704694477906587010755286451216632701868457722848139696036928561888850717442616782583309975714172626476485483361217174514747468099567870640277441004322344671717444306055398513733053054597586090074921540794347615153542286893272415931709396262118416062887003290070001173035587341
#x2 = 3604386688612320874143532262988384562213659798578583210892143261576908281112223356678900083870327527242238237513170367660043954376063004167228550592110478
分析可知,a_bit、b_bit的低位逐位爆破4种可能[0 0, 0 1, 1 1 ,1 0],查看是否满足两个条件
(1)a_bit ^ b_bit == x1_bit
(2) a、b低i位数相乘取余的结果与 a*b取余的结果一致,即
分析可知,c, d的运算中有
d1 = int(bin(d)[2:][::-1] , 2) # 取d的二进制倒序
n2 = c*d
x2 = c^(d1)
因此爆破时,同时爆破4个位,即c、d的高位c_high_bit、d_high_bit,c、d的低位c_low_bit、d_low_bit 。此时验证条件改为:
(1)c_low_bit ^ d_high_bit == x2_low_bit
(2)c_high_bit ^ d_low_bit == x2_high_bit
(3)(c_low_bit[:-i] * d_low_bit[:-i]) mod (2**i )== n2_low_bit mod (2**i )
(4)(c_high_bits + c_low_bits) * (d_high_bits + d_low_bits ) <= n2
(5)(c_high_bits + c_low_bits + 0b01111111110) * (d_high_bits + d_low_bits + 0b01111111110) >= n2
0b0111111110 是c或d的填充部分,根据i位数改变长度, 即中间部分全部填充1
#coding:utf-8
import itertools
def get_ab():
n1 = 83876349443792695800858107026041183982320923732817788196403038436907852045968678032744364820591254653790102051548732974272946672219653204468640915315703578520430635535892870037920414827506578157530920987388471203455357776260856432484054297100045972527097719870947170053306375598308878558204734888246779716599
x1 = 4700741767515367755988979759237706359789790281090690245800324350837677624645184526110027943983952690246679445279368999008839183406301475579349891952257846
a_list, b_list = [0], [0]
cur_mod = 1
for i in range(513):
cur_mod *= 2
nxt_as, nxt_bs = [], []
for al, bl in zip(a_list, b_list):
for ah, bh in itertools.product([0, 1], repeat=2):
aa, bb = ah*(cur_mod // 2) + al, bh*(cur_mod // 2) + bl
if ((aa * bb % cur_mod == n1 % cur_mod) and ((aa ^ bb) == x1 % cur_mod)):
nxt_as.append(aa)
nxt_bs.append(bb)
a_list, b_list = nxt_as, nxt_bs
for a, b in zip(a_list, b_list):
if a * b == n1 and a*b-n1==0 and (a^b)-x1==0:
break
print("a = ",a)
print("b = ",b)
#a =7836147139610655223711469747200164069484878894626166870664740637786609468164555354874619497753277560280939259937394201154154977382033483373128424196987617
#b =10703774182571073361112791376032380096360697926840362483242105878115552437021674861528714598089603406032844418758725744879476596359225265333530235803365847
return a,b
import itertools
def get_cd():
n1 = 65288148454377101841888871848806704694477906587010755286451216632701868457722848139696036928561888850717442616782583309975714172626476485483361217174514747468099567870640277441004322344671717444306055398513733053054597586090074921540794347615153542286893272415931709396262118416062887003290070001173035587341
x1 = 3604386688612320874143532262988384562213659798578583210892143261576908281112223356678900083870327527242238237513170367660043954376063004167228550592110478
a_list, b_list, aa_list, bb_list = [0], [0], [0], [0]
x1_bits = [int(x) for x in f'{x1:0512b}'[::-1]]
#print(f'{x1:0512b}') == print(bin(x1)[2:].rjust(512,'0'))
cur_mod = 1
for i in range(256):
cur_mod *= 2
nxt_as, nxt_bs, nxt_aas, nxt_bbs = [], [], [], []
for al, bl, a2, b2 in zip(a_list, b_list, aa_list, bb_list):
for ah, bh, ah2, bh2 in itertools.product([0, 1], repeat=4):
# [0 0 0 0
# 0 0 0 1
# 0 0 1 0
# 0 0 1 1
# 0 1 0 0
# 0 1 0 1
# 0 1 1 0
# 0 1 1 1
# 1 0 0 0
# 1 0 0 1
# 1 0 1 0
# 1 0 1 1
# 1 1 0 0
# 1 1 0 1
# 1 1 1 0
# 1 1 1 1]
aa, bb, aa2, bb2 = ah*(cur_mod // 2) + al, bh*(cur_mod // 2) + bl, ah2*(cur_mod // 2) + a2, bh2*(cur_mod // 2) + b2
bb2_rev = f'{bb2:0512b}'[::-1]
bb2_rev = int(bb2_rev, 2)
aa2_rev = f'{aa2:0512b}'[::-1]
aa2_rev = int(aa2_rev, 2)
gujie = '0' * (i+1) + '1' * (510 - 2 * i) + '0' * (i+1)
gujie = int(gujie, 2)
if ((aa * bb % cur_mod == n1 % cur_mod) and ((ah ^ bh2) == x1_bits[i]) and (ah2 ^ bh == x1_bits[511-i]) and ((aa2_rev + aa) * (bb2_rev + bb) <= n1) and ((aa2_rev + aa + gujie) * (bb2_rev + bb + gujie) >= n1)):
nxt_as.append(aa)
nxt_bs.append(bb)
nxt_aas.append(aa2)
nxt_bbs.append(bb2)
a_list, b_list, aa_list, bb_list = nxt_as, nxt_bs, nxt_aas, nxt_bbs
for a, b, aa2, bb2 in zip(a_list, b_list, aa_list, bb_list):
aa2_rev = f'{aa2:0512b}'[::-1]
aa2_rev = int(aa2_rev, 2)
bb2_rev = f'{bb2:0512b}'[::-1]
bb2_rev = int(bb2_rev, 2)
a = aa2_rev + a
b = bb2_rev + b
if (a * b == n1):
break
# print(a * b - n1)
# print((a ^ int(bin(b)[2:][::-1],2)) - x1)
print('c=',a)
print('d=',b)
return a,b
a,b = get_ab()
c,d = get_cd()
from hashlib import md5
flag = md5(str(a+b+c+d).encode()).hexdigest()
print('flag=','GKCTF{'+str(flag)+'}')
题目[GKCTF 2021] RRRRsa
参考
题目描述
from Crypto.Util.number import *
from gmpy2 import gcd
flag = b'xxxxxxxxxxxxx'
p = getPrime(512)
q = getPrime(512)
m = bytes_to_long(flag)
n = p*q
e = 65537
c = pow(m,e,n)
print('c={}'.format(c))
p1 = getPrime(512)
q1 = getPrime(512)
n1 = p1*q1
e1 = 65537
assert gcd(e1,(p1-1)*(q1-1)) == 1
c1 = pow(p,e1,n1)
print('n1={}'.format(n1))
print('c1={}'.format(c1))
hint1 = pow(2020 * p1 + q1, 202020, n1)
hint2 = pow(2021 * p1 + 212121, q1, n1)
print('hint1={}'.format(hint1))
print('hint2={}'.format(hint2))
p2 = getPrime(512)
q2 = getPrime(512)
n2 = p2*q2
e2 = 65537
assert gcd(e1,(p2-1)*(q2-1)) == 1
c2 = pow(q,e2,n2)
hint3 = pow(2020 * p2 + 2021 * q2, 202020, n2)
hint4 = pow(2021 * p2 + 2020 * q2, 212121, n2)
print('n2={}'.format(n2))
print('c2={}'.format(c2))
print('hint3={}'.format(hint3))
print('hint4={}'.format(hint4))
#c=13492392717469817866883431475453770951837476241371989714683737558395769731416522300851917887957945766132864151382877462142018129852703437240533684604508379950293643294877725773675505912622208813435625177696614781601216465807569201380151669942605208425645258372134465547452376467465833013387018542999562042758
#n1=75003557379080252219517825998990183226659117019770735080523409561757225883651040882547519748107588719498261922816865626714101556207649929655822889945870341168644508079317582220034374613066751916750036253423990673764234066999306874078424803774652754587494762629397701664706287999727238636073466137405374927829
#c1=68111901092027813007099627893896838517426971082877204047110404787823279211508183783468891474661365139933325981191524511345219830693064573462115529345012970089065201176142417462299650761299758078141504126185921304526414911455395289228444974516503526507906721378965227166653195076209418852399008741560796631569
#hint1=23552090716381769484990784116875558895715552896983313406764042416318710076256166472426553520240265023978449945974218435787929202289208329156594838420190890104226497263852461928474756025539394996288951828172126419569993301524866753797584032740426259804002564701319538183190684075289055345581960776903740881951
#hint2=52723229698530767897979433914470831153268827008372307239630387100752226850798023362444499211944996778363894528759290565718266340188582253307004810850030833752132728256929572703630431232622151200855160886614350000115704689605102500273815157636476901150408355565958834764444192860513855376978491299658773170270
#n2=114535923043375970380117920548097404729043079895540320742847840364455024050473125998926311644172960176471193602850427607899191810616953021324742137492746159921284982146320175356395325890407704697018412456350862990849606200323084717352630282539156670636025924425865741196506478163922312894384285889848355244489
#c2=67054203666901691181215262587447180910225473339143260100831118313521471029889304176235434129632237116993910316978096018724911531011857469325115308802162172965564951703583450817489247675458024801774590728726471567407812572210421642171456850352167810755440990035255967091145950569246426544351461548548423025004
#hint3=25590923416756813543880554963887576960707333607377889401033718419301278802157204881039116350321872162118977797069089653428121479486603744700519830597186045931412652681572060953439655868476311798368015878628002547540835719870081007505735499581449077950263721606955524302365518362434928190394924399683131242077
#hint4=104100726926923869566862741238876132366916970864374562947844669556403268955625670105641264367038885706425427864941392601593437305258297198111819227915453081797889565662276003122901139755153002219126366611021736066016741562232998047253335141676203376521742965365133597943669838076210444485458296240951668402513
看到题目 n1/n2/n3 均不可以直接分解
RoarCTF2019 RSA
题目:
常规解法:
A=(((y%x)**5)%(x%y))**2019+y**316+(y+1)/x
p=next_prime(z*x*y)
q=next_prime(z)
A = 2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
n = 117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
c = 41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128
#分析:gmpy2.iroot(A,316)=(mpz(83), False),确定了y的范围
#False表示不能完全开方,例如,iroot(1000,2)=(31,False)
#破解x,y:
A = 2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
for x in range(1,90):
for y in range(1,90):
try:
if (((y%x)**5)%(x%y))**2019+y**316+(y+1)/x == A:
print x,y
except:
pass
解p和q:
import gmpy2
import sympy
n = 117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
n1 = n/166
np = (gmpy2.iroot(n1,2))[0]
p = sympy.nextprime(np)
q = n/p
print q,p
破解flag:
import gmpy2
import sympy
p=139916095583110895133596833227506693679306709873174024876891023355860781981175916446323044732913066880786918629089023499311703408489151181886568535621008644997971982182426706592551291084007983387911006261442519635405457077292515085160744169867410973960652081452455371451222265819051559818441257438021073941183
q=842868045681390934539739959201847552284980179958879667933078453950968566151662147267006293571765463137270594151138695778986165111380428806545593588078365331313084230014618714412959584843421586674162688321942889369912392031882620994944241987153078156389470370195514285850736541078623854327959382156753458569
e=0x10001
c=41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128
n=p*q
phin=(p-1)*(q-1)
e=3
while(e<0x10003):
try:
#d=gmpy2.invert(e,phin)
#print d,e
d=gmpy2.invert(e,phin)
m=pow(c,d,n)
flag = hex(m)[2:].decode('hex')
if "CTF" in flag:
print flag
except:
pass
e = sympy.nextprime(e)