小白兔白又白
Base91解密
Base64->Base36->hex转str
Rabbit解密,根据提示b站哈哈大笑猜测密钥是233
得到SQCTF{LOOK_my_eyes_baby_why?}
春风得意马蹄疾
社会主义价值观解密
再解几次
解出SQCTF{E2jacnicamcm_cnanamw_kwkma}
别阴阳我了行吗?
阴阳怪气解码
得到SQCTF{xm!tql!xm!}
base?
赛博厨子base85一把梭
得到SQCTF{b7b48685-03ef-4e24-b25b-212fac2ec2d3}
简单RSA
根据hint提示知道pq接近分解n
考虑费马分解,然后根据pq求d解c即可
import math
import gmpy2
from Crypto.Util.number import long_to_bytes
def fermat_attack(n):
a = math.isqrt(n)
b2 = a*a - n
b = math.isqrt(n)
count = 0
while b*b != b2:
a = a + 1
b2 = a*a - n
b = math.isqrt(b2)
count += 1
p = a+b
q = a-b
assert n == p*q
return p,q
n = 7349515423675898192891607474991784569723846586810596813062667159281369435049497248016288479718926482987176535358013000103964873016387433732111229186113030853959182765814488023742823409594668552670824635376457830121144679902605863066189568406517231831010468189513762519884223049871926129263923438273811831862385651970651114186155355541279883465278218024789539073180081039429284499039378226284356716583185727984517316172565250133829358312221440508031140028515954553016396884149904097959425582366305748700291610280675014390376786701270107136492645593662763444032174543205008326706371954830419775515459878227148997362533
e = 65537
c = 3514741378432598036735573845050830323348005144476193092687936757918568216312321624978086999079287619464038817665467748860146219342413630364856274551175367026504110956407511224659095481178589587424024682256076598582558926372354316897644421756280217349588811321954271963531507455604340199167652015645135632177429144241732132275792156772401511326430069756948298403519842679923368990952555264034164975975945747016304948179325381238465171723427043140473565038827474908821764094888942553863124323750256556241722284055414264534546088842593349401380142164927188943519698141315554347020239856047842258840826831077835604327616
p,q=fermat_attack(n)
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e,phi_n)
m = pow(c,d,n)
print(long_to_bytes(m))
得到SQCTF{be7e48547356cdf16649fd29e0ff9e1f}
ezCRT
给了多组nc,很显然低加密指数广播攻击
import gmpy2
from functools import reduce
from Crypto.Util.number import bytes_to_long,long_to_bytes
def CRT(c,n):
sum = 0
N = reduce(lambda x,y:x*y,n)
for n_i, c_i in zip(n,c):
N_i = N // n_i
t_i = gmpy2.invert(N_i,n_i)
sum += c_i * N_i * t_i
return sum % N
n1 = 64461804435635694137780580883118542458520881333933248063286193178334411181758377012632600557019239684067421606269023383862049857550780830156513420820443580638506617741673175086647389161551833417527588094693084581758440289107240400738205844622196685129086909714662542181360063597475940496590936680150076590681
n2 = 82768789263909988537493084725526319850211158112420157512492827240222158241002610490646583583091495111448413291338835784006756008201212610248425150436824240621547620572212344588627328430747049461146136035734611452915034170904765831638240799554640849909134152967494793539689224548564534973311777387005920878063
n3 = 62107516550209183407698382807475681623862830395922060833332922340752315402552281961072427749999457737344017533524380473311833617485959469046445929625955655230750858204360677947120339189429659414555499604814322940573452873813507553588603977672509236539848025701635308206374413195614345288662257135378383463093
c1 = 36267594227441244281312954686325715871875404435399039074741857061024358177876627893305437762333495044347666207430322392503053852558456027453124214782206724238951893678824112331246153437506819845173663625582632466682383580089960799423682343826068770924526488621412822617259665379521455218674231901913722061165
c2 = 58105410211168858609707092876511568173640581816063761351545759586783802705542032125833354590550711377984529089994947048147499585647292048511175211483648376727998630887222885452118374649632155848228993361372903492029928954631998537219237912475667973649377775950834299314740179575844464625807524391212456813023
c3 = 23948847023225161143620077929515892579240630411168735502944208192562325057681298085309091829312434095887230099608144726600918783450914411367305316475869605715020490101138282409809732960150785462082666279677485259918003470544763830384394786746843510460147027017747048708688901880287245378978587825576371865614
n = [n1, n2, n3]
c = [c1, c2, c3]
x = CRT(c,n)
# e一般都不大可以尝试爆破
for e in range(1,10):
m, r = gmpy2.iroot(x,e)
if r == True:
print(long_to_bytes(m))
得到SQCTF{CRT_Unl0cks_RSA_Eff1c13ncy}
失落矿洞中的密码
找到了原题,sage暴力破解secretKey
https://ctf-wiki.org/crypto/asymmetric/discrete-log/ecc/
a = 1234577
b = 3213242
n = 7654319
E = EllipticCurve(GF(n), [0, 0, 0, a, b])
base = E([5234568, 2287747])
pub = E([2366653, 1424308])
c1 = E([5081741, 6744615])
c2 = E([610619, 6218])
X = base
for i in range(1, n):
if X == pub:
secret = i
print "[+] secret:", i
break
else:
X = X + base
print i
m = c2 - (c1 * secret)
print "[+] x:", m[0]
print "[+] y:", m[1]
print "[+] x+y:", m[0] + m[1]
得到SQCTF{5720914}
玩的挺变态啊清茶哥
很明显猪圈密码
解码得到jijibaotonghualizuoyingxiong
提交SQCTF{jijibaotonghualizuoyingxiong}即可
密室逃脱的终极挑战
IDA打开直接看到flag
丢三落四的小I
已知n、dp、e的rsa板子题,直接秒
import gmpy2
from Crypto.Util.number import long_to_bytes
e = 65537
n = 15124759435262214519214613181859115868729356369274819299240157375966724674496904855757710168853212365134058977781083245051947523020090726851248565503324715984500225724227315777864292625995636236219359256979887906731659848125792269869019299002807101443623257106289957747665586226912446158316961637444556237354422346621287535139897525295200592525427472329815100310702255593134984040293233780616515067333512830391860868933632383433431739823740865023004008736555299772442805617275890761325372253913686933294732259451820332316315205537055439515569011020072762809613676347686279082728000419370190242778504490370698336750029
dp = 1489209342944820124277807386023133257342259912189247976569642906341314682381245025918040456151960704964362424182449567071683886673550031774367531511627163525245627333820636131483140111126703748875380337657189727259902108519674360217456431712478937900720899137512461928967490562092139439552174099755422092113
c = 4689152436960029165116898717604398652474344043493441445967744982389466335259787751381227392896954851765729985316050465252764336561481633355946302884245320441956409091576747510870991924820104833541438795794034004988760446988557417649875106251230110075290880741654335743932601800868983384563972124570013568709773861592975182534005364811768321753047156781579887144279837859232399305581891089040687565462656879173423137388006332763262703723086583056877677285692440970845974310740659178040501642559021104100335838038633269766591727907750043159766170187942739834524072423767132738563238283795671395912593557918090529376173
for x in range(1, e):
if(e*dp%x==1):
p=(e*dp-1)//x+1
if(n%p!=0):
continue
q=n//p
phi=(p-1)*(q-1)
d=gmpy2.invert(e, phi)
m=pow(c, d, n)
print(long_to_bytes(m))
得到SQCTF{7b909221-c8ff-f391-0c86-d3a9ca8491d1}
字母的轮舞与维吉尼亚的交响曲
暴力破解维吉尼亚key是flag
得到VTFWI{brx_duh_zlq!}继续凯撒解密得到SQCTF{you_are_win!}
ez_SCA
很明显的侧信道攻击
找到原题https://blog.csdn.net/xuruihan177/article/details/139507987
import numpy as np
from scipy.spatial.distance import euclidean
# 加载能量轨迹文件
traces = np.load('energy_traces_with_flag.npy')
# 加载模板轨迹文件
template_trace_0 = np.load('template_trace_0.npy')
template_trace_1 = np.load('template_trace_1.npy')
# 恢复私钥(明文 flag 的二进制形式)
def recover_private_key(traces, template_trace_0, template_trace_1):
private_key = []
for trace in traces:
# 计算轨迹与两个模板轨迹的欧几里得距离
dist_0 = euclidean(trace, template_trace_0)
dist_1 = euclidean(trace, template_trace_1)
# 选择距离较小的模板轨迹对应的比特位
private_key.append(0 if dist_0 < dist_1 else 1)
return private_key
# 将恢复的二进制形式转换为明文 flag
def bits_to_text(bits):
chars = [bits[i:i+8] for i in range(0, len(bits), 8)]
text = ''.join([chr(int(char, 2)) for char in chars])
return text
# 恢复私钥并转换为明文
private_key = recover_private_key(traces, template_trace_0, template_trace_1)
recovered_bits_str = ''.join(map(str, private_key))
recovered_plaintext = bits_to_text(recovered_bits_str)
print(f"Recovered plaintext: {recovered_plaintext}")
得到SQCTF{easy_funny_and_not_hard_sca_hhh_just_kingdding}
你的天赋是什么
很明显摩斯密码
得到SQCTF{YOU-HAVE-TALENT}
Common Modulus
同一个n不同e的rsa板子题,共模攻击
import gmpy2
from Crypto.Util.number import long_to_bytes
n= 13650503560233612352420237787159267432351878281073422449253560365809461612884248041710373755322100953953257608601227381211434513766352420535096028618735289379355710140356003114010103377509526452574385251495847301426845768427018504464757671958803807138699056193259160806476941875860254288376872925837127208612702688503022494109785623082365323949385021488106289708499091818714253710552213982060745736652306892896670424179736886691685639988637188591805479432332714690818805432648223229601082431517091667297328748597580733946557364100555781113940729296951594110258088501146224322799560159763097710814171619948719257894889
c1= 3366500968116867439746769272799247895217647639427183907930755074259056811685671593722389247697636905214269760325119955242254171223875159785479900114989812511815466122321484289407596620307636198001794029251197349257235827433633936216505458557830334779187112907940003978773672225479445837897135907447625387990203145231671233038707457396631770623123809080945314083730185110252441203674945146889165953135351824739866177205127986576305492490242804571570833778440870959816207461376598067538653432472043116027057204385251674574207749241503571444801505084599753550983430739025050926400228758055440679102902069032768081393253
c2= 7412517103990148893766077090616798338451607394614015195336719617426935439456886251056015216979658274633552687461145491779122378237012106236527924733047395907133190110919550491029113699835260675922948775568027483123730185809123757000207476650934095553899548181163223066438602627597179560789761507989925938512977319770704123979102211869834390476278761480516444396187746843654541476645830961891622999425268855097938496239480682176640906218645450399785130931214581370821403077312842724336393674718200919934701268397883415347122906912693921254353511118129903752832950063164459159991128903683711317348665571285175839274346
e1= 4217054819
e2= 2800068527
_,s1, s2 = gmpy2.gcdext(e1, e2)
m = pow(c1, s1, n) * pow(c2, s2, n) % n
print(long_to_bytes(m))
得到SQCTF{06774dcf-b9d1-3c2d-8917-7d2d86b6721c}
《1789年的密文》
提示很明显了,托马斯·杰弗逊转轮密码
找到板子:https://blog.csdn.net/2302_80322812/article/details/136093897
txt = '''1: <QWXZRJYVKSLPDTMACFNOGIEBHU <
2: <BXZPMTQOIRVHKLSAFUDGJYCEWN <
3: <LKJHGFDSAQZWXECRVBYTNUIMOP <
4: <POIUYTREWQASDFGHJKLMNBVCXZ <
5: <ZXCVBNMASDFGHJKLPOIUYTREWQ <
6: <MNHBGVCFXDRZESWAQPLOKMIJUY <
7: <YUJIKMOLPQAWSZEXRDCFVGBHNM <
8: <EDCRFVTGBYHNUJMIKOLPQAZWSX <
9: <RFVGYBHNUJMIKOLPQAZWSXEDCT <
10: <TGBYHNUJMIKOLPQAZWSXEDCRFV <
11: <WSXEDCRFVTGBYHNUJMIKOLPQAZ <
12: <AZQWSXEDCRFVTGBYHNUJMIKOLP <
13: <VFRCDXESZWAQPLOKMIJNUHGBTG <
14: < KOLPQAZWSXEDCRFVTGBYHNUJM <'''
x = []
lines = txt.strip().split('n')
for line in lines:
x.append(line[4:31].strip().replace('<', ''))
print(x)
# 根据密文对应的密钥调整转表
key = '4,2,11,8,9,12,3,6,10,14,1,5,7,13'
key = key.split(',') # 转化为列表型
key = [int(i) for i in key] # 转化为数值型
print(key)
flag = []
mi = 'UNEHJPBIUOMAVZ'
for m, n in zip(key, mi):
flag.append(x[m - 1][x[m - 1].index(n):] + x[m - 1][:x[m - 1].index(n)])
print(flag)
for i in range(26):
for j in flag:
print(j[i],end='')
print()
提交SQCTF{maketysecgreat}即可
原文始发于微信公众号(智佳网络安全):【WP】第四届SQCTF网络安全及信息对抗大赛Crypto方向题目全解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论