还在加载 请稍等一下辣ヾ(≧▽≦*)o . . .

BUUCTF-Crypto第一页(传统知识+古典密码-RSAROLL)解题思路


前言

对应的上一篇文章👉BUUCTF-Crypto第一页(MD5-信息化时代的步伐)解题思路

一.传统知识+古典密码

下载附件打开题目一看就知道,是六十甲子,关于六十甲子如何对应,非常简单,不需要记住,也不需要百度,电脑肯定有Excel表吧,如下图操作👇,往下面拉到六十行就可以了。

最终差不多是这个样子如下图👇。

或者是可以直接参考我这个表格。

顺序 干支
1 甲子
2 乙丑
3 丙寅
4 丁卯
5 戊辰
6 己巳
7 庚午
8 辛未
9 壬申
10 癸酉
11 甲戌
12 乙亥
13 丙子
14 丁丑
15 戊寅
16 己卯
17 庚辰
18 辛巳
19 壬午
20 癸未
21 甲申
22 乙酉
23 丙戌
24 丁亥
25 戊子
26 己丑
27 庚寅
28 辛卯
29 壬辰
30 癸巳
31 甲午
32 乙未
33 丙申
34 丁酉
35 戊戌
36 己亥
37 庚子
38 辛丑
39 壬寅
40 癸卯
41 甲辰
42 乙巳
43 丙午
44 丁未
45 戊申
46 己酉
47 庚戌
48 辛亥
49 壬子
50 癸丑
51 甲寅
52 乙卯
53 丙辰
54 丁巳
55 戊午
56 己未
57 庚申
58 辛酉
59 壬戌
60 癸亥

然后在根据左边的数字对应,题目是辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳,找到对应的数字编号是28,30,23,8,17,10,16,30,写着加甲子这句话,所以需要加60即可,就是88,90,83,68,77,70,76,90,猜测是ASCII编码如下图👇。

找出对应的字母分别是88:X,90:Z,83:S,68:D,77:M,70:F,76:L,90:Z,就是XZSDMFLZ,最开始我就以为是flag了,原来还要进行一次解密,这种样子的密码不是凯撒就是栅栏,凯撒尝试过后,发现没有一个能通顺的,应该就是栅栏了👉在线栅栏解密,也不对啊,最后尝试的是,先把XZSDMFLZ进行每组数字为2的解密为XMZFSLDZ之后,在去凯撒解密,凯撒解密是移动21位,结果位shuangyu,真离谱,这个答案尝试了很多次,一直报错,原来是需要把答案大写,出题人nm$l。

顺便附上凯撒加密解密python代码如下👇。

def caser():
    flag = "XMZFSLDZ".lower()
    dict_txt = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'.lower()
    enc = []
    for k in range(1,26):
        for i in flag:
            enc.append(dict_txt[dict_txt.index(i)+k])   #寻找i里面的dict_txt的索引值加上k
        print("移动了%d位"%k)
        print("".join(enc))
        print()
        enc = []        #每次循环完毕,列表清空
if __name__ == '__main__':
    caser()

下面是栅栏的代码,借鉴(抄)的

def zhalan(e):
    elen = len(e)
    field = []
    for i in range(2, elen):
        if (elen % i == 0):
            field.append(i)

    for f in field:
        b = elen // f
        result = {x: '' for x in range(b)}
        for i in range(elen):
            a = i % b;
            result.update({a: result[a] + e[i]})
        d = ''
        for i in range(b):
            d = d + result[i]
        print(d)
        d.lower()


if __name__ == '__main__':
    e = 'XZSDMFLZ'
    zhalan(e)

最终flag:flag{SHUANGYU}


二.凯撒?替换?呵呵!

没有附件,密文如下。

MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO}

看起来是一道简单的凯撒,没错这是我以为的,我一直在找MTHJ对应flag是怎么对应的,普通的移位,不行,找ASCII编码也不行,自己想了一分钟之后才知道需要爆破(其实是看了大佬的WP),👉在线工具,如下图。

然后去掉空格,即可。

print('flag{substitutioncipherdecryptionisalways easy just like a piece of cake}'.replace(" ",''))

最终flag是,flag:flag{substitutioncipherdecryptionisalwayseasyjustlikeapieceofcake}


三.萌萌哒的八戒

题目提示如下。

萌萌哒的八戒原来曾经是猪村的村长,从远古时期,猪村就有一种神秘的代码。请从附件中找出代码,看看萌萌哒的猪八戒到底想说啥 注意:得到的 flag 请包上 flag{} 提交

看题目猜测是猪圈密码,下载附件查看,如下图,看来还真是猪圈密码了,不知道猪圈密码的可以看这边的文章👉猪圈密码

对照表如下。

根据对照表,找出图片的明文分别是whenthepigwanttoeat

最终flag是:flag{whenthepigwanttoeat}


四.RSA1

下载附件的内容是👇。

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852

说实话,我特么实在是看不懂dp和dq,大概意思如下👇,👉RSAdp和dq,不管了直接代码梭哈完事。

dp=d%(p-1)
dq=d%(q-1)

import gmpy2,libnum
p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852
I = gmpy2.invert(q,p)
mp = pow(c,dp,p)
mq = pow(c,dq,q)               #求幂取模运算

m = (((mp-mq)*I)%p)*q+mq       #求明文公式

print(hex(m))          #转为十六进制

然后结果是十六进制转换字符即可,👉十六进制转字符

最终结果flag{W31c0m3_70_Ch1n470wn}


五.权限获得第一步

题目内容如下。

Administrator:500:806EDC27AA52E314AAD3B435B51404EE:F4AD50F57683D4260DFD48AA351A17A8:::

解密第二个md5即可。

flag:flag{3617656}


六.old-fashion

题目内容如下。

Os drnuzearyuwn, y jtkjzoztzoes douwlr oj y ilzwex eq lsdexosa kn pwodw tsozj eq ufyoszlbz yrl rlufydlx pozw douwlrzlbz, ydderxosa ze y rlatfyr jnjzli; mjy gfbmw vla xy wbfnsy symmyew (mjy vrwm qrvvrf), hlbew rd symmyew, mebhsymw rd symmyew, vbomgeyw rd mjy lxrzy, lfk wr dremj. Mjy eyqybzye kyqbhjyew mjy myom xa hyedrevbfn lf bfzyewy wgxwmbmgmbrf. Wr mjy dsln bw f1_2jyf-k3_jg1-vb-vl_l

看样子是需要做词频分析,在线网站👉词频分析,结果 如下图。

所以最终flag是flag{n1_2hen-d3_hu1-mi-ma_a}


七.世上无难事

提示如下。

以下是某国现任总统外发的一段指令,经过一种奇异的加密方式,毫无规律,看来只能分析了。请将这段语句还原成通顺语句,并从中找到key作为答案提交,答案是32位,包含小写字母。 注意:得到的 flag 请包上 flag{} 提交

题目内容👇

VIZZB IFIUOJBWO NVXAP OBC XZZ UKHVN IFIUOJBWO HB XVIXW XAW VXFI X QIXN VBD KQ IFIUOJBWO WBKAH NBWXO VBD XJBCN NKG QLKEIU DI XUI VIUI DKNV QNCWIANQ XN DXPIMKIZW VKHV QEVBBZ KA XUZKAHNBA FKUHKAKX XAW DI VXFI HBN QNCWIANQ NCAKAH KA MUBG XZZ XEUBQQ XGIUKEX MUBG PKAWIUHXUNIA NVUBCHV 12NV HUXWI XAW DI XUI SCQN QB HZXW NVXN XZZ EBCZW SBKA CQ NBWXO XAW DI DXAN NB NVXAP DXPIMKIZW MBU JIKAH QCEV XA BCNQNXAWKAH VBQN HKFI OBCUQIZFIQ X JKH UBCAW BM XLLZXCQI XAW NVI PIO KQ 640I11012805M211J0XJ24MM02X1IW09

我还以为又是什么我没见过的加密方式,这下我算是搞懂了,只要是奇奇怪怪的,基本上都是词频分析👉词频分析,如下图👇。

我就按照这个答案一直提交,咋就一直错误,转小写233333.

最终flag是flag{640e11012805f211b0ab24ff02a1ed09}


八.RSA3

真的四草了,又是RSA,估计我现在对RSA的题目都有阴影了。

题目内容如下👇

c1= 22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
n= 22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
e1= 11187289
c2= 18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
e2= 9647291

首先我知道的是需要理解欧几里得算法,欧几里得算法大概意思就是求公约数,在两个数之间选一个较大的数字,然后除以较小的数字获得余数,然后在用被除数除以余数,一直到0即可,如下带数操作,假设有两个数字一个是2004,一个是615,求公约数。

2004 / 615 = 3.......159

615 / 159 = 3....... 138

159 / 138 = 1.......21

138 / 21 = 6.......12

21 / 12 = 1.......9

12 / 9 = 1.......3

9 / 3 = 3.......0

求出2004615的最大公约数是3,既然知道了欧几里得,就可以做题了,理解可以看这个文章👉RSA共模攻击,直接上代码,👇。

from gmpy2 import invert
import binascii
def gongmo(n, c1, c2, e1, e2):
    def egcd(a, b):
        if b == 0:
            return a, 0
        else:
            x, y = egcd(b, a % b)
            return y, x - (a // b) * y
    s = egcd(e1, e2)
    s1 = s[0]
    s2 = s[1]

    # 求模反元素
    if s1 < 0:
        s1 = - s1
        c1 = invert(c1, n)
    elif s2 < 0:
        s2 = - s2
        c2 = invert(c2, n)
    m = pow(c1, s1, n) * pow(c2, s2, n) % n
    return m
c1= 22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
n= 22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
e1= 11187289
c2= 18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
e2= 9647291
result = gongmo(n, c1, c2, e1, e2)
print(result)

print(binascii.unhexlify(hex(result)[2:].strip("L")))

最终flag是flag{49d91077a1abcb14f1a9d546c80be9ef}

参考文章

[1]https://blog.csdn.net/weixin_45859850/article/details/109556891

[2]https://fuchenchenle.cn/2020/06/10/rsa/#toc-heading-4


九.RSA2

题目如下👇,这些RSA的题目感觉不是我这个土狗中专生能做的。

e = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657

c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751

十.Unencode

题目内容是👇

89FQA9WMD<V1A<V1S83DY.#<W3$Q,2TM]

题目是Unencode,我以为是Unicode,真的是误导了我,👉在线UUencode

最终flag是flag{dsdasdsa99877LLLKK}


十一.异性相吸

题目提示如下👇

最近出现了一个奇葩观点,说性别都不一样,怎么能谈恋爱?为了证明这个观点错误,请大家证明异性是相吸的。 注意:得到的 flag 请包上 flag{} 提交

题目内容👇

key:asadsasdasdasdasdasdasdasdasdasdqwesqf
密文:ἇ̀Ј唒ဃ塔屋䩘卖剄䐃堂ن䝔嘅均ቄ䩝ᬔ

太奇葩了,直接上大佬文章链接

异性相吸

最终flag:flag{ea1bc0988992276b7f95b54a7435e89e}


十二.[AFCTF2018]Morse

题目一看就是摩斯密码

题目内容如下

-..../.----/-..../-..../-..../...--/--.../....-/-..../-..../--.../-.../...--/.----/--.../...--/..---/--.../--.../....-/...../..-./--.../...--/...--/-----/...../..-./...--/...--/...--/....-/...--/...../--.../----./--.../-..

先摩斯密码转换字符,然后在十六进制转ASCII即可,仔细摩斯👉在线摩斯

最终flag:afctf{1s't_s0_345y}转换flag{1s't_s0_345y}


十三.还原大师

提示如下

我们得到了一串神秘字符串:TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母,为了确定这个神秘字符串,我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全,E903???4DAB????08?????51?80??8A?,请猜出神秘字符串的原本模样,并且提交这个字串的32位MD5码作为答案。 注意:得到的 flag 请包上 flag{} 提交

python代码跑就可以了如下👇。

import hashlib

#print hashlib.md5(s).hexdigest().upper()
k = 'TASC?O3RJMV?WDJKX?ZM'                    #要还原的明文
for i in range(26):
	temp1 = k.replace('?',str(chr(65+i)),1)
	for j in range(26):
		temp2 = temp1.replace('?',chr(65+j),1)
		for n in range(26):
			temp3 = temp2.replace('?',chr(65+n),1)
			s = hashlib.md5(temp3.encode('utf8')).hexdigest().upper()#注意大小写
			if s[:4] == 'E903':    #检查元素
				print (s)       #输出密文

最终flag:flag{E9032994DABAC08080091151380478A2}


十四.RSA

RSA可以看这个文章👉RSA

题目提示就是RSA然后里面的pub.key,就是公钥,使用网站分析👉http://tool.chacuo.net/cryptrsakeyparse,公钥内容,分析如下

公钥指数 摸数信息
key长度: 256
模数: C0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD
指数: 65537 (0x10001)

然后我们把模数转换成十进制python代码如下👇

str = 'C0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD'
print(int(str,16))

所以由此可以得知

e = 65537

n = 86934482296048119190666062003494800588905656017203025617216654058378322103517

可以通过网站来用n来获取q和p,👉分解n

p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463

接下来可以使用python来解密了,代码如下,借鉴别人的(抄)

import gmpy2
import rsa
e = 65537
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463

fan = (q-1)*(p-1)
d = gmpy2.invert(e,fan)
key = rsa.PrivateKey(n, e, int(d), p, q)
f = open("flag.enc", "rb+")
fr = f.read()
print(rsa.decrypt(fr, key))

最终flag:flag{decrypt_256}


十五.RSAROLL


文章作者: 坂琴
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 坂琴 !
评论
  目录