文章目录
- 1.MD5
- 2.Url编码
- 3.一眼就解密(base64)
- 4.看我回旋踢(凯撒密码)
- 5.摩丝(Morse密码)
- 6.password
- 7.变异凯撒
- 8.Quoted-printable
- 9.Rabbit
- 10.篱笆墙的影子(栅栏密码)
- 11.丢失的MD5(还原大师)
- 12.Alice与Bob(大模数分解)
- 13.大帝的密码武器
- 14.Windows系统密码(md5)
- 15.信息化时代的步伐
- 16.传统知识+古典密码
- 17.传感器(曼彻斯特编码)
- 18.凯撒?替换?呵呵
- 19.萌萌哒八戒(猪圈密码)
- 20.old-fashion(字母替换)
- 21.权限获得第一步(md5)
- 22.世上无难事(字母替换)
- 23.异性相吸(进制转换)
- 24.Unencode(UUencode)
- 25.robomunication(Morse音频)
BUU-CRYPTO部分第一页的入门题刷完了,这里对wp进行了整合,关于RSA的所有题目放在了另外的文章中
1.MD5
题目
e00cf25ad42683b3df678c61f42c6bda
解题思路
由标题很容易想到这是32位md5哈希值
直接md5解码得到: “admin1”
flag
flag{admin1}
2.Url编码
题目
%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d
解题思路
由标题很容易想到这是url编码,字符串中的"%"也验证了这一点
直接url解码得到: “and 1=1”
flag
flag{and 1=1}
知识点
url编码 = ascll码(0x->%)
例如:
大写字母A = 0x41(ascll) = %41(url)
3.一眼就解密(base64)
题目
下面的字符串解密后便能获得flag:
ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30=
解题思路
观察所给出的字符串发现是大小写字母和数字混排,特别是末尾有一个"=",不难想到可能是base系列编码
先用最常见base64进行尝试,解码果然得到flag
flag
flag{THE_FLAG_OF_THIS_STRING}
4.看我回旋踢(凯撒密码)
题目
synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}
解题思路
可以看到,字符串基本是还是对应上了flag的格式,不难想到是单字母替换加密
这一题可以直接尝试爆破,令"synt" = "flag"即可,简单的暴力美学
但是当时我的做法是先尝试了凯撒加密,代码如下:
import string
def kaisa(s, k): #定义函数 接受一个字符串s 和 一个偏移量k
lower = string.ascii_lowercase #小写字母
upper = string.ascii_uppercase #大写字母
before = string.ascii_letters #无偏移的字母顺序 小写+大写
after = lower[k:] + lower[:k] + upper[k:] + upper[:k]#偏移后的字母顺序 还是小写+大写
#分别把小写字母和大写字母偏移后再加到一起
table = ''.maketrans(before, after) #创建映射表
return s.translate(table) #对s进行偏移 即加密
if __name__ == "__main__":
s = "synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}"
offset = ord('f') - ord('s')#计算偏移量
#print(offset)
print(kaisa(s, offset))
flag
flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}
5.摩丝(Morse密码)
题目
… .-… — …- . -.-- — …-
解题思路
观察题目,是点和杠的排列,很明显是Morse密码的特征
直接用摩斯密码解密可得
flag
flag{ILOVEYOU}
6.password
题目
姓名:张三
生日:19900315
key格式为key{xxxxxxxxxx}
解题思路
看到key{xxxxxxxxxx}中key的长度为10位,联想到张三可能取密码的习惯,根据题目信息无非就那么几种
- zs19900315
- 19900315zs
- 1990zs0315
稍作尝试可得到正确答案
flag
flag{zs19900315}
7.变异凯撒
题目
加密密文:afZ_r9VYfScOeO_UL^RWUc
解题思路
看不出字符串是怎么处理的,但是标题给了提示,肯定是基于凯撒加密的
凯撒加密老规矩,先将前四个字符猜测为flag,然后仔细分析可以发现偏移量不是固定值
- a -> f 移位5
- f -> l 移位6
- Z -> a 移位7
可以看出是一个递增的偏移量,那么直接上代码:
c = "afZ_r9VYfScOeO_UL^RWUc"
m = ''
for i in range(len(c)):
m += chr(ord(c[i]) + 5 + i)
print(m)
flag
flag{Caesar_variation}
8.Quoted-printable
题目
=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6
解题思路
之前没见过这种类型的编码,学习一波之后发现,有一种编码就叫Quoted-printable
那么直接QP解码得到: “那你也很棒哦”
flag
flag{那你也很棒哦}
知识点
quoted-printable编码
任何一个8位的字节值可编码为3个字符:一个等号”=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值.例如,ASCII码换页符(十进制值为12)可以表示为”=0C”, 等号”=”(十进制值为61)必须表示为”=3D”. 除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式.
此题表明,quoted-printable编码对汉字采用UTF-8
9.Rabbit
题目
U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI
解题思路
尝试过base64,发现不对。根据标题去看,发现这里是Rabbit编码
那么直接Rabbit解码得到: “Cute_Rabbit”
flag
flag{Cute_Rabbit}
知识点
rabbit解密
密文特征与base64类似,末尾会有==
若base64等解不通,可以尝试rabbit解密
10.篱笆墙的影子(栅栏密码)
题目
felhaagv{ewtehtehfilnakgw}
解题思路
不难看出字符串仍具有类似flag的格式,由于’{'前面并非四个字符,首字符’f’也没有被替换,所以应该不是凯撒加密,或单字母替换
再根据标题提示信息,猜测是栅栏密码,前面1,3,5,7位连结有"flag",故有两栏:
f | l | a | g | { | w | e | t | h | i | n | k | w |
---|---|---|---|---|---|---|---|---|---|---|---|---|
e | h | a | v | e | t | h | e | f | l | a | g | } |
flag
flag{wethinkwehavetheflag}
11.丢失的MD5(还原大师)
题目
我们得到了一串神秘字符串:TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母,为了确定这个神秘字符串,我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全,E903???4DAB???08???51?80??8A?,请猜出神秘字符串的原本模样,并且提交这个字串的32位MD5码作为答案。
解题思路
已知部分明文和明文的部分MD5值,求解明文及MD5
直接遍历缺失的字符,验证补全的字符串与泄露的部分MD5能否对上即可
附上代码:
import hashlib
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
s = 'TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM'
# TASC J O3RJMV K WDJKX L ZM
m.update(s.encode())
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print(s)
# print(m)
print(des)
这里遍历字符的时候,只需要在Ascll码的可打印字符(32-127)中遍历,可以缩小寻找范围
flag
flag{e9032994dabac08080091151380478a2}
12.Alice与Bob(大模数分解)
题目
密码学历史中,有两位知名的杰出人物,Alice和Bob。他们的爱情经过置换和轮加密也难以混淆,即使是没有身份认证也可以知根知底。就像在数学王国中的素数一样,孤傲又热情。下面是一个大整数:98554799767,请分解为两个素数,分解后,小的放前面,大的放后面,合成一个新的数字,进行md5的32位小写哈希,提交答案
解题思路
这一题因为之前密码学课程作业中实现过,所以直接把之前的代码拿来用了。因为函数都是自己写的,没有用到gmpy2库,所以代码显得比较长。
先看代码:
from random import random
#扩展欧几里得算法
#返回值列表中,x是a的逆元(mod b),q是gcd(a,b),若x是0,则表示没有逆元,有x*a + y*b = 1
def Ex_Euclid(a