CTF Crypto 入门练习

题源:BUUCTF

记一些自己不会做的和没见过的题目

1.rsarsa

题目

Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm.
p=9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q=11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e =  65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034

Use RSA to find the secret message

基础知识

参数pqde,公开n,e,秘密保存d

加密  c = m^e mod n
解密  m = c^d mod n

加密过程:

1.随机选择两个不相同的素数 p , q 。
2.将p , q相乘,记为n = p × q
3.计算n 的欧拉函数φ ( n ),欧拉函数证明,当 p , q为不相同的素数时,φ ( n ) = ( p − 1 ) ( q − 1 )
4.随机选择一个整数 e ,满足两个条件:φ ( n ) 与 e 互质,且1 < e < φ ( n ) 
5.计算 e 对于φ ( n )的模反元素d,也就是说找到一个d满足 e d = 1 m o d φ ( n ) 。这个式子等价于e d − 1 = k φ ( n ) ,实际上就是对于方程e d − k φ ( n ) = 1 求( d , k ) 的整数解。这个方程可以用扩展欧几里得算法求解。
6.最终把( e , n ) 封装成公钥,( d , n ) 封装成私钥。

Python脚本: (也可以用来计算私钥等等)

import gmpy2
p =
q = 
e = 
n=p*q
c= 
d = gmpy2.invert(e, (q-1)*(p-1))
m = gmpy2.powmod(c,d,n)
print(d)
print("flag{%d}" % m)

 下面介绍py库gmp2:

上段代码不能直接运行,需要安装,具体过程:

打开cmd:

pip install gmpy2

遇到的问题:

1.无pip命令

2.trace back 

3.各种error

具体做法c一下,实在怎么改都不行的话,最好办法就是卸载重新下,屡试不爽

gmpy2库的常用函数

gmpy2.mpz(n)#初始化一个大整数
gmpy2.mpfr(x)# 初始化一个高精度浮点数x
d = gmpy2.invert(e,n) # 求逆元,de = 1 mod n
C = gmpy2.powmod(M,e,n)# 幂取模,结果是 C = (M^e) mod n
gmpy2.is_prime(n) #素性检测
gmpy2.gcd(a,b) #return r 其中,r为a和b的最大公约数
gmpy2.gcdext(a,b) #扩展欧几里得算法,return (r,x,y) 其中,r为a和b的最大公约数,满足ax + by = 1
gmpy2.iroot(x,n) #x开n次根
————————————————
版权声明:本文为CSDN博主「拔草能手晓寒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiao_han_a/article/details/118557781

2.信息化时代的步伐

题目

606046152623600817831216121621196386
也许中国可以早早进入信息化时代,但是被清政府拒绝了。附件中是数十年后一位伟人说的话的密文。请翻译出明文(答案为一串中文!)

解题思路

一串全是数字的密码,没想到什么编码能解出一串中文的

涉及知识点

来源
  中文电码,又称中文商用电码、中文电报码或中文电报明码,原本是于电报之中传送中文信息的方法。它是第一个把汉字化作电子讯号的编码表。
  自摩尔斯电码在1835年发明后,一直只能用来传送英语或以拉丁字母拼写的文字。1873年,法国驻华人员威基杰(S·A·Viguer)参照《康熙字典》的部首排列方法,挑选了常用汉字6800多个,编成了第一部汉字电码本,名为《电报新书》。后由我国的郑观应将其改编成为《中国电报新编》。这是中国最早的汉字电码本。中国人最早研制的电报机华侨商人王承荣从法国回国后,与福州的王斌研制出我国第一台电报机,并呈请政府自办电报。清政府拒不采纳。

  应用
  中文电码可用作电脑里的中文输入法,但因中文电码是“无理码”,记忆困难,一般用户几乎无法熟练地掌握使用。
  在香港,每个有中文姓名的市民的身份证上,均会在他的姓名下面,印有中文电码,外国人取得的入港签证亦有印上。在很多政府或商业机构的表格中,都会要求填写者填写他的中文电码,以便输入电脑。
  美国签证申请表(DS-160表)中,要求申请人填写姓名的中文电码,一些生僻字没有对应的中文电码时,可用“0000”代替。

  原理
 中文电码表采用了四位阿拉伯数字作代号,从0001到9999按四位数顺序排列,用四位数字表示最多一万个汉字、字母和符号。汉字先按部首,后按笔划排列。字母和符号放到电码表的最尾。后来由于一万个汉字不足以应付户籍管理的要求,又有第二字面汉字的出现。在香港,两个字面都采用同一编码,由输入员人手选择字面;在台湾,第二字面的汉字会在开首补上“1”字,变成5个数字的编码。

在线加解密网站:中文电码查询

编码特点

密码是纯数字,明文是中文

3.凯撒?替换?呵呵

题目

MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO}

解题思路

这里flag基本格式还在,明显是一个单字母替换的题

分析mthj->flag偏移分别为7、8、7、3,没有规律,所以应该不是凯撒加密

直接上网站进行爆破:https://quipqiup.com/

令mthj = flag,爆破得到

flag substitution cipher decryption is always easy just like a piece of cake

 4.传统知识+古典密码

题目

小明某一天收到一封密信,信中写了几个不同的年份:辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。信的背面还写有“+甲子”,请解出这段密文。

解题思路

在古代采用干支纪年法,即使用10天干12地支的组合记录年号,60年完成一个循环周期(60是10和12的最小公倍数),称一个"甲子",

辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳分别对应:28,30,23,08,17,10,16,30

再加上一甲子(60),得到:88,90,83,68,77,70,76,90

对应Ascll文本为:XZSDMFLZ  作为flag提交,答案不对

根据标题提示:传统知识+古典密码,可能还需要用古典密码破译

尝试过几种不同的古典密码,都没有看到正确结果,那么可能是两种以上古典密码的结合

最终通过栅栏密码+凯撒密码解出正确答案

XZSDMFLZ只有8位字符,栏数只能是2或者4

2栏解密:XMZFSLDZ

4栏解密:XSMLZDFZ

再进行凯撒枚举

最终在XMZFSLDZ的基础上,凯撒枚举出一个有意义的字符串SHUANGYU
————————————————
版权声明:本文为CSDN博主「拔草能手晓寒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiao_han_a/article/details/118558032

5.RSA1

import gmpy2
q=12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 
p=8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 
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}

6. 权限获得第一步

题目

你猜这是什么东西,记得破解后把其中的密码给我。答案为非常规形式。 注意:得到的 flag 请包上 flag{} 提交

解题思路

记事本里得到一组字符

Administrator:500:806EDC27AA52E314AAD3B435B51404EE:F4AD50F57683D4260DFD48AA351A17A8:::

用:隔开的最后一组字符恰好32位且最高位为F,想到MD5解密

 解密得到的数字即为flag

7.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{n1_2hen-d3_hu1-mi-ma_a}

8.世上无难事

题目

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

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

解题思路

同上题,直接暴力美学

9.RSA3

题目

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

解题思路

已知n,e1,c1,e2,c2,求解明文

这道题思路比较清晰,很明显要采用共模攻击

共模攻击是指生成秘钥的过程中使用了相同的模数n,此时用不同的秘钥e1,e2加密同一信息m,得到不同的密文c1,c2,即

m^e1 % n = c1

m^e2 % n = c2

因为e1和e2都是素数,所以由扩展欧几里得算法

可以计算出s1和s2,使得e1 * s1 + e2 * s2 = 1

根据这些信息,可以直接计算m

公式推导如下:

m = m % n

m = m1 % n

m = m^(e1*s1+e2*s2) % n

m = (m^(e1*s1) % n * m^(e2*s1) % n) % n

m = (c1^s1 % n * c2^s2 % n) % n
————————————————
版权声明:本文为CSDN博主「拔草能手晓寒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiao_han_a/article/details/118557541

import gmpy2
import  binascii
    
c1=22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
n=22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
e1=11187289
c2=18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
e2=9647291
​
#扩展欧几里得算法
#return (r,x,y) 其中,r为a和b的最大公约数,xy满足ax + by = 1
r, s1, s2 = gmpy2.gcdext(e1, e2)    #计算s1,s2
m = (gmpy2.powmod(c1,s1,n)*gmpy2.powmod(c2,s2,n)) % n   #计算明文m
​
m = hex(m)[2:]
print("明文数据为:0x" + m)
flag = binascii.unhexlify(m)
print(flag)

flag{49d91077a1abcb14f1a9d546c80be9ef}

10.UUencode

题目

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

解题思路

头一次见这种UUencode编码

举例:“hello”->"%:&5L;&\ "(末尾有空格)
补零+32->末尾常有32空格,但是多几个或少几个空格不影响解码

UUencode是一种二进制到文字的编码。最早在unix 邮件系统中使用,全称:Unix-to-Unix encoding。不属于MIME编码中一员。它也是定义了用可打印字符表示二进制文字一种方法,并不是一种新的编码集合。主要解决,二进制字符在传输、存储中问题。它早期在电子邮件中使用较多,最近这些年来基本上被MIME 中Base64所取代了。E-mail中一般采用UU、MIME、BINHEX三种编码标准!

UUEncode将输入文本以每三个字节为单位进行编码,如果最后剩下的资料少于三个字节,不够的部份用零补齐。三个字节共有24个Bit,以6-bit为单位分为4个组,每个组以十进制来表示所出现的字节的数值。这个数值只会落在0到63之间。然后将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白…95-底线)的范围之中。跟Base64具有非常多的类似,也做了一些特殊转码说明!因为对所有文本都会编码一次可读性不是很好!
————————————————
版权声明:本文为CSDN博主「拔草能手晓寒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiao_han_a/article/details/118558032

11.[AFCTF2018]Morse

题目

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

解题思路

一看就是摩斯密码,解密后得到一串数字字符,提交flag错误。

发现字符最多到F,考虑是十六进制,base编码(Base16),通过解码工具解码后得到afctf{1s’t_s0_345y}

12.异性相吸

题目

最近出现了一个奇葩观点,说性别都不一样,怎么能谈恋爱?为了证明这个观点错误,请大家证明异性是相吸的。

解题思路

密文是一段乱码,考虑ACSII 码,转十六进制,

但对key没什么思路,查下答案

打开010editor,发现key是ACSII码,想到把他们转成二进制,进行按位异或,结果再转字符

 flag{ea1bc0988992276b7f95b54a7435e89e}

13.还原大师

题目

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

解题思路

就是md5爆破,直接上代码

# -*- coding: utf-8 -*-
#!/usr/bin/env 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)       #输出密文

14.RSA

题目

给了两个文件pub.key和 flag.enc

 

 解题思路

就是说完全不会,查了资料

这里给出的pub.key明显是一个公钥文件

放到网站上提取公钥http://tool.chacuo.net/cryptrsakeyparse,提取得到

e = 65537
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517

这是一个256bit的n,用爆破代码效率很低

因此需要用到一个分解模数的网站http://www.factordb.com,分解得到

p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463

至此,参数齐活了,然后计算私钥d进行解密即可

import gmpy2
import binascii

e = 65537
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463
d = gmpy2.invert(e,(p-1)*(q-1)) #求私钥d,d为e的逆元

with open("flag.enc", "rb+") as f:
    c = f.read()    #读取密文
c = int.from_bytes(c, byteorder='big', signed=False)    #byte类型数据转十进制

m = gmpy2.powmod(c,d,n) # 幂取模,求明文
m = hex(m)[2:]     
print("明文数据为:0x" + m)
flag = binascii.unhexlify('0' + m)

print(flag)

运行之后,得到b’\x02\x9d {zR\x1e\x08\xe4\xe6\x18\x06\x00flag{decrypt_256}\n’

这里有一个小坑,直接令flag = binascii.unhexlify(m)会报错,因为m是一个奇数长度的字符串,所以让它前面加了一个’0’,当然加一个’1’也是一样的。另外,不清楚为什么前面会多出一些乱码,知道的同学可以评论区解释一下。
————————————————
版权声明:本文为CSDN博主「拔草能手晓寒」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiao_han_a/article/details/118557781

这题已经不在我目前知识范围内了,有空回来找补

15.Cipher

题目

还能提示什么呢?公平的玩吧(密钥自己找) Dncnoqqfliqrpgeklwmppu 

解题思路

playfair编码,很有意思

原理见这个博主

http://t.csdn.cn/EA34S

在线解码网站:Playfair  暂时维护中...

flag{itisnotaproblemhavefun}

16.robomunication

解题思路

一段mp3音频,打开听是bibobibo,就这两个音,所以猜测是摩斯密码,记录下来

.... . .-.. .-.. --- .-- .... .- - .. ... - .... . -.- . -.-- .. - .. ... -... --- --- .--. -... . . .--.

解码得到HELLOWHATISTHEKEYITISBOOPBEEP

17.[GXYCTF2019]CheckIn

解题思路

 根据末尾==确定是base64,解码得到 v)*L*_F0<}@H0>F49023@FE0#@EN

但不知道接下来怎么做了,甚至怀疑自己第一步base64就错了

查了wp,原来是ROT编码(替换加密算法)

ROT5只能对数字编码 ,ROT13对字母,ROT18对数字和字母,ROT47对数字字母和标点

GXY{Y0u_kNow_much_about_Rot}

18.密码学的心声

题目

二战时期,某国军官与一个音乐家情妇相好,然而自从那时起,他屡战屡败,敌人似乎料事如神。他也有怀疑过他的情妇,但是他经过24小时观察他的情妇,发现她每天都只是作曲,然后弹奏给战地电台,为士兵们鼓气,并未有任何逾越。那么,间谍到底是谁?这张曲谱是否有猫腻? (答案为一个明文字符串,提交获得的有意义语句通顺字符串即可)

解题思路

自己做没做出来,wp查到的:

 歌词提示:八进制   ASCII码,一共63位可以分成三位一组,作为八进制数值,转成十进制,再转成ASCII码

ILoveSecurityVeryMuch

19.[BJDCTF2020]这是base??

题目

给了一个字典和一串字符

解题思路

由于字典有64个键,联想到BASE64编码,那么下面的字符应该是密文,根据每个字符,也就是字典里的值,找到对应的键,再把键对应到base64编码表里,得到base64编码后的结果,用py中的base64函数进行解密

import base64

dict={0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='}

a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='    #标准表

c='FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw'

ds=''  #把dict转换成字符串方便处理
for i in range(65):
    ds+=dict[i]

l=[]
for i in range(len(c)):
    l.append(ds.index(c[i]))  #无论换不换表,base64变换本身产生的6位二进制数对应的十进制数是不变的,这里就是找到密文c的每个字符在dict表中键值

#print(l)  #l中存的是索引值(下标数字)

m1=''
for ll in l:
    m1+=a[ll]  #找到l中所存的每个数字在标准的base64加密表中所对应的字符
print(m1)  #m1是标准base64表编码结果

m2=base64.b64decode(m1)  #直接调用函数恢复出明文
print(m2)

20.达芬奇密码

题目

达芬奇一直是一个有争议的画家,科学家。。。小明为了研究他,从网上找到了名画蒙娜丽莎,一天深夜,小明突然从蒙娜丽莎背后的天空中看到了一串神秘的数字。顺带告诉小明达芬奇家窗台上有一串数字是关键。小明千里迢迢找到了这串数字,请将这个送分题做出来,亲,包邮哦(答案是一串32位十进制数字) 

达芬奇隐藏在蒙娜丽莎中的数字列:1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2178309 121393 317811 46368 4181 1 832040 2 28657 75025 34 13 17711 
记录在达芬奇窗台口的神秘数字串:36968853882116725547342176952286

解题思路 

看了wp还研究半天才明白....

直接附个链接http://t.csdn.cn/yyvGp

21.[WUSTCTF2020]佛说:只能四天

题目

给了hint,题目和题目描述

圣经分为《旧约全书》和《新约全书》

1. 虽然有点不环保,但hint好像是一次性的,得到后就没有利用价值了。
2. 凯撒不是最后一步,by the way,凯撒为什么叫做凯撒?

尊即寂修我劫修如婆愍闍嚤婆莊愍耨羅嚴是喼婆斯吶眾喼修迦慧迦嚩喼斯願嚤摩隸所迦摩吽即塞願修咒莊波斯訶喃壽祗僧若即亦嘇蜜迦須色喼羅囉咒諦若陀喃慧愍夷羅波若劫蜜斯哆咒塞隸蜜波哆咤慧聞亦吽念彌諸嘚嚴諦咒陀叻咤叻諦缽隸祗婆諦嚩阿兜宣囉吽色缽吶諸劫婆咤咤喼愍尊寂色缽嘚闍兜阿婆若叻般壽聞彌即念若降宣空陀壽愍嚤亦喼寂僧迦色莊壽吽哆尊僧喼喃壽嘚兜我空所吶般所即諸吽薩咤諸莊囉隸般咤色空咤亦喃亦色兜哆嘇亦隸空闍修眾哆咒婆菩迦壽薩塞宣嚩缽寂夷摩所修囉菩阿伏嘚宣嚩薩塞菩波吶波菩哆若慧愍蜜訶壽色咒兜摩缽摩諦劫諸陀即壽所波咤聞如訶摩壽宣咤彌即嚩蜜叻劫嘇缽所摩闍壽波壽劫修訶如嚩嘇囉薩色嚤薩壽修闍夷闍是壽僧劫祗蜜嚴嚩我若空伏諦念降若心吽咤隸嘚耨缽伏吽色寂喃喼吽壽夷若心眾祗喃慧嚴即聞空僧須夷嚴叻心願哆波隸塞吶心須嘇摩咤壽嘚吶夷亦心亦喃若咒壽亦壽囑囑

解题思路

看到佛语,应该是佛曰加密(头一次听说)

在线解密网站http://hi.pcmoe.net/buddha.html 

解出来是核心价值观编码

再解码

 提示了doyouknowfence,用fence密码

分为4栏时,解密结果为:R5UALCUVJDCGD63RQISZTBOSO54JVBORP5SAT2OEQCWY6CGEO53Z67L_doyouknowCaesar_

 又提示了Caesar密码,再解密

但是位移几位不知道,wp都说是3位但我也不知道为啥,按题目提示的话不是4吗?(佛说:只能四天),有待考察

根据全是大写字母并且数字只有2~7,判断是base32

 试了好几个解密软件和网站都解不出来,这个可以https://www.qqxiuzi.cn/bianma/base.php

wctf2020{ni_hao_xiang_xiang_da_wo}

22.rot

题目

破解下面的密文:

83 89 78 84 45 86 96 45 115 121 110 116 136 132 132 132 108 128 117 118 134 110 123 111 110 127 108 112 124 122 108 118 128 108 131 114 127 134 108 116 124 124 113 108 76 76 76 76 138 23 90 81 66 71 64 69 114 65 112 64 66 63 69 61 70 114 62 66 61 62 69 67 70 63 61 110 110 112 64 68 62 70 61 112 111 112

解题思路

啥提示也没有,根据题目ROT想到位移编码,但ROT5解不出来,but据我所知,ROT5仅编码数字,ROT13仅编码字母....但看了wp说是要用ROT13解,这里只能理解为,编码时单纯后移13位,不考虑其他。所以用简单的网站解密不行,要写脚本实现功能。

a="83 89 78 84 45 86 96 45 115 121 110 116 136 132 132 132 108 128 117 118 134 110 123 111 110 127 108 112 124 122 108 118 128 108 131 114 127 134 108 116 124 124 113 108 76 76 76 76 138 23 90 81 66 71 64 69 114 65 112 64 66 63 69 61 70 114 62 66 61 62 69 67 70 63 61 110 110 112 64 68 62 70 61 112 111 112"
b=a.split(" ")
flag=""
for j in range(0,26):
    flag=""
    for i in range(len(b)):
        flag+=chr(int(b[i])-j)
    print(flag)

运行结果

FLAG IS flag{www_shiyanbar_com_is_very_good_???}
MD5:38e4c352809e150186920aac37190cbc

flag缺了一块,给了一个md5,在破解网站查不出来,原因应该是和md5加密过程有关,有待研究,参考MD5爆破脚本

import hashlib

def md5(key):
    input_name = hashlib.md5()
    input_name.update(key.encode("utf-8"))
    return(input_name.hexdigest())
    
def solve(MD5):
    for a in range(32,127):
        print(chr(a))
        for b in range(32,127):
            for c in range(32,127):
                for d in range(32,127):
                    flag = "flag{www_shiyanbar_com_is_very_good_" + chr(a)+chr(b)+chr(c)+chr(d) + "}"
                    if md5(flag) == MD5:
                        return flag
                        
flag = "flag{www_shiyanbar_com_is_very_good_????}"
MD5 = "38e4c352809e150186920aac37190cbc"
print(solve(MD5))

flag{www_shiyanbar_com_is_very_good_@8Mu}

23.这是什么

题目

小明是一个软件专业的高材生,但是老师布置的这次的作业似乎不怎么靠谱,因为他们老师以前是学物理的!喜欢乱七八糟命名文件,还喜欢奇奇怪怪的编码。你快帮小明看一下这题,小明准备好了一箱子辣条。

解题思路

把apk文件名改成txt,或者把文件用010打开,发现里面有一段JSFuck编码,直接解码得到flag。

一开始用的解密网站解不出来,用这个可以JSFuck - 在线加解密

输入密文,点击RUN THIS ,弹窗显示结果

据大佬说,其实很多浏览器本身就支持JSFuck编码,打开浏览器按下F12,在控制台(console)中把JSFuck代码粘贴进去回车,浏览器就会自动解析执行,弹窗得到flag

flag{a0448fd730b62c13ca80200c4529daa2}

24.[MRCTF2020]古典密码知多少

题目

解题思路

好在这几种密码我都见过

猪圈密码

圣堂武士密码

标准银河字母

 

 对应下来得到FGCPFLIRTUASYON(图片上提示all are uppercase letters!全大写)

图片上还提示buy some fence,所以再用栅栏密码解码,分为3栏时,解密结果为:FLAGISCRYPTOFUN,

flag{CRYPTOFUN}

25.[NCTF2019]Keyboard

题目

ooo yyy ii w uuu ee uuuu yyy uuuu y w uuu i i rr w i i rr rrr uuuu rrr uuuu t ii uuuu i w u rrr ee www ee yyy eee www w tt ee

解题思路

不知道是个什么鸟语,但看见题目提示的keyborad,应该和键盘有关系,但自己没想出来

看了wp:发现这些字母是26键盘的第一行,上面一行有对应的数字。位数在1到4位,说明是九键键盘,这种题写法就是比如o,对应数字9,就在九键键盘上9的位置,看o有多少位,3位的话,就是9那个位置字符串的第三个字符。

其实手写也不算慢,脚本如下

cipher="ooo yyy ii w uuu ee uuuu yyy uuuu y w uuu i i rr w i i rr rrr uuuu rrr uuuu t ii uuuu i w u rrr ee www ee yyy eee www w tt ee"
base=" qwertyuiop"
a=[" "," ","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
for part in cipher.split(" "):
    s=base.index(part[0])#part的首个字符在base中的下标,用来寻找对应数字和数字对应的九键
    count=len(part)
    print(a[s][count-1],end="")

于是得到youaresosmartthatthisisjustapieceofcake就是flag啦

26.传感器

题目 

5555555595555A65556AA696AA6666666955
这是某压力传感器无线数据包解调后但未解码的报文(hex)
已知其ID为0xFED31F,请继续将报文完整解码,提交hex。

提示1:曼联

解题思路

看了wp,是曼彻斯特编码,直接抄个脚本

cipher='5555555595555A65556AA696AA6666666955'
def iee(cipher):
    tmp=''
    for i in range(len(cipher)):
        a=bin(eval('0x'+cipher[i]))[2:].zfill(4)
        tmp=tmp+a[1]+a[3]
        print(tmp)
    plain=[hex(int(tmp[i:i+8][::-1],2))[2:] for i in range(0,len(tmp),8)]
    print(''.join(plain).upper())

iee(cipher)

得到flag{FFFFFED31F645055F9}

27.[MRCTF2020]天干地支+甲子

题目

得到得字符串用MRCTF{}包裹
一天Eki收到了一封来自Sndav的信,但是他有点迷希望您来解决一下
甲戌
甲寅
甲寅
癸卯
己酉
甲寅
辛丑

解题思路

对照天干地支表

得到一串数字11 51 51 40 46 51 38

我直接去转了ACSII码,但出现的是乱码

查了wp,说是要把数字+60,发现题目给了提示+甲子,就是+60

得到Goodjob

28.[BJDCTF2020]signin

万万没想到真的就是个签到题

因为字母只到f,且数字是2~7,很显然就以为是MD5,但解密解不出来

看了wp,发现就是十六进制转字符

BJD{We1c0me_t4_BJDCTF}

29.[MRCTF2020]vigenere

题目提示了维吉尼亚编码,但用工具破解不出来,需要密钥

看了wp提供了在线爆破软件,不太清楚为啥不用密钥

Vigenere Solver - www.guballa.de

mrctf vigenere crypto crack man

 但是为啥flag要把空格改成_

30.[MRCTF2020]keyboard

同25题,比25题简单很多,给的直接是数字转字母,就是最早诺基亚手机的拼音方式

而且那个文本最后一行缺了一个3,flag{mobilephone}

31.一张谍报

题目

国家能源总部经过派出卧底长期刺探,终于找到一个潜伏已久的国外内鬼:三楼能源楼管老王。由于抓捕仓促,老王服毒自尽了。侦查部门搜出老王每日看的报纸原来是特制的情报。聪明的你能从附件的报纸中找出情报么?flag是老王说的暗号。(由于老王的线人曾今做的土匪,所以用的行话)

解题思路

有两段相同的内容,但其中有一些字被另一些字替换了,还有一段密文,就确定是要把密文里的字对照明文还原回去。

喵汪哞叽双哇顶,眠鸟足屁流脑,八哇报信断流脑全叽,眠鸟进北脑上草,八枝遇孙叽,孙叽对熬编叶:值天衣服放鸟捉猴顶。鸟对:北汪罗汉伏熬乱天门。合编放行,卡编扯呼。人离烧草,报信归洞,孙叽找爷爷。

今朝梆子二更头,老鹰蹲猎东口,三更鼹鼠断东口亮子,老鹰进北口上树,三枝遇孙子,孙子对虎符曰:南天菩萨放鹰捉猴头。鹰对:北朝罗汉伏虎乱天门。合符放行,卡符扯呼。人离烧草,鼹鼠归洞,孙子找爷爷。

太费眼睛了.....好像也没有什么好办法,就一个一个替换了

32.SameMod

题目

When people use same mod ,what's wrong? 

{6266565720726907265997241358331585417095726146341989755538017122981360742813498401533594757088796536341941659691259323065631249,773}
{6266565720726907265997241358331585417095726146341989755538017122981360742813498401533594757088796536341941659691259323065631249,839}

message1=3453520592723443935451151545245025864232388871721682326408915024349804062041976702364728660682912396903968193981131553111537349
message2=5672818026816293344070119332536629619457163570036305296869053532293105379690793386019065754465292867769521736414170803238309535
 

解题思路

根据题目提示,是RSA共模运算,等学完在补坑

33.[NPUCTF2020]这是什么觅🐎

解题思路

一个未知类型的文件,010打开,看见里面有flag.jpg,打算拿到linux下分离,但放到虚拟机以后直接就能打开了,里面是一张图片

 最下面有提示,字母是星期缩写,T和S有两个,T1是TUE,T2是THU,S1是SAT,S2是SUN。

得到对应数字,3 1 12 5 14 4 1 18,对应26个字母是calendar

34.浪里淘沙

题目

我有密集恐惧症,所以大家自求多福吧,把获得的单词连在一起提交即可。(我这里有一串数字:4,8,11,15,16)

解题思路

给了巨多英语单词,但能看出有许多重复的,开始猜测是单词频率为4,8,11,15,16的,但查了几个发现频率都在一百多,所以猜测应该是单词频率从高到低排列后的第4,8,11,15,16位。Word替换时会提示替换了几处,可以利用一下,这几个单词连起来就是flag.

flag{weshouldlearnthecrypto}(flag是抄的wp哈哈哈哈哈自己懒得弄)

35.[AFCTF2018]Vigenère

题目

给了一个txt,和一个c source file,打开这个代码,看起来应该是维吉尼亚的编码代码,但没有给key,可能是要自己找,但我没找到,查了wp,直接网站爆破的

flag is afctf{Whooooooo_U_Gotcha!} 

但总感觉脚本不是白给的,但没查到关于改写脚本的wp,暂时认为key不可知。

36.yxx

题目

明文:lovelovelovelovelovelovelovelove

密文:V

0
0
0

解题思路

用010打开没发现啥思路,看了wp,说是和异性相吸那题一样,是二进制异或转字符

据说是题目少打了个x,yxxx的话就和异性相吸一样了

做异或可以用在线网站,自己写个脚本也简单

a = '0000101000000011000101110000001001010110000000010001010100010001000010100001010000001110000010100001111000110000000011100000101000011110001100000000111000001010000111100011000000010100000011000001100100001101000111110001000000001110000001100000001100011000'
b = '0110110001101111011101100110010101101100011011110111011001100101011011000110111101110110011001010110110001101111011101100110010101101100011011110111011001100101011011000110111101110110011001010110110001101111011101100110010101101100011011110111011001100101'
for i in range(len(a)):
    if(a[i] == b[i]):
        print '0'
    else:
        print '1'

flag:nctf{xor_xor_xor_biubiubiu}

37.[网鼎杯 2020 青龙组]boom

题目

一个exe文件,打开是一个@组成的爱心,四个Na

解题思路

先是给了一串md5,直接在线爆破得到解密

第二关,做数学题...三元一次方程组,自己解是不可能的,本来是想好找wp抄个脚本,没想到大佬的wp用的是在线计算网站

三元一次方程组计算器

也有用脚本的,sympy函数

from sympy import *
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')
print(solve([3*x-y+z-185,2*x+3*y-z-321,x+y+z-173],[x, y,z]))

 第三关,还是数学题。一元二次方程,这次学聪明了,直接在线网站

 但是!!!显然程序也学聪明了,输入答案之后窗口直接消失???好像体会到题目boom的真实含义了...

 没办法,用010打开,根据这个flag的格式,带入前三关的结果,得到flag

flag{en5oy_746831_89127561}

看了几个wp,说还可以用shell,dos,cmd....我是一个也没搞出来...感觉这种方法应该就比较简单了

38.[ACTF新生赛2020]crypto-classic0

题目

 注意!最下面那三个才是题目,不知道别人用360解压会不会这样,老蹦出来点别的东西

解题思路

hint提示密码是生日,所以8位密码爆破,ARCHPR只能免费爆破四位...用了Ziperello

 打开压缩包,得到代码

#include<stdio.h>

char flag[25] =***; 

int main()
{
	int i;
	for(i=0;i<25;i++)
	{
		flag[i] -= 3;
		flag[i] ^= 0x7;      // 这个是按位异或!!
		printf("%c",flag[i]);// 输出密文 
	}
	return 0; 
}

 用c运行出来的结果不太对

 

要转译成python

cipher='Ygvdmq[lYate[elghqvakl}'

for i in range(0,24):
    flag=ord(cipher[i]) ^ 0x7
    flag += 3
    print ( chr(flag),end='' )

得到actf{my_naive_encrytion}

39.[WUSTCTF2020]B@se

题目

密文:MyLkTaP3FaA7KOWjTmKkVjWjVzKjdeNvTnAjoH9iZOIvTeHbvD==
JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs****kxyz012789+/

oh holy shit, something is missing...

解题思路

只以为是base64编码,直接上网站解了,但解不出来,又不知道第二行那串字符啥意思

查了wp,是变种的base64,因为第二行一共64个字符!

找个base64解码脚本修改,参考wp

#!/usr/bin/env python
# -*- coding:utf-8 -*-
''''
密文:MyLkTaP3FaA7KOWjTmKkVjWjVzKjdeNvTnAjoH9iZOIvTeHbvD==
JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs****kxyz012789+/
oh holy shit, something is missing...
'''
 
import  itertools
def My_base64_decode(inputs,s):    #函数完成base64解密功能(根据所给的自定义Base64编码表)
    
    bin_str = []
    for i in inputs:
        if i != '=':
            x = str ( bin ( s.index ( i ) ) ).replace ( '0b', '' )
            bin_str.append ( '{:0>6}'.format ( x ) )
 
    outputs = ""
    nums = inputs.count ( '=' )
    while bin_str:
        temp_list = bin_str[:4]
        temp_str = "".join ( temp_list )
        # print(temp_str)
 
        if (len ( temp_str ) % 8 != 0):
            temp_str = temp_str[0:-1 * nums * 2]
 
        for i in range ( 0, int ( len ( temp_str ) / 8 ) ):
            outputs += chr ( int ( temp_str[i * 8:(i + 1) * 8], 2 ) )
        bin_str = bin_str[4:]
 
    return outputs
 
cipher='MyLkTaP3FaA7KOWjTmKkVjWjVzKjdeNvTnAjoH9iZOIvTeHbvD=='
s1 ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
s='JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs****kxyz012789+/'
 
#查找缺少字符
missstr=''
for i  in s1:
    if i not in s:
        missstr+=i
#print(missstr)
# ju34
 
#列出缺少字符可能的排列组合
missstrs=[]
for i in itertools.permutations(missstr, 4):    #itertools.permutations函数列出缺少字符可能的排列组合A44=24种
    missstrs.append(''.join(i))
print(missstrs)
#列出可能的flag
for i in  missstrs:
    s='JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs'+i+'kxyz012789+/'
    flag=My_base64_decode(cipher,s)   #用自定义Base64编码表解密
    print(flag)

运行脚本,手动选择正确的那个flag 

 wctf2020{base64_1s_v3ry_e@sy_and_fuN}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值