CTF(鶸)密码学
一、摩斯密码
1、特点
题面只有三个值。
2、解题思路
转换成 ascii,出现 flag 标识符即结束,否则根据转后的数据进行下一步处理。
二、栅栏密码
1、特点
密文字符串出间隔性的出现 flag 的标识符。
2、解题思路
分栏破译。
def inputData():
string = input("请输入栅栏加密的文字:")
code = input("请输入分栏:(0代表从2到6逐个分栏):")
code = int(code)
return string,code
def code2(string):
string_temp = []
string_temp.append(string[0::2])
string_temp.append(string[1::2])
print("分成2栏的结果是:%s" % (''.join(string_temp)))
def code3(string):
string_temp = []
string_temp.append(string[0::3])
string_temp.append(string[1::3])
string_temp.append(string[2::3])
print("分成3栏的结果是:%s" % (''.join(string_temp)))
def code4(string):
string_temp = []
string_temp.append(string[0::4])
string_temp.append(string[1::4])
string_temp.append(string[2::4])
string_temp.append(string[3::4])
print("分成4栏的结果是:%s" % (''.join(string_temp)))
def code5(string):
string_temp = []
string_temp.append(string[0::5])
string_temp.append(string[1::5])
string_temp.append(string[2::5])
string_temp.append(string[3::5])
string_temp.append(string[4::5])
print("分成5栏的结果是:%s" % (''.join(string_temp)))
def code6(string):
string_temp = []
string_temp.append(string[0::6])
string_temp.append(string[1::6])
string_temp.append(string[2::6])
string_temp.append(string[3::6])
string_temp.append(string[4::6])
string_temp.append(string[5::6])
print("分成6栏的结果是:%s" % (''.join(string_temp)))
def main():
string, code = inputData()
if (code == 0):
code2(string)
code3(string)
code4(string)
code5(string)
code6(string)
elif (code == 2):
code2(string)
elif (code == 3):
code3(string)
elif (code == 4):
code4(string)
elif (code == 5):
code4(string)
elif (code == 6):
code4(string)
else:
print("error")
if __name__ == "__main__":
main()
三、Rot13
1、特点
凯撒加密的第十二种方式,但是可以字符和数字混合在其中。
2、解题思路
字符先利用凯撒加密方法转一次,数字不动,如果此时出现了 flag 即结束,否则根据转后的数据进行下一步处理。
import re
def ree():
isnum = re.compile(r'\d')
isalpha_am = re.compile(r'[a-m]')
isalpha_nz = re.compile(r'[n-z]')
return isnum,isalpha_am,isalpha_nz
def get_data():
string = input("请输入经过ROT13加密的字符串:")
string = string.lower()
return string
def ROT13(string):
string_temp = []
isnum,isalpha_am,isalpha_nz = ree()
for i in string:
if(isnum.match(i)):
string_temp.append()
elif(isalpha_am.match(i)):
i = chr(ord(i)+13)
string_temp.append(i)
elif(isalpha_nz.match(i)):
i = chr(ord(i)-13)
string_temp.append(i)
elif(i == " "):
string_temp.append(" ")
else:
print("error")
print("经过ROT3解密后的字符串为:%s"%(''.join(string_temp)))
def main():
string = get_data()
ROT13(string)
if __name__ == "__main__":
main()
四、凯撒密码
1、特点
一串不通顺的英文字符,不包含数字。
2、解题思路
根据偏移量1-25,逐个破译。
def getData():
alp = [chr(i) for i in range(97,97+26)]
string = input("请输入凯撒加密内容:")
return string
def kaisa(string):
if(string.isalpha()):
string = string.lower()
for i in range(1,27):
print(str(i),end=" ")
for j in string:
if((ord(j)+i)>=97+26):
j = chr(ord(j)+i-26)
else:
j = chr(ord(j)+i)
print(j,end="")
print()
def main():
string = getData()
kaisa(string)
if __name__ == "__main__":
main()
五、猪圈密码
1、特点
有特定符号构成,查看其定义容易得知。
2、解题思路
根据其定义的编码表,逐个转成 ascii 码,进行下一步破译。
def display():
print('''
A | B | C J.| K.|.L
---|---|--- ---|---|---
D | E | F M.| N.|.O
---|---|--- ---|---|---
G | H | I P.| Q.|.R
\ S / \ W /
\ / \./
T | | U X.| |.Y
/ \ /.\
/ V \ / Z \
''')
def main():
display()
if __name__ == "__main__":
main()
六、当铺密码
1、特点
中文密码,密文由中文构成,“由中人工大王夫井羊田”分别对应出头数为 ”1, 2, 3, 4, 5, 6, 7, 8, 9, 0”。
2、解题思路
根据定义转成数字后,可以两两一起组成 ascii 码值,根据 ascii 码转成对应的字符,进行下一步的破译。
def display2():
print('''
由 1
中 2
人 3
工 4
大 5
王 6
夫 7
井 8
羊 9
田 0
''')
def main():
display2()
if __name__ == "__main__":
main()
七、培根密码
1、特点
给出的密文中,只包含两种不同的字符,常见的是 a 和 b,和二进制异曲同工。
2、解题思路
五个五个分成一组,根据培根密码表转成 ascii 码,进行下一步破译。
def getDate():
string = input("请输入经过培根加密的字符串:")
return string
def manage1(string):
string = string.strip()
temp_one = string[0]
for i in string:
if(i != temp_one):
temp_two = i
break
else:
continue
manger2(string,temp_one,temp_two)
def manger2(string,a,b):
str_temp1 = []
str_temp2 = []
str1 = []
str2 = []
for i in string:
if(i == a):
str_temp1.append("a")
str_temp2.append("b")
else:
str_temp1.append("b")
str_temp2.append("a")
# str_temp1 = ''.join(str_temp1)
# str_temp2 = ''.join(str_temp2)
while(str_temp1):
a,b,c,d,e = str_temp1[0:5]
str1.append(manage3(a,b,c,d,e))
str_temp1 = str_temp1[5:]
while(str_temp2):
a,b,c,d,e = str_temp2[0:5]
str2.append(manage3(a,b,c,d,e))
str_temp2 = str_temp2[5:]
print(''.join(str1))
print(''.join(str2))
def manage3(a,b,c,d,e):
if(a == 'a'):
if(b == 'a'):
if(c == 'a'):
if(d == 'a'):
if(e == 'a'):
return "a"
else:
return "b"
else:
if(e == 'a'):
return "c"
else:
return "d"
else:
if(d == 'a'):
if(e == 'a'):
return "e"
else:
return "f"
else:
if(e == 'a'):
return "g"
else:
return "h"
else:
if(c == 'a'):
if(d == 'a'):
if(e == 'a'):
return "i"
else:
return "j"
else:
if(e == 'a'):
return "k"
else:
return "l"
else:
if(d == 'a'):
if(e == 'a'):
return "m"
else:
return "n"
else:
if(e == 'a'):
return "o"
else:
return "p"
elif(a == 'b'):
if(b == 'a'):
if(c == 'a'):
if(d == 'a'):
if(e == 'a'):
return "q"
else:
return "r"
else:
if(e == 'a'):
return "s"
else:
return "t"
else:
if(d == 'a'):
if(e == 'a'):
return "u"
else:
return "v"
else:
if(e == 'a'):
return "w"
else:
return "x"
else:
if(c == 'a'):
if(d == 'a'):
if(e == 'a'):
return "y"
else:
return "z"
def main():
string = getDate()
string = manage1(string)
if __name__ == "__main__":
main()
八、希尔密码
1、特点
题目会给出一串明文及秘钥求密文。
2、解题思路
转换成矩阵求解。
将明文转成n1的矩阵,密文转成nn的矩阵,两矩阵相乘,得到一个新的n*1矩阵,这个矩阵的每个参数mod26运算,最后得到三个数字,对应ascii表得出密文。
九、维吉尼亚密码
1、特点
一串分段长秘钥,一串分段明文或密文。
2、解题思路
- 映射转换。
- 从多段秘钥中选取一段。
- 两行,第一行放明文,第二行放秘钥(通常秘钥会短于明文,则秘钥顺序平铺对应明文)。
- 第一行作为列数据,第二行作为行数据,根据维吉尼亚密码表进行映射查找,最后转成ascii码。