BUUCTF CRYPTO 1-20

BUUCTF CRYPTO 1-20

1.MD5

下载压缩包解压得到e00cf25ad42683b3df678c61f42c6bda

直接在线解密https://cmd5.com/

message-digest algorithm 5 消息摘要算法5

什么是消息摘要算法?

消息摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。消息摘要算法也被称为哈希(Hash)算法或散列算法。

用途

  1. 防止被篡改:作为消息传输后的验证
  2. 防止直接被看到明文:替换明文密码储存在网站中
  3. 防止抵赖(数字签名):对含标识的文件的摘要信息记录进行记录,对其他的文件(消息)产生的摘要信息比对,可以唯一确定是否是相同文件(消息)

功能

输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
不同的输入得到的不同的结果(唯一性);

算法详解

传送门https://zpano.gitee.io/2020/12/19/6/

2.URL编码

%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d

在线解密http://ctf.ssleye.com/

URL

URL是为了 统一的命名网络中的一个资源(URL不是单单为了HTTP协议而定义的,而是网络上的所有的协议都可以使用)

URL编码

  1. URL 只能使用 ASCII 字符集来通过因特网进行发送。
  2. 由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。
  3. URL 编码使用 “%” 其后跟随两位的十六进制数来替换非 ASCII 字符。
  4. URL 不能包含空格。URL 编码通常使用 + 来替换空格(%2b)或者用%20代替

3.一眼就解密

ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30= base64解密

BASE64

Base64编码是基于64个字符A-Z,a-z,0-9,+,/的编码方式

编码过程

  • 第一步,将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
  • 第二步,将上面的24个二进制位每6个一组,共分为4组。
  • 第三步,在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位,即四个字节。

base64

  • 第四步,根据Base64编码对照表(见下图)获得对应的值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
0 A  17 R   34 i   51 z
1 B  18 S   35 j   52 0
2 C  19 T   36 k   53 1
3 D  20 U   37 l   54 2
4 E  21 V   38 m   55 3
5 F  22 W   39 n   56 4
6 G  23 X   40 o   57 5
7 H  24 Y   41 p   58 6
8 I  25 Z   42 q   59 7
9 J  26 a   43 r   60 8
10 K  27 b   44 s   61 9
11 L  28 c   45 t   62 +
12 M  29 d   46 u   63 /
13 N  30 e   47 v
14 O  31 f   48 w   
15 P  32 g   49 x
16 Q  33 h   50 y

解码过程

解码原理是将4个字节转换成3个字节.先读入4个6位(用或运算),每次左移6位,再右移3次,每次8位,这样就还原了

4.看我回旋踢

synt{5pq1004q-86n5-46q8-o720-oro5on0417r1} 凯撒加密 rot-13

顺手写一个循环脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
string = input("Enter a string\n")

for j in range(1,26):
# print('', j, '',end = '')
for x in string:
if x.islower():
if ord(x) + int(j) > 122: # ord()函数给出字母的ASCII码
a = 96 + ord(x) + int(j) - 122
else:
a = ord(x) + int(j)
if x.isupper():
if ord(x) + int(j) > 90: # ord()函数给出字母的ASCII码
a = 64 + ord(x) + int(j) - 90
else:
a = ord(x) + int(j)
if 0 == x.isalpha():
a = ord(x)

print(chr(a),end='')
print(" ")

原理

对明文的每一位字母进行位移得到密文

5.摩丝

.. .-.. —- …- . -.— —- ..-

在线解密得到 iloveyou

mosi

6.签到-y1ng

QkpEe1czbGMwbWVfVDBfQkpEQ1RGfQ==

base64解密

7.PASSWORD

打开题目看到

姓名:张三

生日:19900315

key{xxxxxxxxxx}

双括号内x的数量为10,生日为8,加姓名缩写,尝试姓名头字母加数字得到flag

8.变异凯撒

加密密文:AFZ_R9VYFSCOEO_UL^RWUC

格式:FLAG{ }

观察可知AFZ_R与FLAG{ 存在对应关系

利用PYTHON ORD()函数,得到AFZ_R与FLAG{ 对应的ASCII值

AFZ_R 97 102 90 95 114
FALG{ 102 108 97 103 123
相差 5 6 7 8 9

得出规律,写PYTHON脚本解得FLAG{CAESAR_VARIATION}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#coding=utf-8
c=[]
str="afZ_r9VYfScOeO_UL^RWUc"
#字符串转数组,字符转数字
for a in str:
c.append(ord(a))

#规律,与flag{对应的数字差5,6,7,8,9...
for i in range(0,len(str)):
c[i]=c[i]+5+i

#数组转字符串
new_str = ''.join([chr(i%128) for i in c])
print new_str

9.Quoted-printable

=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6

Quoted-printable在线解密http://ctf.ssleye.com/

什么是Quoted-printable

quoted-printable 编码方法适用于所传送的数据中只有少量的非 ASCII 码,例如汉字。这种编码方法的要点就是对于可打印的 ASCII 码,除特殊字符等号 “=” 外,都不改变。

编码方法

等号 “=” 和不可打印的 ASCII 码以及非 ASCII 码的数据的编码方法是:现将每个字节的二进制代码用两个十六进制数字表示,然后在前面加上一个等号 “=”。

10.RABBIT

U2FSDGVKX1/+YDNDPOWGBJJJXHZXM2MP2AGI

在线解密

11.篱笆墙的影子

FELHAAGV{EWTEHTEHFILNAKGW}

根据提示是栅栏密码

在线解密,写个循坏脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def zhalan(s):
for n in range(2, len(s) - 1):
ans = ''
for i in range(n):
for j in range(int((len(s)+1) / n)):
try:
ans += s[j * n + i]
except:
pass
print(ans)


if __name__ == '__main__':
s = input("please input the strings:\n")
zhalan(s)

什么是栅栏密码

所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的相同位置的连起来,形成一段无规律的话

举个简单的例子

对FALG{ABCDEF}按照三个一组分类

FLA G{A BCD EF}
FGBE L{CE AAD}

进行串联变成上面表格第二行的样子

12.RSA

题目给出:在一次RSA密钥对生成中,假设P=473398607161,Q=4511491,E=17 求解出D作为FLAG提交

附上RSA脚本,后面会出一个RSA总结,这里不再赘述

1
2
3
4
5
6
7
import gmpy2
from Crypto.Util import number
p = 473398607161
q = 4511491
e = 17
d = gmpy2.invert(e,(p-1)*(q-1))
print(d)

13.丢失的MD5

题目给出脚本,尝试运行直接出结果

14.老文盲了

打开题目看到 “罼雧締眔擴灝淛匶襫黼瀬鎶軄鶛驕鳓哵眔鞹鰝”

繁体字朗读一下,提示这就是flag直接交。与佛伦禅需要有佛曰开头

15.ALICE与BOB

N=98554799767分解得到

101999 * 966233

在线分解大整数网站http://www.factordb.com/

之后对101999966233进行MD5加密得到flag

16.RSA

1
2
3
4
5
6
7
8
9
10
11
12
from Crypto.Until.number import *
import gmpy2

p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
n = p*q
phi = (p-1)*(q-1)
d=gmpy2.invert(e,phi)
m = pow(c,d,n)
print(long_to_bytes(m))

17.大帝的武器密码

对FRPHEVGL使用题四的脚本发现偏移等于13时得到单词security

COMECHINA加密,得FLAG{PBZRPUVAN}

18.WINDOWS系统密码

HTTPS://WWW.CMD5.COM/在线解密,试出来一个有解

A7FCB22A88038F35A8F39D503E7F0062解出来是GOOD-LUCK,得FLAG{GOOD-LUCK}

19.CAT_FLAG

20

对于这种只有两种组成的,培根密码,二进制转字符串,摩斯密码

上面显然是二进制转字符串

01000010010010100100010001111011010011010010000101100001001100000111111001111101

转成十六进制424a447b4d2161307e7d

在进行hex编码得到BJD{M!A0~}

20.燕言燕语-Y1NG

79616E7A69205A4A517B78696C7A765F6971737375686F635F73757A6A677D20

hex编码一下yanzi ZJQ{xilzv_iqssuhoc_suzjg}

维吉尼亚解密得到flag

什么是维吉尼亚密码

维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式(用坐标概念理解)

明文 BJDYA 代表列

密钥 YANZI 代表行

密文 ZJQXI 行列坐标的字母

img