CTF(鶸)密码学

2019/07/30 Python 算法 逃离CSDN

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码。

Search

    Table of Contents