CTFhub-5⭐-Crypto-WP

CTFhub-5⭐-Crypto-WP

Modern Clueless Child

题目描述:
image

下载附件打开后得到一.txt文件:

'I was surfing the crimson wave and oh my gosh I was totally bugging. I also tried out the lilac hair trend but it didn't work out. That's not to say you are any better, you are a snob and a half. But let's get back to the main question here- Who am I? (You don't know my name)'
Ciphertext = "52f41f58f51f47f57f49f48f5df46f6ef53f43f57f6cf50f6df53f53f40f58f51f6ef42f56f43f41f5ef5cf4e(hex)
Key = "12123"

这开头的一串英文看的我是头疼的很,根本不知道他在说什么。。。再看密文是以16进制呈现的,然后给了一个Key。然后我就没思路了。。。

最后还是得看百度啊---->CRYPTO | CTF Writeups (noob-atbash.github.io)这篇文章写的不错:

I don’t know that what their challenege description means I just focused on ciphertext and key and considered it as XOR problem but if you blindly try to solve the XOR with key it won’t work if you analyse the cipher text pattern you will find that f is being used for spacing so simply remove the f from ciphertext.

这就是带佬的直觉吗?一下子就感觉是异或加密。不过这里面确实有一点我没有注意到的,那就是他的密文是隔两个字符插入一个f的,这个我没看出来属实不应该。但在这道题中我除了对异或加密见了个面之外,学到的最有用的是对与是否为异或加密的判断。

flag = bytes.fromhex('52415851475749485d466e5343576c506d53534058516e425643415e5c4e')
print(xor(flag, 'csictf{'.encode()))
b"1212312+./\r'%,\x0f#\x040'&#2\x1d+57'%?="

通过将已知部分明文和密文进行异或运算,然后就可以得到密钥了。然后就是正常的解密脚本

from pwn import xor
flag = bytes.fromhex('52415851475749485d466e5343576c506d53534058516e425643415e5c4e')
print(xor(flag, '12123'.encode()))

FLAG:csictf{you_are_a_basic_person}


EasyRSA

题目描述:
image

下载附件得到一个.py文件:

from Crypto.Util.number import getPrime,bytes_to_long
from numpy import *
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:
c = 7922547866857761459807491502654216283012776177789511549350672958101810281348402284098310147796549430689253803510994877420135537268549410652654479620858691324110367182025648788407041599943091386227543182157746202947099572389676084392706406084307657000104665696654409155006313203957292885743791715198781974205578654792123191584957665293208390453748369182333152809882312453359706147808198922916762773721726681588977103877454119043744889164529383188077499194932909643918696646876907327364751380953182517883134591810800848971719184808713694342985458103006676013451912221080252735948993692674899399826084848622145815461035
z = 32115748677623209667471622872185275070257924766015020072805267359839059393284316595882933372289732127274076434587519333300142473010344694803885168557548801202495933226215437763329280242113556524498457559562872900811602056944423967403777623306961880757613246328729616643032628964072931272085866928045973799374711846825157781056965164178505232524245809179235607571567174228822561697888645968559343608375331988097157145264357626738141646556353500994924115875748198318036296898604097000938272195903056733565880150540275369239637793975923329598716003350308259321436752579291000355560431542229699759955141152914708362494482
n = 15310745161336895413406690009324766200789179248896951942047235448901612351128459309145825547569298479821101249094161867207686537607047447968708758990950136380924747359052570549594098569970632854351825950729752563502284849263730127586382522703959893392329333760927637353052250274195821469023401443841395096410231843592101426591882573405934188675124326997277775238287928403743324297705151732524641213516306585297722190780088180705070359469719869343939106529204798285957516860774384001892777525916167743272419958572055332232056095979448155082465977781482598371994798871917514767508394730447974770329967681767625495394441
'''

这里先对脚本中两个函数进行一下解释:fractions.Fraction(a,b)就是a/b sympy.Derivative(f(x),a)就是对f(x)进行求导然后取得在x=a时的值

脚本里已经把RSA的c和e给出来了,这里需要根据给出的条件求出p,q。

z=Fraction(1,Derivative(arctan(p),p))-Fraction(1,Derivative(arth(q),q))理解为:

\[z=\frac{1}{\frac{1}{1+p^2}}-\frac{1}{\frac{1}{1-q^2}}=(1+p^2)-(1-q^2)=p^2+q^2 \]

再加上已知p*q=n,这不就有手就行了吗:

import gmpy2
import sympy

z = 32115748677623209667471622872185275070257924766015020072805267359839059393284316595882933372289732127274076434587519333300142473010344694803885168557548801202495933226215437763329280242113556524498457559562872900811602056944423967403777623306961880757613246328729616643032628964072931272085866928045973799374711846825157781056965164178505232524245809179235607571567174228822561697888645968559343608375331988097157145264357626738141646556353500994924115875748198318036296898604097000938272195903056733565880150540275369239637793975923329598716003350308259321436752579291000355560431542229699759955141152914708362494482
n = 15310745161336895413406690009324766200789179248896951942047235448901612351128459309145825547569298479821101249094161867207686537607047447968708758990950136380924747359052570549594098569970632854351825950729752563502284849263730127586382522703959893392329333760927637353052250274195821469023401443841395096410231843592101426591882573405934188675124326997277775238287928403743324297705151732524641213516306585297722190780088180705070359469719869343939106529204798285957516860774384001892777525916167743272419958572055332232056095979448155082465977781482598371994798871917514767508394730447974770329967681767625495394441
# z=p^2+q^2  n=p*q

s2 = z + 2*n  # s2 = p^2 + q^2 + 2*p*q = (p + q)^2
s = (gmpy2.iroot(s2,2)) # s = s2^(1/2) = p + q
#gmpy2.iroot(n,a)适用于大整数开a次方,这里如果使用a**1/2或者pow(a,1/2)进行开方会因为a过于大而报错
#print(s) ---> (mpz(250474028594377426111821218884061933467907597574578255066146260367094595399741196827532923836761733594976933366636149201492628708413319929361097646526652140204561542573663223469009835925309935515892458499676903149172534494580503088868430625144808189083708827363335045028702993282231537893799541685169911232442), True)
s = int(str(s)[5:-8]) #切除多余的部分,只保留数据

p = sympy.symbols('p')  #使用sympy提供的函数进行解方程
result = sympy.solve([p+n/p-s], [p])  # "p+n/p-s(=0)" p+n/p=s p+q =s
print(result)

最后的运行结果为:[(105909195259921349656664570904199242969110902804477734660927330311460997899731622163728968380757294196277263615386525795293086103142131020215128282050307177125962302515483190468569376643751587606016315185736245896434947691528567696271911398179288329609207435393579332931583829355558784305002360873458907029141,), (144564833334456076455156647979862690498796694770100520405218930055633597500009574663803955456004439398699669751249623406199542605271188909145969364476344963078599240058180033000440459281558347909876143313940657252737586803051935392596519226965519859474501391969755712097119163926672753588797180811711004203301,)]

最后解出了两个值,那么一个是p,另一个是q(更多关于sympy模块解方程的使用可以参考5.5Python数据处理篇之Sympy系列(五)---解方程 - 梦并不遥远 - 博客园 (cnblogs.com)这一篇博客)接下来就是一道正常的RSA题目了:

RSA常规解密(点击展开)
import gmpy2
from Crypto.Util.number import bytes_to_long, long_to_bytes
def Decrypt(c,e,p,q):
	L=(p-1)*(q-1)
	d=gmpy2.invert(e,L)
	n=p*q
	m=gmpy2.powmod(c,d,n)
	flag=str(m)
	return flag


p = 105909195259921349656664570904199242969110902804477734660927330311460997899731622163728968380757294196277263615386525795293086103142131020215128282050307177125962302515483190468569376643751587606016315185736245896434947691528567696271911398179288329609207435393579332931583829355558784305002360873458907029141
q = 144564833334456076455156647979862690498796694770100520405218930055633597500009574663803955456004439398699669751249623406199542605271188909145969364476344963078599240058180033000440459281558347909876143313940657252737586803051935392596519226965519859474501391969755712097119163926672753588797180811711004203301
e = 65537
c = 7922547866857761459807491502654216283012776177789511549350672958101810281348402284098310147796549430689253803510994877420135537268549410652654479620858691324110367182025648788407041599943091386227543182157746202947099572389676084392706406084307657000104665696654409155006313203957292885743791715198781974205578654792123191584957665293208390453748369182333152809882312453359706147808198922916762773721726681588977103877454119043744889164529383188077499194932909643918696646876907327364751380953182517883134591810800848971719184808713694342985458103006676013451912221080252735948993692674899399826084848622145815461035

print (Decrypt(c,e,p,q))
print(long_to_bytes(int(Decrypt(c,e,p,q))))

FLAG:BJD{Advanced_mathematics_is_too_hard!!!}


强网先锋-辅助

题目描述:
image

下载附件得到一.py文件:

flag=open("flag","rb").read()

from Crypto.Util.number import getPrime,bytes_to_long
p=getPrime(1024)
q=getPrime(1024)
e=65537
n=p*q
m=bytes_to_long(flag)
c=pow(m,e,n)
print(c,e,n)

p=getPrime(1024)
e=65537
n=p*q
m=bytes_to_long("1"*32)
c=pow(m,e,n)
print(c,e,n)

'''
output:
c = 2482083893746618248544426737023750400124543452082436334398504986023501710639402060949106693279462896968839029712099336235976221571564642900240827774719199533124053953157919850838214021934907480633441577316263853011232518392904983028052155862154264401108124968404098823946691811798952747194237290581323868666637357604693015079007555594974245559555518819140844020498487432684946922741232053249894575417796067090655122702306134848220257943297645461477488086804856018323986796999103385565540496534422406390355987976815450744535949785073009043007159496929187184338592859040917546122343981520508220332785862546608841127597 
e = 65537 
n = 14967030059975114950295399874185047053736587880127990542035765201425779342430662517765063258784685868107066789475747180244711352646469776732938544641583842313791872986357504462184924075227433498631423289187988351475666785190854210389587594975456064984611990461126684301086241532915267311675164190213474245311019623654865937851653532870965423474555348239858021551589650169602439423841160698793338115204238140085738680883313433574060243600028500600824624358473403059597593891412179399165813622512901263380299561019624741488779367019389775786547292065352885007224239581776975892385364446446185642939137287519945974807727
c = 3829060039572042737496679186881067950328956133163629908872348108160129550437697677150599483923925798224328175594483217938833520220087230303470138525970468915511111320396185482564783975435346354440035776909781158407636044986403819840648379609630039348895415045723208843631191252142600667607807479954194447237061080618370787672720344741413537975922184859333432197766580150534457001196765621678659952108010596273244230812327182786329760844037149719587269632133595149294067490955644893402708720284179715002149224068928828656515326446881791228638008572889331511945042911372915003805505412099102954073299010951896955362470 
e = 65537 
n = 14624662628725820618622370803948630854094687814338334827462870357582795291844925274690253604919535785934208081825425541536057550227048399837243392490762167733083030368221240764693694321150104306044125934201699430146970466657410999261630825931178731857267599750324918610790098952520113593130245010530961350592735239454337631927669542026935873535964487595433984902529960726655481696404006628917922241666148082741874033756970724357470539589848548704573091633917869387239324447730587545472564561496724882799495186768858324490838169123077051890332313671220385830444331578674338014080959653201802476516237464651809255679979
'''

大致看一下了解到这是对两个信息分别进行了一次RSA加密,但是两次RSA加密所用的n中是有公因子q的:第二次加密时仅仅更改了p的值,去的值和第一次相同,那么就可以通过gmpy2的函数求解公因子:

import gmpy2

n1 = 14967030059975114950295399874185047053736587880127990542035765201425779342430662517765063258784685868107066789475747180244711352646469776732938544641583842313791872986357504462184924075227433498631423289187988351475666785190854210389587594975456064984611990461126684301086241532915267311675164190213474245311019623654865937851653532870965423474555348239858021551589650169602439423841160698793338115204238140085738680883313433574060243600028500600824624358473403059597593891412179399165813622512901263380299561019624741488779367019389775786547292065352885007224239581776975892385364446446185642939137287519945974807727

n2 = 14624662628725820618622370803948630854094687814338334827462870357582795291844925274690253604919535785934208081825425541536057550227048399837243392490762167733083030368221240764693694321150104306044125934201699430146970466657410999261630825931178731857267599750324918610790098952520113593130245010530961350592735239454337631927669542026935873535964487595433984902529960726655481696404006628917922241666148082741874033756970724357470539589848548704573091633917869387239324447730587545472564561496724882799495186768858324490838169123077051890332313671220385830444331578674338014080959653201802476516237464651809255679979

print(gmpy2.gcd(n1,n2))

得到q=161993393900030566867150602363721535479433489542726899362944130872107225598993516228193877689420023695231584876954537089973673478074348422697619820309397363583748523503035462772765277978491082324620122838540365168604124924805412323471486221429513024367107238770298040268787441768635257727315317704741778501737

接下来就是RSA的常规操作了

RSA常规解密(点击展开)
import gmpy2
from Crypto.Util.number import bytes_to_long, long_to_bytes
def Decrypt(c,e,p,q):
	L=(p-1)*(q-1)
	d=gmpy2.invert(e,L)
	n=p*q
	m=gmpy2.powmod(c,d,n)
	flag=str(m)
	return flag

n = 14967030059975114950295399874185047053736587880127990542035765201425779342430662517765063258784685868107066789475747180244711352646469776732938544641583842313791872986357504462184924075227433498631423289187988351475666785190854210389587594975456064984611990461126684301086241532915267311675164190213474245311019623654865937851653532870965423474555348239858021551589650169602439423841160698793338115204238140085738680883313433574060243600028500600824624358473403059597593891412179399165813622512901263380299561019624741488779367019389775786547292065352885007224239581776975892385364446446185642939137287519945974807727
q = 161993393900030566867150602363721535479433489542726899362944130872107225598993516228193877689420023695231584876954537089973673478074348422697619820309397363583748523503035462772765277978491082324620122838540365168604124924805412323471486221429513024367107238770298040268787441768635257727315317704741778501737
p = n//q
e = 65537
c = 2482083893746618248544426737023750400124543452082436334398504986023501710639402060949106693279462896968839029712099336235976221571564642900240827774719199533124053953157919850838214021934907480633441577316263853011232518392904983028052155862154264401108124968404098823946691811798952747194237290581323868666637357604693015079007555594974245559555518819140844020498487432684946922741232053249894575417796067090655122702306134848220257943297645461477488086804856018323986796999103385565540496534422406390355987976815450744535949785073009043007159496929187184338592859040917546122343981520508220332785862546608841127597 
print (Decrypt(c,e,p,q))
print(long_to_bytes(int(Decrypt(c,e,p,q))))

FLAG:flag{i_am_very_sad_233333333333}


simple

题目描述:
image

下载附件得到.txt文本:k1:123456 k2:321564 密文为:kgws{m8u8cm65-ue9k-44k5-8361-we225m76eeww}

一个密文两个密钥,感觉像仿射密码遍历一下就出来了:

k1 = 123456 
k2 = 321564
cipher = 'kgws{m8u8cm65-ue9k-44k5-8361-we225m76eeww}'
key = 'abcdefghijklmnopqrstuvwxyz'

for i in range(len(cipher)):
    if cipher[i] in key:   #用于判断该字符是否需要遍历
        for j in range(len(key)):
            if (j*k1+k2)%26 == ord(cipher[i])-97:  #获取对应密文的ascii码按照顺序减去97转化为0~25
                print(key[j],end='')
                break
    else:
        print(cipher[i],end='')

FLAG:flag{c8d8ec65-db9f-44f5-8361-ab225c76bbaa}


写在最后

做个小总结吧:

a.学到了异或加密,对异或运算有了更深的理解

b.学会了用python的sympy库解方程

c.见到了更多种类的RSA题目

作者:taotie(转载请注明作者与来源)

欢迎大家批评指正

posted @ 2021-11-23 11:11  ta0tie  阅读(469)  评论(0编辑  收藏  举报