BUUCTF 刷题笔记——Crypto 1
摩丝
本题提供一个文本文件,内含如下文本,很明显这是摩斯电码。
代码语言:javascript复制.. .-.. --- ...- . -.-- --- ..-
以下为基本字母数字与其对应的摩斯电码表,对照表逐个解码即可。
字符 | 电码符号 | 字符 | 电码符号 | 字符 | 电码符号 | 字符 | 电码符号 |
---|---|---|---|---|---|---|---|
A | .━ | B | ━ ... | C | ━ .━ . | D | ━ .. |
E | . | F | ..━ . | G | ━ ━ . | H | .... |
I | .. | J | .━ ━ ━ | K | ━ .━ | L | .━ .. |
M | ━ ━ | N | ━ . | O | ━ ━ ━ | P | .━ ━ . |
Q | ━ ━ .━ | R | .━ . | S | ... | T | ━ |
U | ..━ | V | ...━ | W | .━ ━ | X | ━ ..━ |
Y | ━ .━ ━ | Z | ━ ━ .. | ||||
0 | ━ ━ ━ ━ ━ | 1 | .━ ━ ━ ━ | 2 | ..━ ━ ━ | 3 | ...━ ━ |
4 | ....━ | 5 | ..... | 6 | ━ .... | 7 | ━ ━ ... |
8 | ━ ━ ━ .. | 9 | ━ ━ ━ ━ . |
解码结果为 ILOVEYOU
password
本题提供的文本内容如下,需要我们根据已有信息猜密码。
代码语言:javascript复制姓名:张三
生日:19900315
key格式为key{xxxxxxxxxx}
密码共十位,已有信息可作为密码的有 zhangsan 以及生日数字序列 19900315,因此对该信息的全部或者部分提取并排列组合便可得出密码,当然本题较为简单,密码为 zs19900315。
变异凯撒
本题提供的文本内容如下,并提示这是变异凯撒。
代码语言:javascript复制加密密文:afZ_r9VYfScOeO_UL^RWUc
格式:flag{ }
凯撒密码只是进行简单的操作操作,但是上述密文出现了数字以及 _、^ 等特殊字符,因此很可能是依照 ASCII 码表的移位操作。由于格式固定,即前五位为 flag{ 五个字符,可借此找出规律。
明文字符(码值) | 密文字符(码值) | 差值 |
---|---|---|
f(102) | a(97) | 5 |
l(108) | f(102) | 6 |
a(97) | Z(90) | 7 |
g(103) | _(95) | 8 |
{(123) | r(114) | 9 |
由上述表格中的数据可确认加密方式为按 ASCII 码表进行位移且位移大小逐个递增。
那写个脚本反推一下就行了。
代码语言:javascript复制str = "afZ_r9VYfScOeO_UL^RWUc"
n = 5
flag = ""
for i in str:
flag = chr(ord(i) n)
n = 1
print(flag)
得出 flag 为 flag{Caesar_variation}。
Quoted-printable
本题提供的文本内容如下,提示为 Quoted-printable 编码。
代码语言:javascript复制=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6
Quoted-printable 编码每三位表示一字节的数据,等号后即为两位十六进制数,可直接对应于该字节的数据。由于大部分用于非 ASCII 码表中的可打印字符,因此手算不现实,直接工具解码即可。
解码出的结果为 那你也很棒哦。
Rabbit
本题提供的文本内容如下,提示为 Rabbit 加密。
代码语言:javascript复制U2FsdGVkX1/ ydnDPowGbjjJXhZxm2MP2AgI
有意思的加密方法,了解密文特征即前缀 U2FsdGVkX1 即可。剩下的直接丢进 解密网站 就行。
解密的结果为 Cute_Rabbit
篱笆墙的影子
本题提供的文本如下,提示篱笆墙的影子,根据密文样式及 flag 的默认前缀 flag{ 合理推测标题暗示栅栏密码。
代码语言:javascript复制felhaagv{ewtehtehfilnakgw}
所谓栅栏密码,就是把要加密的明文分成 N 个一组,然后循环把每组的首个字符取出来,形成一段无规律的话。观察可知 N 为 2 即可提取出 flag,也就是取一个字符后隔一个字符再取,然后循环直至取完所有字符。因此 falg 为 flag{wethinkwehavetheflag}。
RSA
本题提供的文本如下,要求解密 RSA。
代码语言:javascript复制在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flga提交
有了ppp 和qqq 值就可以求φ(n)=(p−1)(q−1)φ(n)=(p-1)(q-1)φ(n)=(p−1)(q−1),值为213573308221626840021357330822162684002135733082216268400。由于ddd 满足(d∗e)modφ(n)=1(d*e)modφ(n)=1(d∗e)modφ(n)=1,其他条件都已知,所以ppp 值就可以很容易求了吧?写个脚本来算。
代码语言:javascript复制import gmpy2
p = 473398607161
q = 4511491
e = 17
phi_n = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi_n)
print(d)
解出ddd 值为125631357777427553125631357777427553125631357777427553。
丢失的MD5
本题提供一段 Python 代码。
代码语言:javascript复制import hashlib
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
m.update('TASC' chr(i) 'O3RJMV' chr(j) 'WDJKX' chr(k) 'ZM')
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print des
由于是 Python2 代码,换成 Python3 环境运行需要为 print() 函数加上括号。尝试执行程序,发现报错了。
提示在计算哈希值之前需要对数据进行编码,因此将待加密的明文字符串加上编码操作即可,修改代码如下,建议指定编码为 utf-8,以免出现默认编码的问题。
代码语言:javascript复制import hashlib
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
#m.update(('TASC' chr(i) 'O3RJMV' chr(j) 'WDJKX' chr(k) 'ZM').encode())
m.update(('TASC' chr(i) 'O3RJMV' chr(j) 'WDJKX' chr(k) 'ZM').encode("utf8"))
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print(des)
计算结果为 e9032994dabac08080091151380478a2,实测该值即为 flag,所以本题考的是编程。
Alice与Bob
本题考查对985547997679855479976798554799767 的质数分解,分解出后组合进行 md5 加密即可。质数分解使用 yafu 工具完成即可,分解结果为966233∗101999966233*101999966233∗101999。
代码语言:javascript复制命令行>yafu-x64.exe factor(98554799767)
fac: factoring 98554799767
fac: using pretesting plan: normal
fac: no tune info: using qs/gnfs crossover of 95 digits
div: primes less than 10000
fmt: 1000000 iterations
Total factoring time = 0.0089 seconds
***factors found***
P6 = 966233
P6 = 101999
ans = 1
将101999966233101999966233101999966233 进行 md5 加密即可,加密结果为 d450209323a847c8d01c6be47c81811a。
大帝的密码武器
本题提供一个 zip 文件,由于没有后缀名,因此无法打开,按提示修改后缀为 zip 即可。包含两个文本文件,其内容如下。
代码语言:javascript复制题目:
公元前一百年,在罗马出生了一位对世界影响巨大的人物,他生前是罗马三巨头之一。他率先使用了一种简单的加密函,因此这种加密方法以他的名字命名。
以下密文被解开后可以获得一个有意义的单词:FRPHEVGL
你可以用这个相同的加密向量加密附件中的密文,作为答案进行提交。
密文:
ComeChina
即使用凯撒密码加密,但是偏移值需要自行求出,依据为 FRPHEVGL 解密后为有意义的单词。部分不同偏移值对应的明文如下表,但偏移为 13 时解密后为单词 security,因此偏移为 13。
偏移值 | 明文 |
---|---|
2 | DPNFCTEJ |
3 | COMEBSDI |
4 | BNLDARCH |
5 | AMKCZQBG |
6 | ZLJBYPAF |
7 | YKIAXOZE |
8 | XJHZWNYD |
9 | WIGYVMXC |
10 | VHFXULWB |
11 | UGEWTKVA |
12 | TFDVSJUZ |
13 | SECURITY |
使用测算出来的偏移量 13 对题给密文进行解密操作后可得 PbzrPuvan,即本题答案。
rsarsa
本题提供文本如下,给出p、q、e、cp、q、e、cp、q、e、c 的值让我们求明文。
代码语言:javascript复制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
由已给值直接写个脚本进行计算即可。
代码语言:javascript复制import gmpy2
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
phi_n = (p - 1) * (q - 1)
n = p * q
d = gmpy2.invert(e, phi_n)
m = gmpy2.powmod(c, d, n)
print(m)
计算结果为557744663355446657776887998855774466335544665777688799885577446633554466577768879988。
Windows系统密码
题目给了一个 pass.hash 文件,其内容如下,文件名暗示均为哈希值。
代码语言:javascript复制Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::
由于这些值均使用冒号分割为了八段 32 位的序列,大概率为 md5 算法,因此逐个进行解密,第四段成功解出 flag 为 good-luck。
信息化时代的步伐
本题提供文本内容如下,提示为清后数十年一位伟人说的话,且为一串中文。
代码语言:javascript复制606046152623600817831216121621196386
纯数字序列,合理猜测为中文电码,利用在线工具直接加密结果为计算机要从娃娃抓起。邓小平说的。
凯撒?替换?呵呵!
题目提供一串类似 flag 形式的字符串,标题提示应该又是凯撒?
代码语言:javascript复制MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO}
测试了所有偏移值后仍无对应 flag 的值出现,因此应该为进阶款的凯撒,使用 在线工具 进行爆破。参考条件为 mthj 解密后为 flag,结果如下,其中仅第一条为可读明文。
因此解密明文如下:
代码语言:javascript复制flag{substitutioncipherdecryptionisalwayseasyjustlikeapieceofcake}
萌萌哒的八戒
- 本题提供一张图片如下,包含一串奇怪的密文,由猪元素推测为猪圈密码。
- 猪圈密码就很有意思了,原理如下图所示,不同符号对应不同字符,参考字符表进行解密即可。
解密后的明文为 whenthepigwanttoeat。
传统知识 古典密码
本题含有两个文本文件,内容如下。
代码语言:javascript复制小明某一天收到一封密信,信中写了几个不同的年份
辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。
信的背面还写有“ 甲子”,请解出这段密文。
key值:CTF{XXX}
首先解决传统知识的问题,在六十甲子中辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳分别对应序号为 28、30、23、08、17、10、16、30,加一甲子就是加 60,则数字序列又变成了 88、90、83、68、77、70、76、90。对应于 ASCII 码表中也就是字符串 XZSDMFLZ。
至于古典密码主要就是凯撒与栅栏了,由于对此没有任何提示,因此只能挨个试。这也太过分了。最终经过栅栏密码的 4 栏加密以及凯撒密码的 5 偏移得到的稍微顺眼的字符串 shuangyu 即为答案。
总结
尝试接触这么些个密码学的题目,总体来说并没有接触到特别复杂的考题,但是却了解到了相当多的加密算法。又多又杂的算法,虽然大多都有工具来帮助完成,但是光是识别算法类型就够呛了。很开心自己并不需要去研究去开发加密算法,仅仅只需要用好别人的工具就能完成大部分工作。
BUU 上的练习题到这各个方向我就都路过了一遍了,虽然对个人技术并无多少提升,但总归是对整体有了更深入的认识。各方向的试水刷题就到此为止了,不过,这也才刚刚开始,接下来就是日常刷题学习了。