2023SWPU NSS Crpyto WP

一、Caesar_base

1.题目描述

Caesar罢了!

打开文本根据提示:7

根据提示

将这串base进行凯撒解密,偏移量为7

flag为

NSSCTF {Gen5h1n_5t@rt5!}

二、EasyRSA

1.题目描述

你会RSA吗

2.解题方法

下载后的源码

import libnum

p=libnum.generate_prime(1024)

q=libnum.generate_prime(1024)

e=65537

m="NSSCTF{*****************}"
m=libnum.s2n(m)
n=pqphi_n=(p-1)(q-1)
d=libnum.invmod(e,phi_n)
c=pow(m,e,n)
print("p=",p)
print("q=",q)
print ("e=",e)
print ("c=",c)

#p= 122912801126049869009003839542545176400185213365268209105714006257803073428638629824801261702125287814910668428403367391355051987389837804474055637991864563803834741161217607848968821280710324766558457056004037592628178078680121173634128054936108782807954132605887275556228703383455969903056759874047110115433

#q= 120790113700754477830062212762518406876786376726996249661848284428829412089402183812692045970711341815805796005449714738748110749559462448861357011272792817313060401380148108517705435100103533857957024851181447994572972501120774586405811257420853542417275740953525627232008812587423053626515513859653865873671

#e= 65537

#c= 7094224488947659163318199615533819770556597977720767621640224798887506152292861133457571683713587909779712343346370719403811813233693263526316785431883833118583425528830238629831001255198236686372518770451273159769779374149881346761523688131115323441973953523582174059584087249568245044443295176738493785560215046375056269378223045128094953923926250055718405799885041115025529297362914403732661935017257507786348635366480744933193471899621592092711962814949533564454932121056035003021428158830645604347966849572981124877683317022116903132719663958775850982016292384237647664448371811915879714093710876989697939277005

根据所给的数

可以看出是rsa算法中的已知p,q,e,c求明文m

脚本如下

import libnum

from Crypto.Util.number import *

p= 122912801126049869009003839542545176400185213365268209105714006257803073428638629824801261702125287814910668428403367391355051987389837804474055637991864563803834741161217607848968821280710324766558457056004037592628178078680121173634128054936108782807954132605887275556228703383455969903056759874047110115433

q= 120790113700754477830062212762518406876786376726996249661848284428829412089402183812692045970711341815805796005449714738748110749559462448861357011272792817313060401380148108517705435100103533857957024851181447994572972501120774586405811257420853542417275740953525627232008812587423053626515513859653865873671

e= 65537

c= 7094224488947659163318199615533819770556597977720767621640224798887506152292861133457571683713587909779712343346370719403811813233693263526316785431883833118583425528830238629831001255198236686372518770451273159769779374149881346761523688131115323441973953523582174059584087249568245044443295176738493785560215046375056269378223045128094953923926250055718405799885041115025529297362914403732661935017257507786348635366480744933193471899621592092711962814949533564454932121056035003021428158830645604347966849572981124877683317022116903132719663958775850982016292384237647664448371811915879714093710876989697939277005 m = "NSSCTF{*******************}"

m = libnum.s2n(m)

n = p * q

phi_n = (p - 1) * (q - 1)

d = libnum.invmod(e, phi_n)

m = pow(c,d ,n)

string=long_to_bytes(m) print(string)

flag为

NSSCTF{RSA_1s_so_ea3y_and_interest1ng!}

三、dpdp

1.题目描述

dp是?

2.解题方法

源码

from Crypto.Util.number import *

from libnum import *

flag = b'NSSCTF{****}' + b'1010101010101010101010101010101010101010100010101010101010101010101101'p = getPrime(512)q = getPrime(512)n = pqe = 65537d = inverse(e, (p-1)(q-1))

dp = d % (p-1)

m = s2n(flag)

c = pow(m, e, n)

print(f'n = {n}')

print(f'c = {c}')

print(f'dp = {dp}')

'''

n = 62950660589752377241535942010457460675378335694404721223426371627802159493655570041534480026979837056215567303530448462076388942749116962945931432723672826148999814815864738069663127706046027850586024555861960247057288826014343547293035737544457656904257388300461848219257240252715837662741274235378360898441

c = 26392919777656338278184497106215581599692023606797351841011065350738534402079717897589592521000832026751736045905247050532819571969784687491977953157313304550096179520376626220816081159472339787295872214912587497324709488986746768994907107727184468228540635002062232484115731701648311946527233449512543132274

dp = 7088497034630351463006975624795947102639056977565074157092915907376477955247769847204254053775159112398217033648894620506901638351932922911273150932128973

'''

如以上可以看出是rsa中的pd泄露

将pd进行分离从而求得flag

脚本如下

import gmpy2

from Crypto.Util.number import *

flag = b'NSSCTF{******}' + b'1010101010101010101010101010101010101010100010101010101010101010101101' e = 65537

n = 62950660589752377241535942010457460675378335694404721223426371627802159493655570041534480026979837056215567303530448462076388942749116962945931432723672826148999814815864738069663127706046027850586024555861960247057288826014343547293035737544457656904257388300461848219257240252715837662741274235378360898441 c = 26392919777656338278184497106215581599692023606797351841011065350738534402079717897589592521000832026751736045905247050532819571969784687491977953157313304550096179520376626220816081159472339787295872214912587497324709488986746768994907107727184468228540635002062232484115731701648311946527233449512543132274 dp = 7088497034630351463006975624795947102639056977565074157092915907376477955247769847204254053775159112398217033648894620506901638351932922911273150932128973 for i in range(1,65538):

if (dp*e-1)%i == 0:

if n%(((dp*e-1)//i)+1)==0:

p=(dp*e-1)//i+1

q=n//(((dp*e-1)//i)+1)

phi = (p-1)*(q-1)

d = gmpy2.invert(e,phi)%phi  

print(long_to_bytes(pow(c,d,n)))

flag为

NSSCTF{CTFCTFNSSNSS}

四、close

1.题目描述

很接近

hint1:p、q那么接近吗

2.解题思路

源码

from libnum import *

from gmpy2 import *

p=generate_prime(1024)

q=next_prime(p)

e=65537

m='NSSCTF{*****}'m=s2n(m)n=pqphi=(p-1)(q-1)

d=invmod(e,phi)

c=pow(m,e,n)

print("n=",n)

print("e=",e)

print("c=",c)

n= 24981376790941538042242194741227892897407513396986731688877133454927442860995432316502739082570143505514748189761926835267759902439088795405888334103808204493954060044146586606969762154041793765844462081845490598211667272961234605967919438875499785814549051002289336390400088945736443426364361032870741024016549739096474413537901098157940458928277363388694717514323106251487767419607466664175936942972759711506228656400164583540573319572125036265662330306877811831045019686459493451558882811173136631573392182233161484350878695026357462290962322316959710815852914274474767115283825849610223430527125542218326259388501

e= 65537

c= 20159395346151098135636315342962498279920000537186367678734614295342297238729946157173169398141183795295342421626812913110784320710149318393656661582157610182569479131625808166266400522513050071081253869746865806961410702124426021839786686971490883603141916263075756918270160269956469968815381434371042453456185750940323619568741956243054983302281739844073931738335165924679149156513059772597287311150001080524533236565521881558592378167621577532597521749930820990533120461791013359786254216859344006298715497621642857727174896969485816794718062289736382736417151820935214824518306312811267158057425922650562544599188

从以上给的数值

可以看出是rsa算法中的已知n,e,c求明文m

首先需要将n分离

使用yafu工具cmd分离n

得到p,q的值

脚本如下:

from libnum

import * from Crypto.Util.number import *

n= 24981376790941538042242194741227892897407513396986731688877133454927442860995432316502739082570143505514748189761926835267759902439088795405888334103808204493954060044146586606969762154041793765844462081845490598211667272961234605967919438875499785814549051002289336390400088945736443426364361032870741024016549739096474413537901098157940458928277363388694717514323106251487767419607466664175936942972759711506228656400164583540573319572125036265662330306877811831045019686459493451558882811173136631573392182233161484350878695026357462290962322316959710815852914274474767115283825849610223430527125542218326259388501

e= 65537

c= 20159395346151098135636315342962498279920000537186367678734614295342297238729946157173169398141183795295342421626812913110784320710149318393656661582157610182569479131625808166266400522513050071081253869746865806961410702124426021839786686971490883603141916263075756918270160269956469968815381434371042453456185750940323619568741956243054983302281739844073931738335165924679149156513059772597287311150001080524533236565521881558592378167621577532597521749930820990533120461791013359786254216859344006298715497621642857727174896969485816794718062289736382736417151820935214824518306312811267158057425922650562544599188 p=158054980278830625787607821228153979017973841145625115332019173791086924596556201871964333162406170124977473462542065318919588875974709337622295876075952432663748968291784256703947670762276833735684292310972149711932228346808456820059705880821172173103815077044099273212277966484119879252690535151920164421209 q=158054980278830625787607821228153979017973841145625115332019173791086924596556201871964333162406170124977473462542065318919588875974709337622295876075952432663748968291784256703947670762276833735684292310972149711932228346808456820059705880821172173103815077044099273212277966484119879252690535151920164420189

e=65537

m='NSSCTF{*******}'

m=s2n(m)

n=p*q phi=(p-1)*(q-1)

d=invmod(e,phi)

print(long_to_bytes(pow(c,d,n)))

flag为

NSSCTF{1d518f8b-5878-11ee-acac-c03c59457d4d}

五、Classical Cipher

1.题目描述

Classical(古典)

2.解题方法

下载后打开文件源码

一只兔子翻过5层栅栏去找base玩

U2FsdGVkX19aQNEomnRqmmLlI9qJkzr0pFMeMBF99ZDKTF3CojpkTzHxLcu/ZNCYeeAV3/NEoHhpP5QUCK5Ac+HJlZBMGdKDYwko5+sAATQ=

从中找出解密规律

兔子解密(Rabbit)

网址:在线Rabbit加密 | Rabbit解密- 在线工具 (sojson.com)

栅栏解密

base解密

flag为

NSSCTF{Welc0me_t0_the_w0rld_0f_crypt0graphy!!!}

六、polynomial

1.题目描述

你会math吗

hint1:只是解个多项式;

2.解题思路

源码

from Crypto.Util.number import *

flag = b'NSSCTF{******}'

m = bytes_to_long(flag)

a = getPrime(512)

b = getPrime(512)

c = getPrime(512)

d = getPrime(512)

e = getPrime(512)

x = getPrime(64)

p = getPrime(1024)

y = ax**4 + bx3 + c*x2 + d*x + e

y = y%p

print(f'p = {p}')

print(f'a = {a}')

print(f'b = {b}')

print(f'c = {c}')

print(f'd = {d}')

print(f'e = {e}')

print(f'y = {y}')

print(f'h = {x*m}')

'''

p = 158805288384650271811274620112885426807134870587281058486409657841571541118874370262125616758392586636436387032461169543181918821693975663497124408432536495676514953509756505781488235396628730376794651046582155886825258656047349260441547239700695773934518441411466809921946609164932234396841476405798428700843

a = 6782997653971692606019358747667066963688636909392719204001155907616272998599567932030340899158310591583056298423803386927289244122405887173827359025095219

b = 7373784501270128110088353737302182289453185058537147667058852830178883492374394182313086562761123093282613985656842374554466162992585768060168515936322837

c = 12604317328077074383094898759023155531982085126299017370476099122695860476733267706510100804874716354025394150676456477445303955715981977583036765619931291

d = 8651550199315105291497863570314512750737000678752642987669418859342691686702373116147125246177399639155277789016646392989483699799276013474039473014389069

e = 6819653219987864110332165353640553980353581969662542365282269257622467162685937603557862048653003559950780009596692439320585574228684924030626160305559221

y = 187626421635118933741196210961559541641107643327742932086152135660947241144749750951157691964883138108211067837818748515766812840026814947057023367814232867155997328882540000727585104081833734697954005690818776434169815240704563337

h = 36198427687223295973782557044383345640934859884880641150183916728479006412929786917944908958646498915497129126843345300628359

'''

这是一个多项式

源码中缺少x的直接

求x的值

脚本如下:

from sympy import symbols, Eq, solve

x = symbols('x')

a = 6782997653971692606019358747667066963688636909392719204001155907616272998599567932030340899158310591583056298423803386927289244122405887173827359025095219 b = 7373784501270128110088353737302182289453185058537147667058852830178883492374394182313086562761123093282613985656842374554466162992585768060168515936322837 c = 12604317328077074383094898759023155531982085126299017370476099122695860476733267706510100804874716354025394150676456477445303955715981977583036765619931291 d = 8651550199315105291497863570314512750737000678752642987669418859342691686702373116147125246177399639155277789016646392989483699799276013474039473014389069 e = 6819653219987864110332165353640553980353581969662542365282269257622467162685937603557862048653003559950780009596692439320585574228684924030626160305559221 h = 36198427687223295973782557044383345640934859884880641150183916728479006412929786917944908958646498915497129126843345300628359

y = 187626421635118933741196210961559541641107643327742932086152135660947241144749750951157691964883138108211067837818748515766812840026814947057023367814232867155997328882540000727585104081833734697954005690818776434169815240704563337 equation = Eq(a * x**4 + b * x**3 + c * x**2 + d * x + e, y)

solution = solve(equation, x)

for sol in solution:

print(f'x = {sol}')

已知h加密后密文和x私钥的解密指数从而求的明文m

from sympy import symbols, Eq, solve

from Crypto.Util.number import *

x = symbols('x')

a = 6782997653971692606019358747667066963688636909392719204001155907616272998599567932030340899158310591583056298423803386927289244122405887173827359025095219 b = 7373784501270128110088353737302182289453185058537147667058852830178883492374394182313086562761123093282613985656842374554466162992585768060168515936322837 c = 12604317328077074383094898759023155531982085126299017370476099122695860476733267706510100804874716354025394150676456477445303955715981977583036765619931291 d = 8651550199315105291497863570314512750737000678752642987669418859342691686702373116147125246177399639155277789016646392989483699799276013474039473014389069 e = 6819653219987864110332165353640553980353581969662542365282269257622467162685937603557862048653003559950780009596692439320585574228684924030626160305559221 y = 187626421635118933741196210961559541641107643327742932086152135660947241144749750951157691964883138108211067837818748515766812840026814947057023367814232867155997328882540000727585104081833734697954005690818776434169815240704563337

h = 36198427687223295973782557044383345640934859884880641150183916728479006412929786917944908958646498915497129126843345300628359

x = 12896387745855437651

equation = Eq(a * x**4 + b * x**3 + c * x**2 + d * x + e, y)

solution = solve(equation, x)

for sol in solution:

print(f'x = {sol}')

m= h//x

print(long_to_bytes(m))

flag为

NSSCTF{05223898-4a23-11ee-ae75-c03c59457d4d}

七、肮脏的base64

1.题目描述

oi!被加密了

2.解题思路

打开是个有加密的压缩包

使用密码爆破工具爆破,得到密码是CTF

看到是加密的码表,使用base64换表

flag为

NSSCTF{WIKEY_GivE_u_this_f1ag}

八、dpdpdpdp

1.题目描述

eeeeee

2.解题思路

源码

from Crypto.Util.number import *

flag = b'NSSCTF{****}'

p = getPrime(512)

q = getPrime(512)

n = pqe = getPrime(128)

d = inverse(e, (p-1)(q-1))

dp = d % (p-1)

m = bytes_to_long(flag)

c = pow(m, e, n)

print(f'n = {n}')

print(f'e = {e}')

print(f'c = {c}')

print(f'dp = {dp}')

'''

n = 92288362151232755164303382554034496430634785857894506752180261103500715219090974532177552845107426542175470207920267802066773828210866572070045093611090322738109527534622730588618668861998969946471756352024368486322527057077613762697792913167023012077178671066981439295386486943067698150993422039585259179729

e = 229991316986730339421575788374847647237

c = 66178170892880340054212366602556925884485962775832591797127163461420023986798822926684824340567060840259672460835004142425374706821346941926520921852009455818529825976414766339170445233789109526300838535719649346266975388774091834431039678689254534566870194580604694419819400454951059125553501095973278807456

dp = 8987556601717285362487353965045062789633142861774364363374961991445049127918653163458814169532860957264061203394944931114888144611267605606197232438332289

'''

根据以上的所给的值

可以判断是pd泄露

这题更dpdp的dp分离的原理不一样这是通过求p的最大公约数来推到计算

从而分解p,q

脚本如下:

import gmpy2

from Crypto.Util.number import *

n= 92288362151232755164303382554034496430634785857894506752180261103500715219090974532177552845107426542175470207920267802066773828210866572070045093611090322738109527534622730588618668861998969946471756352024368486322527057077613762697792913167023012077178671066981439295386486943067698150993422039585259179729 e=229991316986730339421575788374847647237 c=66178170892880340054212366602556925884485962775832591797127163461420023986798822926684824340567060840259672460835004142425374706821346941926520921852009455818529825976414766339170445233789109526300838535719649346266975388774091834431039678689254534566870194580604694419819400454951059125553501095973278807456 dp=8987556601717285362487353965045062789633142861774364363374961991445049127918653163458814169532860957264061203394944931114888144611267605606197232438332289

p=gmpy2.gcd(pow(2,e*dp,n)-2,n)

q = n // p

phi_n = (p - 1) * (q - 1)

d = gmpy2.invert(e, phi_n) 
print(long_to_bytes(pow(c,d,n)))

flag为

NSSCTF{D0_YoU_WAN1_TO_J0In_NsSCTf}

九、小明文?

1.题目描述

好小的e

2.解题思路

源码

def attack(c1, c2, a, b, e, n):
    PR.<x> = PolynomialRing(Zmod(n))
    g1 = x ^ e - c1
    g2 = (a * x + b) ^ e - c2
    def gcd(g1, g2):
        while g2:
            g1, g2 = g2, g1 % g2
        return g1.monic()
    return -gcd(g1, g2)[0]

e = 5
n = 13026126941826887019162872735099540876106694302074884925200107036130428843197729140372377590706535217469477301361486550282890330093772372813532795303163348233096919179478061917423707929667355386062657434467799360617526194768968700908096844475960205671302377364202483195391706116078632202015938962280529309403244885363904094804118278167720593581764017089021116316636464533785051436622916960956665030100255641288863474938703
a = 280807370135687531454416708417179457159
b = 210598260561987226227971066630761929397
c1 = 5484670538103757119990644460454986219076673914082966464351809153114702100411054106785392646801736865489738145857425179185164710603704198643749378051371008266521829572436350080663825339915763509501690398283916091505443322384568973565599179112299853287766734493187659418383619877040013434926843623979979122417950089001830664273269598688130410251828579862218274297572192961909808728768317567218412746711665911495028223620671
c2 = 249587944874112168607313602465869274336587750392364868939732783502223999305089384749508572630699199927194600499968110646290832205640569694933539973256281796631433129626712361622584048439446364992886884217198680921278383770604919381329363647924261642857483728973331091285820401689502291336332199019252649615680893389557508558362194551939434128389351824194393680744241807605416750291337127085044177563509645273228457253193
m = attack(c1, c2, a, b, e, n)
print(m)

知识导入:

以下图是借鉴

总结:Franklin-Reiter相关消息攻击(Franklin-Reiter related-message attack):如果两个信息之间存在已知的固定差异,并且在相同的模数n下进行RSA加密,那么就有可能恢复出这两个消息

脚本如下:

注意:python没有这模块需要到sage跑

工具网址:Sage Cell Server (sagemath.org)

def attack(c1, c2, a, b, e, n):

PR.<x> = PolynomialRing(Zmod(n))

g1 = x ^ e - c1

g2 = (a * x + b) ^ e - c2

def gcd(g1, g2):

while g2:

g1, g2 = g2, g1 % g2

return g1.monic()

return -gcd(g1, g2)[0]

e = 5

n = 13026126941826887019162872735099540876106694302074884925200107036130428843197729140372377590706535217469477301361486550282890330093772372813532795303163348233096919179478061917423707929667355386062657434467799360617526194768968700908096844475960205671302377364202483195391706116078632202015938962280529309403244885363904094804118278167720593581764017089021116316636464533785051436622916960956665030100255641288863474938703

a = 280807370135687531454416708417179457159

b = 210598260561987226227971066630761929397

c1 = 5484670538103757119990644460454986219076673914082966464351809153114702100411054106785392646801736865489738145857425179185164710603704198643749378051371008266521829572436350080663825339915763509501690398283916091505443322384568973565599179112299853287766734493187659418383619877040013434926843623979979122417950089001830664273269598688130410251828579862218274297572192961909808728768317567218412746711665911495028223620671

c2 = 249587944874112168607313602465869274336587750392364868939732783502223999305089384749508572630699199927194600499968110646290832205640569694933539973256281796631433129626712361622584048439446364992886884217198680921278383770604919381329363647924261642857483728973331091285820401689502291336332199019252649615680893389557508558362194551939434128389351824194393680744241807605416750291337127085044177563509645273228457253193

m = attack(c1, c2, a, b, e, n)

print(m)

解出了个10进制

2806865643354785582447058473372538382961766115574914049099282462437697164397424611542516856194548817486973

直接使用python long_to_bytes函数转字节数组

from Crypto.Util.number import * 

a=2806865643354785582447058473372538382961766115574914049099282462437697164397424611542516856194548817486973 
print(long_to_bytes(a))

flag为

NSSCTF{89c507f3-4a21-11ee-a71e-c03c59457d4d}

另外还分享一个密码工具可以解这里面好像一共6题可以跑出来(是否会使用看自己咯)

链接:https://pan.baidu.com/s/1tYgBEozNFd7TauPv9gP4rQ?pwd=0f6q 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值