一、[SWPU 2020]happy——RSA
1.题目
('c=', '0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9eL')
('e=', '0x872a335')
q + q*p^3 =1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586
qp + q *p^2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594
2.解题:
1>根据数学推导得到p、q,然后解flag。
s1和s2的公因数为 q*(1+p),s2除以公因数gcd(s1,s2)可得p,然后公因数除以(1+p),得到q。
2>十六进制字符串字符范围为0-9,a-f/A-F,超出范围的字符直接去掉,对解密文无影响。
密文末尾包含L,不属于十六进制字符范围,直接去掉
3.python脚本
import gmpy2
import libnum
c = int('0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9e', 16)
# 十六进制没有L,直接去掉
e = int('0x872a335', 16)
s1 = 1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586
s2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594
s3 = gmpy2.gcd(s1, s2)
p = s2//s3
q = s3//(1+p)
print(p)
print(q)
n = p*q
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
m = gmpy2.powmod(c, d, n)
print(libnum.n2s(int(m)))
NSSCTF{happy_rsa_1}
二、[HDCTF 2023]爬过小山去看云——希尔密码,云影密码
1.题目:
密文:ymyvzjtxswwktetpyvpfmvcdgywktetpyvpfuedfnzdjsiujvpwktetpyvnzdjpfkjssvacdgywktetpyvnzdjqtincduedfpfkjssne
在山的那头,有3个人,4只鸟,19只羊,11朵云
2.解题:
1>题目中提示山,即为hill,是希尔密码(Hill Cipher),使用解密工具,秘钥为3 4 19 11。
YOURPINISEIGHTFOURTWOZEROEIGHTFOURTWOONEZEROEIGHTEIGHTFOURZEROTWOFOURZEROEIGHTFOURZEROONEZEROONETWOFOURX
2>将字母变为小写
input_string = 'YOURPINISEIGHTFOURTWOZEROEIGHTFOURTWOONEZEROEIGHTEIGHTFOURZEROTWOFOURZEROEIGHTFOURZEROONEZEROONETWOFOURX'
lowercase_string = input_string.lower()
print("小写字符串:", lowercase_string)
your pin is eight four two zero eight four two one zero eight eight four zero two four zero eight four zero one zero one two four x
PIN" 是 "Personal Identification Number" 的缩写,意为个人识别号码。在日常生活中,PIN通常指代用于验证身份或进行交易的数字密码。
根据英文得到一串数字842 0 8421 0 884 0 24 0 84 0 1 0 124,数字由01248组成,而且题目中提到了云,猜测是云影密码,解密后得到flag
14 15 20 6 12 1 7 —— NOTFLAG
NSSCTF{NOTFLAG}
三、[BJDCTF 2020]EasyRSA——RSA
1.题目:
from Crypto.Util.number import getPrime,bytes_to_long
from sympy import Derivative
from fractions import Fraction
from secret import flag
p=getPrime(1024)
q=getPrime(1024)
e=65537
n=p*q
z=Fraction(1,Derivative(arctan(p),p))-Fraction(1,Derivative(arth(q),q))
m=bytes_to_long(flag)
c=pow(m,e,n)
print(c,z,n)
'''
output:
7922547866857761459807491502654216283012776177789511549350672958101810281348402284098310147796549430689253803510994877420135537268549410652654479620858691324110367182025648788407041599943091386227543182157746202947099572389676084392706406084307657000104665696654409155006313203957292885743791715198781974205578654792123191584957665293208390453748369182333152809882312453359706147808198922916762773721726681588977103877454119043744889164529383188077499194932909643918696646876907327364751380953182517883134591810800848971719184808713694342985458103006676013451912221080252735948993692674899399826084848622145815461035
32115748677623209667471622872185275070257924766015020072805267359839059393284316595882933372289732127274076434587519333300142473010344694803885168557548801202495933226215437763329280242113556524498457559562872900811602056944423967403777623306961880757613246328729616643032628964072931272085866928045973799374711846825157781056965164178505232524245809179235607571567174228822561697888645968559343608375331988097157145264357626738141646556353500994924115875748198318036296898604097000938272195903056733565880150540275369239637793975923329598716003350308259321436752579291000355560431542229699759955141152914708362494482
15310745161336895413406690009324766200789179248896951942047235448901612351128459309145825547569298479821101249094161867207686537607047447968708758990950136380924747359052570549594098569970632854351825950729752563502284849263730127586382522703959893392329333760927637353052250274195821469023401443841395096410231843592101426591882573405934188675124326997277775238287928403743324297705151732524641213516306585297722190780088180705070359469719869343939106529204798285957516860774384001892777525916167743272419958572055332232056095979448155082465977781482598371994798871917514767508394730447974770329967681767625495394441
'''
2.解题:
1>
Fraction(分子,分母)——创建一个分数
Derivative(函数表达式,对那个变量求导)——求导
arctan()——反正切函数
arth()——反双曲正切函数
2>数学推导
n = p*q
p+q = z+2*n
p-q = z - 2*n
然后求p、q,之后求d,解flag
3.python脚本
import gmpy2
import libnum
import binascii
e=65537
c = 7922547866857761459807491502654216283012776177789511549350672958101810281348402284098310147796549430689253803510994877420135537268549410652654479620858691324110367182025648788407041599943091386227543182157746202947099572389676084392706406084307657000104665696654409155006313203957292885743791715198781974205578654792123191584957665293208390453748369182333152809882312453359706147808198922916762773721726681588977103877454119043744889164529383188077499194932909643918696646876907327364751380953182517883134591810800848971719184808713694342985458103006676013451912221080252735948993692674899399826084848622145815461035
z = 32115748677623209667471622872185275070257924766015020072805267359839059393284316595882933372289732127274076434587519333300142473010344694803885168557548801202495933226215437763329280242113556524498457559562872900811602056944423967403777623306961880757613246328729616643032628964072931272085866928045973799374711846825157781056965164178505232524245809179235607571567174228822561697888645968559343608375331988097157145264357626738141646556353500994924115875748198318036296898604097000938272195903056733565880150540275369239637793975923329598716003350308259321436752579291000355560431542229699759955141152914708362494482
n = 15310745161336895413406690009324766200789179248896951942047235448901612351128459309145825547569298479821101249094161867207686537607047447968708758990950136380924747359052570549594098569970632854351825950729752563502284849263730127586382522703959893392329333760927637353052250274195821469023401443841395096410231843592101426591882573405934188675124326997277775238287928403743324297705151732524641213516306585297722190780088180705070359469719869343939106529204798285957516860774384001892777525916167743272419958572055332232056095979448155082465977781482598371994798871917514767508394730447974770329967681767625495394441
s1 = gmpy2.iroot(z+2*n, 2)[0] # 开根号不能使用sqrt(),sqrt()返回值不是大整数,而iroot()返回值如果是整数,可以认为是大整数,invert()中使用的数据要求是大整数
s2 = gmpy2.iroot(z-2*n, 2)[0]
p = (s1+s2)//2
q = n//p
phi = (p-1)*(q-1)
d = gmpy2.invert(e, phi)
m = gmpy2.powmod(c, d, n)
print(libnum.n2s(int(m)))
开根号不能使用sqrt(),sqrt()返回值不是大整数,而iroot()返回值如果是整数,可以认为是大整数,invert()中使用的数据要求是大整数
NSSCTF{Advanced_mathematics_is_too_hard!!!}
四、[CISCN 2022 西南]rsa——RSA
1.题目:
from Crypto.Util.number import *
import gmpy2
flag = b'XXXXXXXX'
p1 = getPrime(700)
r1 = getPrime(700)
for i in range(10):
q1 = 5*p1+i
n = p1*q1*r1
p3 = pow(p1,3,n)
q3 = pow(q1,3,n)
print(p3)
print(q3)
'''
p3 = 29914513810588158800677413177910972738704129106546850855032986405861482276089830788972187432277517348644647399654780884571794069905291936470934226328931651386658328163535027343107140438177837479649822914209171476632450951930287641742344330471734177295804718555774395704231261550376220154493373703096062950390869299905383682611063374747752091585836452902373843865043412096365874638466683035848817858586173172058756256354758712684819253211761289032789542371351760915771791997388241121078055468403109260493642435791152671979552597191217179672328555740595434990908530985477314228867209314472001848844089467987561661918366232980944933533
q3 = 66208618374366130551979192465001581263127328176551695213970812805980115496523825511250542987452691413485117902772315362811067501379171731387904074565035353566976164797769439898266222919741874340315356585585077141595328441423323822407738375537476582506440045835592730211502035261968878999959340204806442390319739977816872969200022096331677277225467021553564212725120939434924481787524609852608476848761521446441776154400518315701988027274150425936061679275540502720782853648148897480117033152064922234451671636288396704170234613549011854618414776342798740690128675106027908639984431432591397555541420243824539205614036979987830125678
'''
P = getPrime(1024)
Q = getPrime(1024)
N = P * Q
E = 65537
lcm = gmpy2.lcm(P-1, Q-1)
e1 = gmpy2.invert(p1, lcm)
e2 = gmpy2.invert(r1, lcm)
m = bytes_to_long(flag)
c = pow(m, E, N)
print(lcm)
print(c)
print(N)
'''
lcm = 4292158730589770192682795435047249488185453170529228019750042608688907718268448193363838203887391025871515871000364259326343790645215256385842265899206372365402431198699714374850409466996627163968391249416054093529090485677808301343590811445080871279796162536469847469761747058736980603093722710824453312207182881241846080117790728778291633761198069016865260030288832065807438020772711645648333908622890343009942617559434851450007195025869850769670769715654662127278293639938359741401336592219730356884542179574372134014927006215640945952229142436595334916765255426954857520777553915330597952622785359222832224632624
c = 4288727484183191191687364666620023549392656794153112764357730676861570386983002380982803054964588111708662498647767438881892355599604826306427809017097724346976778230464708540600157055782723189971534549543664668430013171469625043063261219462210251726207552819381767396148632877168530609902046293626355744288863460554297860696918890189350721960355460410677203131993419723440382095665713164422367291153108363066159712951217816814873413423853338021627653555202253351957999686659021298525147460016557904084617528199284448056532965033560516083489693334373695545423561715471204868795248569806148395196572046378679014697206
N = 17168634922359080770731181740188997952741812682116912079000170434755630873073792773455352815549564103486063484001457037305375162580861025543369063596825489461609724794798857499401637867986508655873564997664216374116361942711233205374363245780323485119184650145879389879046988234947922412374890843297813248828996855478005656041814919367820336728271583686844991928889831691815821365423570311291064846736832327637944358854661523107817781673029406341843040857813841671405147146887291204140157388049394514390098066284975682117038362207142272098796924412602725857521665773622056312191400612944442008222587867782281556388669
'''
2.解题:
题目看着很复杂,但是p3、q3以上的部分没用,lcm就是phi,直接求d,然后就可以求flag
3.python脚本
import gmpy2
import libnum
lcm = 4292158730589770192682795435047249488185453170529228019750042608688907718268448193363838203887391025871515871000364259326343790645215256385842265899206372365402431198699714374850409466996627163968391249416054093529090485677808301343590811445080871279796162536469847469761747058736980603093722710824453312207182881241846080117790728778291633761198069016865260030288832065807438020772711645648333908622890343009942617559434851450007195025869850769670769715654662127278293639938359741401336592219730356884542179574372134014927006215640945952229142436595334916765255426954857520777553915330597952622785359222832224632624
c = 4288727484183191191687364666620023549392656794153112764357730676861570386983002380982803054964588111708662498647767438881892355599604826306427809017097724346976778230464708540600157055782723189971534549543664668430013171469625043063261219462210251726207552819381767396148632877168530609902046293626355744288863460554297860696918890189350721960355460410677203131993419723440382095665713164422367291153108363066159712951217816814873413423853338021627653555202253351957999686659021298525147460016557904084617528199284448056532965033560516083489693334373695545423561715471204868795248569806148395196572046378679014697206
N = 17168634922359080770731181740188997952741812682116912079000170434755630873073792773455352815549564103486063484001457037305375162580861025543369063596825489461609724794798857499401637867986508655873564997664216374116361942711233205374363245780323485119184650145879389879046988234947922412374890843297813248828996855478005656041814919367820336728271583686844991928889831691815821365423570311291064846736832327637944358854661523107817781673029406341843040857813841671405147146887291204140157388049394514390098066284975682117038362207142272098796924412602725857521665773622056312191400612944442008222587867782281556388669
E = 65537
d = gmpy2.invert(E, lcm)
m = gmpy2.powmod(c, d, N)
print(libnum.n2s(int(m)))
NSSCTF{h3ll0_wo21d!}
五、[LitCTF 2023]md5的破解——MD5
1.题目:
from Crypto.Util.number import *
from hashlib import md5
from secret import flag
#flag全是由小写字母及数字组成
m=md5(flag).hexdigest()
print(flag[:13]+flag[15:18]+flag[19:34]+flag[35:38])
print(m)
# b'LitCTF{md5can3derypt213thoughcrsh}'
# 496603d6953a15846cd7cc476f146771
2.解题:
题目中输出了部分flag和全部flag的md5值,MD5的字符为0-9、a-z/A-Z,题目中说flag全部由小写字母和数字组成,所以从0-9和a-z中找到使flag的md5值符合题目给出的MD5值即可。
3.python
from hashlib import md5
code = 'abcdefghigklmnopqrstuvwxyz0123456789'
for v1 in code:
for v2 in code:
for v3 in code:
for v4 in code:
flag = 'LitCTF{md5can'+v1+v2+'3de'+v3+'rypt213thoughcr'+v4+'sh}'
if md5(flag.encode()).hexdigest() == '496603d6953a15846cd7cc476f146771':
print(flag)
NSSCTF{md5can123dexrypt213thoughcrpsh}