s3cCTF(1)crypto

某个ctf新人菜鸟的wp记录
顺便捞捞大佬
因能力有限只写了部分自己做出来的

crypto

run_RSA

在这里插入图片描述
打开题目文件,明显叫我们求d。而RSA算法中可以知道d和p,q,e的关系,所以可通过代码求出d,代码如下:

import gmpy2
p = 473398607161 
q = 99319 
e = 19

d = gmpy2.invert(e,(p-1)*(q-1))
print(d)
#d = 29694949178473819

得到flag:s3c{29694949178473819}

easy_Replace

在这里插入图片描述
在这里插入图片描述
从题目中可以得到,此题用了埃特巴什码加密,那么就用埃特巴什码在线解密,关于埃特巴什码,可以去这个网址了解一下 埃特巴什码。(曾经在某个misc题中被称做逾越节的阴谋,而且你去搜索这个确实可以得到埃特巴什码。)在线解密工具
在这里插入图片描述
出来之后得到的flag,但是交上去不对,所以再进行修改,最终改成s3c{sing1e_table_replacement_encrypti0n}上交。

Medium_RSA

将题目文件在vscode中打开

from Crypto.Util.number import *
import gmpy2

flag = 's3c{*************}'
m=bytes_to_long(flag.encode())
p_1=getPrime(512)
p_2=getPrime(512)
q=getPrime(512)
first_n=p_1*q
sec_n=p_2*q
e=0x10001
phin_=(p_1-1)*(q-1)
d=gmpy2.invert(e,phin_)
c=pow(m,e,first_n)
print("e=",e)
print("first_n=",first_n)
print("sec_n",sec_n)
print("c=",c)
'''
e= 65537
first_n= 93679425955408851661816594099128568454782979324761480619967106726948035556442558729864295939452504722367577788803774850020389351280889613011196527024354402326456105589470970259130666250355762255354647775576072645738725502937653158881414824596543265005739857652323297560774148745407059647788000762610097215367
sec_n= 76560409927075917950227267221888784438655322634372750268498521558054307698544170674759877896886125159277071329896035545087794528454924799508948561827711327719770736115514241728640330112674543383763843375427656289156472727065772003527453709624122831666415259699972127234225142780223338796111934265267054610391
c= 85924492737259920351668728492185118013276019461153530283436252128628015318678733833330472270330938416862654352121990880496498577473020334071409662593393687704048392903094226820390059140569263010409913911003026548621879930731426326886190557784362422852993817653864745369989626310149768909819239202327847567501
'''

不难发现first_n与sec_n有公因数q,所以利用python中求最大公约数。由于RSA算法性质,我们可以知道p_1与p_2互质,于是所求的最大公约数即为q。

first_n= 93679425955408851661816594099128568454782979324761480619967106726948035556442558729864295939452504722367577788803774850020389351280889613011196527024354402326456105589470970259130666250355762255354647775576072645738725502937653158881414824596543265005739857652323297560774148745407059647788000762610097215367
sec_n= 76560409927075917950227267221888784438655322634372750268498521558054307698544170674759877896886125159277071329896035545087794528454924799508948561827711327719770736115514241728640330112674543383763843375427656289156472727065772003527453709624122831666415259699972127234225142780223338796111934265267054610391
q = GCD(first_n,sec_n)

之后便可以求出p_1和p_2,但是注意需要整除,否则范围不够,顺便还可以求出phin_。

p_1 = first_n//q
p_2 = sec_n//q
phin_=(p_1-1)*(q-1)

然后就可以求出d,进一步求出明文,代码如下:

e= 65537
c= 85924492737259920351668728492185118013276019461153530283436252128628015318678733833330472270330938416862654352121990880496498577473020334071409662593393687704048392903094226820390059140569263010409913911003026548621879930731426326886190557784362422852993817653864745369989626310149768909819239202327847567501
d=gmpy2.invert(gmpy2.mpz(e),gmpy2.mpz(phin_))
m = pow(c,d,first_n)

完整代码如下:

import math
from Crypto.Util.number import GCD
import gmpy2
from Crypto.Util.number import long_to_bytes
first_n= 93679425955408851661816594099128568454782979324761480619967106726948035556442558729864295939452504722367577788803774850020389351280889613011196527024354402326456105589470970259130666250355762255354647775576072645738725502937653158881414824596543265005739857652323297560774148745407059647788000762610097215367
sec_n= 76560409927075917950227267221888784438655322634372750268498521558054307698544170674759877896886125159277071329896035545087794528454924799508948561827711327719770736115514241728640330112674543383763843375427656289156472727065772003527453709624122831666415259699972127234225142780223338796111934265267054610391
q = GCD(first_n,sec_n)
#print(q)
#q = 10929989267636612107036532440291165625462004620014383733631726742200811336423131258578878196870019296427258077546917103274984191333522613254383280826210023
p_1 = first_n//q
p_2 = sec_n//q
phin_=(p_1-1)*(q-1)
e= 65537
c= 85924492737259920351668728492185118013276019461153530283436252128628015318678733833330472270330938416862654352121990880496498577473020334071409662593393687704048392903094226820390059140569263010409913911003026548621879930731426326886190557784362422852993817653864745369989626310149768909819239202327847567501
d=gmpy2.invert(gmpy2.mpz(e),gmpy2.mpz(phin_))
m = pow(c,d,first_n)
print(long_to_bytes(m))

运行得到:s3c{Welc0me_t0_the_p1t}

Easy_Crypto

题目代码如下:

# python3
import base64
from flag import flag

flag = flag.flag

def x(string):
    return str(base64.b64encode(string.encode()).decode('utf-8'))
    pass


def y(string):
    r = ''
    for c in string:
        r += chr(ord(c) + 3)
        pass
    return r
    pass


cipher = x(y(flag))
print(cipher)
# djZmfmhkdlxiRnV8c3czYnlodVxiSXhRwoA=

分析代码可知,出题师傅先对flag的每一位的ascii码进行了加3的操作,之后又对其进行了base64的加密,知道原理之后便可以编写反向解码的脚本,脚本如下:

import base64


cipher = "djZmfmhkdlxiRnV8c3czYnlodVxiSXhRwoA="
a =str(base64.b64decode(cipher))#base64解码
print(a)
r = ''
for c in a:
    r += chr(ord(c) - 3)#将每一位的ascii码减3,来得到初始的明文
    pass
print(r)

可能存在着些许问题,导致出来的结果是_$s3c{easYY_Crypt0_verYY_FuNYu/Yu5-$`
但是修改以后还是能得到s3c{easYY_Crypt0_verYY_FuN}
下面附上另一个脚本,但同样有一点问题:

import base64
temp = base64.b64decode('djZmfmhkdlxiRnV8c3czYnlodVxiSXhRwoA=')
print(temp)
def y(r):
    
    s=""
    for c in r:
        s += chr(ord(c) - 3)
       
    print(s)
    return s
    pass

r='v6f~hdv\\bFu|sw3byhu\\bIxQ\xc2\x80'
y(r)

得到结果s3c{easY_Crypt0_verY_FuN¿}
删除反问号即可。

hard_Replace

这题,非常阴间。想用词频分析但是他不给你,因为里面含着许多符号。
在这里插入图片描述
后面经过大神点悟,将其中符号换成缺失的字母,就是说同样的符号换成同样的字母,而且这些字母必须没有出现过,我替换后在这里插入图片描述
之后放入https://www.quipqiup.com/进行词频分析,结果如下
在这里插入图片描述
第一条便是flag:a PEThs conTInuE TAE sTorykCuT TAE boy Aad bEEn waITIng or AErz waITIng and waITIngkJn a TwIntlIng o an EyE a yEar and a Aal_ laTEr AE yrEyarEd TAE bEsT bIrTAday gI_T _or AEr and was TogETAEr wITA AEr agaIn on AEr bIrTAdaykBE madE an oaTA To AEr s3c{_orEvEr _orEvEr ETErnITy E}
将最后一段取出,便是flag:s3c{_orEvEr _orEvEr ETErnITy E}
ps:题目中给了一点点提示,说flag中是完整的单词,空格就是空格。(虽然个人没感觉用到)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Minscription

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值