文章目录
- [CISCN 2022 西南]rsa
- [HDCTF 2023]爬过小山去看云
- [LitCTF 2023]md5的破解
- [CISCN 2023 初赛]Sign_in_passwd
- [CISCN 2021初赛]rsa
- [GWCTF 2019]babyRSA
[CISCN 2022 西南]rsa
都是迷惑的东西,别看,注意关键的pow就好。
求 P-1 和 Q-1 的lcm 最小公倍数实际上就是我们要的 phi了。没有难点。
EXP:
from Crypto.Util.number import *
from gmpy2 import *
E = 65537
c = 4288727484183191191687364666620023549392656794153112764357730676861570386983002380982803054964588111708662498647767438881892355599604826306427809017097724346976778230464708540600157055782723189971534549543664668430013171469625043063261219462210251726207552819381767396148632877168530609902046293626355744288863460554297860696918890189350721960355460410677203131993419723440382095665713164422367291153108363066159712951217816814873413423853338021627653555202253351957999686659021298525147460016557904084617528199284448056532965033560516083489693334373695545423561715471204868795248569806148395196572046378679014697206
N = 17168634922359080770731181740188997952741812682116912079000170434755630873073792773455352815549564103486063484001457037305375162580861025543369063596825489461609724794798857499401637867986508655873564997664216374116361942711233205374363245780323485119184650145879389879046988234947922412374890843297813248828996855478005656041814919367820336728271583686844991928889831691815821365423570311291064846736832327637944358854661523107817781673029406341843040857813841671405147146887291204140157388049394514390098066284975682117038362207142272098796924412602725857521665773622056312191400612944442008222587867782281556388669
phi = 4292158730589770192682795435047249488185453170529228019750042608688907718268448193363838203887391025871515871000364259326343790645215256385842265899206372365402431198699714374850409466996627163968391249416054093529090485677808301343590811445080871279796162536469847469761747058736980603093722710824453312207182881241846080117790728778291633761198069016865260030288832065807438020772711645648333908622890343009942617559434851450007195025869850769670769715654662127278293639938359741401336592219730356884542179574372134014927006215640945952229142436595334916765255426954857520777553915330597952622785359222832224632624
d = invert(E, phi)
m = pow(c, d, N)
print(long_to_bytes(m))
[HDCTF 2023]爬过小山去看云
希尔密码
这里eightfourtwozeroeightfourtwoonezeroeighteightfourzerotwofourzeroeightfourzeroonezeroonetwofourx 包含了一串数字
翻译后842084210884024084010124 , 只有 02148 云隐密码。
EXP:
def de_code(c):
dic = [chr(i) for i in range(ord("A"), ord("Z") + 1)]
flag = []
c2 = [i for i in c.split("0")]
for i in c2:
c3 = 0
for j in i:
c3 += int(j)
flag.append(dic[c3 - 1])
return flag
c = '842084210884024084010124'
print(de_code(c))
# ['N', 'O', 'T', 'F', 'L', 'A', 'G']
[LitCTF 2023]md5的破解
md5爆破 少了 13,14,18,34 。
EXP:
from Crypto.Util.number import *
from hashlib import md5
enc = b'LitCTF{md5can3derypt213thoughcrsh}'
flag = [0] * 38
key = b'0123456789abcdefghijklmnopqrstuvwxyz'
flag[:13] = enc[:13]
flag[15:18] = enc[13:16]
flag[19:34] = enc[16:31]
flag[35:38] = enc[31:34]
for i in key:
flag[13] = i
for j in key:
flag[14] = j
for k in key:
flag[18] = k
for l in key:
flag[34] = l
m = md5(bytes(flag)).hexdigest()
if m == '496603d6953a15846cd7cc476f146771':
print(''.join(chr(x) for x in flag))
# LitCTF{md5can123dexrypt213thoughcrpsh}
[CISCN 2023 初赛]Sign_in_passwd
base换表解码。
第二行是base64码表,有 %3D,%2F,%2B 是Unicode编码,可以换成
'GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5'
EXP:
import base64
str = 'j2rXjx8yjd=YRZWyTIuwRdbyQdbqR3R9iZmsScutj2iqj3/tidj1jd=D'
string1 = "GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF" # 替换的表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print(base64.b64decode(str.translate(str.maketrans(string1, string2))))
# flag{8e4b2888-6148-4003-b725-3ff0d93a6ee4}
要把最后一个5去掉。
[CISCN 2021初赛]rsa
新知识点挺好的。
我不知道叫什么。RSA已知高位攻击,这个是已知p高位。要利用到一个叫sage的工具。
简单讲一下,
- 第一部分是e = 3的小明文攻击,轻轻松松
- 第二部分是共模攻击,轻轻松松
- 第三部分是已知高位攻击,用sage。具体原理还在学,只是从网上找了脚本。明天具体学习一下。
sage关键代码:
from sage.all import *
n = 113432930155033263769270712825121761080813952100666693606866355917116416984149165507231925180593860836255402950358327422447359200689537217528547623691586008952619063846801829802637448874451228957635707553980210685985215887107300416969549087293746310593988908287181025770739538992559714587375763131132963783147
p4=7117286695925472918001071846973900342640107770214858928188419765628151478620236042882657992902
e = 0x10001
pbits = 512
kbits = pbits - p4.nbits()
print(p4.nbits())
p4 = p4 << kbits
PR.<x> = PolynomialRing(Zmod(n))
f = x + p4
roots = f.small_roots(X=2^kbits, beta=0.4)
if roots:
p = p4+int(roots[0])
print ("n: ", n)
print ("p: ", p)
print ("q: ", n/p)
要用工具,或者在线网站https://sagecell.sagemath.org/
斯
来源:https://blog.csdn.net/m0_57291352/article/details/120675242
EXP:
from Crypto.Util.number import *
from gmpy2 import *
import hashlib
txt = b''
c1 = 19105765285510667553313898813498220212421177527647187802549913914263968945493144633390670605116251064550364704789358830072133349108808799075021540479815182657667763617178044110939458834654922540704196330451979349353031578518479199454480458137984734402248011464467312753683234543319955893
e1 = 3
N1 = 123814470394550598363280518848914546938137731026777975885846733672494493975703069760053867471836249473290828799962586855892685902902050630018312939010564945676699712246249820341712155938398068732866646422826619477180434858148938235662092482058999079105450136181685141895955574548671667320167741641072330259009
for i in range(1000):
if iroot(i * N1 + c1,e1)[1]:
m = long_to_bytes(iroot(i * N1 + c1,e1)[0])
print(m)
txt += m
break
c2 = 54995751387258798791895413216172284653407054079765769704170763023830130981480272943338445245689293729308200574217959018462512790523622252479258419498858307898118907076773470253533344877959508766285730509067829684427375759345623701605997067135659404296663877453758701010726561824951602615501078818914410959610
c3 = 91290935267458356541959327381220067466104890455391103989639822855753797805354139741959957951983943146108552762756444475545250343766798220348240377590112854890482375744876016191773471853704014735936608436210153669829454288199838827646402742554134017280213707222338496271289894681312606239512924842845268366950
e2 = 17
e3 = 65537
N2 = 111381961169589927896512557754289420474877632607334685306667977794938824018345795836303161492076539375959731633270626091498843936401996648820451019811592594528673182109109991384472979198906744569181673282663323892346854520052840694924830064546269187849702880332522636682366270177489467478933966884097824069977
e, s, t = gcdext(e2, e3)
c = pow(c2, s, N2) * pow(c3, t, N2) % N2
m = long_to_bytes(iroot(c,e)[0])
print(m)
txt += m
c4 = 59213696442373765895948702611659756779813897653022080905635545636905434038306468935283962686059037461940227618715695875589055593696352594630107082714757036815875497138523738695066811985036315624927897081153190329636864005133757096991035607918106529151451834369442313673849563635248465014289409374291381429646
N3 = 113432930155033263769270712825121761080813952100666693606866355917116416984149165507231925180593860836255402950358327422447359200689537217528547623691586008952619063846801829802637448874451228957635707553980210685985215887107300416969549087293746310593988908287181025770739538992559714587375763131132963783147
p = 11437038763581010263116493983733546014403343859218003707512796706928880848035239990740428334091106443982769386517753703890002478698418549777553268906496423
q = 9918033198963879798362329507637256706010562962487329742400933192721549307087332482107381554368538995776396557446746866861247191248938339640876368268930589
phi = (p-1)*(q-1)
d = invert(e3,phi)
m = long_to_bytes(pow(c4,d,N3))
print(m)
txt += m
print(txt)
print(hashlib.md5(txt).hexdigest())
[GWCTF 2019]babyRSA
题目:
import hashlib
import sympy
from Crypto.Util.number import *
flag = 'GWHT{******}'
secret = '******'
assert(len(flag) == 38)
half = len(flag) / 2
flag1 = flag[:half]
flag2 = flag[half:]
secret_num = getPrime(1024) * bytes_to_long(secret)
p = sympy.nextprime(secret_num)
q = sympy.nextprime(p)
N = p * q
e = 0x10001
F1 = bytes_to_long(flag1)
F2 = bytes_to_long(flag2)
c1 = F1 + F2
c2 = pow(F1, 3) + pow(F2, 3)
assert(c2 < N)
m1 = pow(c1, e, N)
m2 = pow(c2, e, N)
output = open('secret', 'w')
output.write('N=' + str(N) + '\n')
output.write('m1=' + str(m1) + '\n')
output.write('m2=' + str(m2) + '\n')
output.close()
没有考什么,N可以直接分解,得到p和q。之后可以根据RSA计算出c1和c2.
c1和c2再根据z3就可以算出F1和F2了。
注意的是 z3中用的是Int类型,所以要求的c1和c2也要是int类型,原先 c1 = pow(m1,d,N)
这样得出来的c1是 mpz类型的,所以要用int转换。
EXP:
from Crypto.Util.number import *
from gmpy2 import *
from z3 import *
p = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377747699
q = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377748737
e = 65537
m1=90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
m2=487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
N = p * q
phi = (p - 1) * (q - 1)
d = invert(e,phi)
c1 = int(pow(m1,d,N))
c2 = int(pow(m2,d,N))
s = Solver()
F1,F2 = Ints('F1 F2')
s.add(F1 + F2 == c1)
s.add(F1**3 + F2**3 == c2)
if s.check()==sat:
print(s.model())
F1 = 1590956290598033029862556611630426044507841845
F2 = 1141553212031156130619789508463772513350070909
flag = b''
flag += long_to_bytes(F1) + long_to_bytes(F2)
print(flag)