信息安全基础能力训练-crypto

题目一

大帝的密码武器

题⽬描述:

公元前⼀百年,在罗马出⽣了⼀位对世界影响巨大的人物,他生前是罗马三巨头之⼀。他率先使⽤了⼀种简单的加密函,因此这种加密方法以他的名字命名。

加密后:FRPHQZSX

目标:得到明文信息

解题思路

  1. 凯撒密码就是将明文信息进行移位;

  2. 密钥就是1-26作为移位的依据;

  3. 因为题目并没有给出对应密钥,所以需要遍历密钥空间,将所有可能的明文信息列出来,根据分析得到真正的明文即可;

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def caesar(ciphertext):
result = ''
result_list = []
ciphertext = ciphertext.lower()
#遍历密钥空间[1:26]
for number in range(1, 26):
for i in range(len(ciphertext)):
ascii = ord(ciphertext[i]) - number
if 97 <= ascii <= 122:
result += chr(ord(ciphertext[i]) - number)
else:
ascii = ord(ciphertext[i]) + 26 - number
result += chr(ascii)
result_list.append(result)
result = ''
return result_list
print(caesar("FRPHQZSX"))

运行结果

输出26种可能的明文信息列表:

[‘eqogpyrw’, ‘dpnfoxqv’, ‘comenwpu’, ‘bnldmvot’, ‘amkcluns’, ‘zljbktmr’, ‘ykiajslq’, ‘xjhzirkp’, ‘wigyhqjo’, ‘vhfxgpin’, ‘ugewfohm’, ‘tfdvengl’, ‘secudmfk’, ‘rdbtclej’, ‘qcasbkdi’, ‘pbzrajch’, ‘oayqzibg’, ‘nzxpyhaf’, ‘mywoxgze’, ‘lxvnwfyd’, ‘kwumvexc’, ‘jvtludwb’, ‘iusktcva’, ‘htrjsbuz’, ‘gsqiraty’]

根据分析,有效的明文信息为flag{comenwpu};


题目二

栅栏密码

题目描述:
题目字数分组,密文:fsf5lrdwacloggwqi11l

解题思路

栅栏密码原理

加密:

把将要传递的信息中的字母交替排成上下两行

例:栏数为2(栏数相当于密钥)

T E O G S D Y U T A E N N
H L N E T A M S H V A E D
密文:

TEOGSDYUTAENN HLNETAMSHVAED

解密:

T E O G S D Y U T A E N N
H L N E T A M S H V A E D

明文:

THE LONGEST DAY MUST HAVE AN END

  1. 题目没有提供栅栏栏数,因此不知道应该将密文分为几部分,需要尝试多种栏数;

  2. 一般会取密文长度的因数作为栏数,本题密文长度为20;

  3. 先得到密文长度的因数,然后遍历因数列表,将因数作为栏数,把不同结果输出到结果列表中;

  4. 最终通过对结果的分析得到真正的明文信息即可;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def fence(ciphertext):
#结果列表
result_list = []
length = len(ciphertext)
#创建因数列表
factor_list = []
for i in range(1, length):
if length % i == 0 and i < length//2:
factor_list.append(i)
for factor in factor_list:
result = ''
for i in range(length//factor):
for j in range(factor):
result += ciphertext[i]
i += length//factor
result_list.append(result)
return result_list

运行结果

result_list 输出:

[‘fsf5lrdwacloggwqi11l’, ‘flsofg5glwrqdiw1a1cl’, ‘frlqsdoifwg15ag1lcwl’, ‘flagisrcg1fdlw15woql’]

根据分析,’flagisrcg1fdlw15woql’ 为有效信息;


题目三

题目描述:

小猪佩奇!

图例

解题思路

猪圈密码工作原理

将字母表中的每个字母分配给特定形状的方括号或“猪圈”。写秘密信息时,不用写字母,而是画出每个字母所在的方括号。

  1. 查找到猪圈密码表:

    图例

  2. 根据密码表,将密文解码即可;

运行结果

flag{THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG}


题目四

看我回旋踢

一共踢了 13 脚

题目描述:

synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}

解题思路

使用的是ROT-13编码,将明文或密文中的英文字母替换成对应的英文字符即可;

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def rot13(ciphertext):
ciphertext = ciphertext.lower()
ciphertext = ciphertext[5:]
print(ciphertext)
result = ''
rot13_begin = 'abcdefghijklmnopqrstuvwxyz'
rot13_end = 'nopqrstuvwxyzabcdefghijklm'
for i in range(len(ciphertext)):
if ciphertext[i] in rot13_begin:
pos = rot13_begin.find(ciphertext[i])
result += rot13_end[pos]
else:
result += ciphertext[i]
return 'flag{' + result
print(rot13('synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}'))

运行结果

flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}


题目五

Uuencode

题⽬描述:

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

解题思路

UUE 编码原理

用3个字节数据列成一组(不足3个字节以零补齐),此24位数据分为4 组,每组6位,再将得到的6位二进制数映射到ASCII码32~95之间的字符;

  1. 这种编码方式和base64类似,通过二进制重新分组后转换为对应的ASCII码。本题其实就是这种编码的解码过程;

  2. 需要注意的是密文中第一个字符,如果第一个字符不为 ’M‘ ,说明需要解码的数据所对应的明文信息不足45个字节,否则说明需要解码的数据不止一行。因为本题密文信息首位为 ’8‘,所以只需要处理破解一行数据即可;

  3. 将每个字符的 ASCII 值减去32后转换为6为二进制码,添加到 binary 字符串中;

  4. 将 binary 字串以 8 位为一组转换为 ASCII 码即可;

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def uue_code(ciphertext):
result = ''
binary = ''
ciphertext = ciphertext[1:]
for i in range(len(ciphertext)):
ascii = ord(ciphertext[i]) - 32
binary += '{0:06b}'.format(ascii)
if len(binary) % 8 != 0:
for i in range(8-(len(binary) % 8)):
binary += '0'
cnt = 0
i = 0
while cnt < len(binary)//8:
ascii_result = int(binary[i: i+8], base=2)
result += chr(ascii_result)
cnt += 1
i += 8
return result

运行结果

flag{dsdasdsa99877LLLKK}


题目六

滴答滴答

题⽬描述:
福尔摩斯表

图例

解题思路

对照摩斯密码表进行解码即可;

运行结果

flag{ALP5ALAB}


题目七

base 家族

题目描述:
我喜欢贝丝,但是贝丝的表妹喜欢我 还给了我一封情诗
MZWGCZ33MVZGQZLJL5STQOJTGRPWK4SVJ56Q====

解题思路

根据密文中最后的等号个数可以判断属于 base32 编码,编码原理与 base64 类似,使用 base64 模块中的 base32 解码函数进行解码即可;

1
2
3
4
5
6
#调用base64模块的函数实现
def b32_de(ciphertext):
import base64
result = base64.b32decode(ciphertext)
return result
print(b32_de('MZWGCZ33MVZGQZLJL5STQOJTGRPWK4SVJ56Q===='))
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
#不调用base64模块函数实现
def b32_decode(ciphertext):
#创建b32编码表
b32_word_list = {
'A': 0, 'B': 1, 'C': 2,
'D': 3, 'E': 4, 'F': 5,
'G': 6, 'H': 7, 'I': 8,
'J': 9, 'K': 10, 'L': 11,
'M': 12, 'N': 13, 'O': 14,
'P': 15, 'Q': 16, 'R': 17,
'S': 18, 'T': 19, 'U': 20,
'V': 21, 'W': 22, 'X': 23,
'Y': 24, 'Z': 25, '2': 26,
'3': 27, '4': 28, '5': 29,
'6': 30, '7': 31
}
#获取二进制编码
binary = ''
for i in range(len(ciphertext)):
if ciphertext[i] == '=':
continue
else:
binary += '{0:05b}'.format(b32_word_list[ciphertext[i]])
#获取结果
result = ''
i = 0
if len(binary) % 8 != 0:
binary = binary[:len(binary)-len(binary) % 8]
while i < len(binary):
ascii_value = int(binary[i:i+8], base=2)
result += chr(ascii_value)
i += 8
return result

运行结果

flag{erhei_e8934_erUO}


题目八

敲击

题目描述:
方方格格,不断敲击 “wdvtdz qsxdr werdzxc esxcfr uygbn“

解题思路

  1. 根据题目描述,联想到 26 键键盘,通过密文中字母在键盘中的位置可以得出相对应的字母明文;

    脑洞是真的大呀!

运行结果

flag{x v z o c}