CTF赛事中Crypto里较为齐全的古典密码收录
共计39种密码及多个对应解密脚本
若有纰漏,烦请指出

NEFU-NSILAB下密码手总结,首发于校内bbs论坛

您也可以点击我的博客观看

title

0.究极奥义

解密方式

根据题目、描述、提示、图片锁定主题,找到主题下对应的密码表
一言以蔽之:提高自己的二次元浓度 : )

1.埃及文字

·加/解密方式:对表

埃及

2.宝可梦图腾

·加/解密方式:对表

宝可梦

3.福尔摩斯·跳舞的小人

·加/解密方式:对表

福尔摩斯

4.精灵语

·加/解密方式:对表

jly

5.盲文

·加/解密方式:对表

mw

6.曲折密码/夏多密码

· 加/解密方式:对表

quzhe

7.圣堂武士密码

· 加/解密方式:对表

stws

8.外星人密码

· 加/解密方式:对表

wxr

9.音乐密码

· 加/解密方式:对表

yy

10.标准银河字母

· 加/解密方式:对表

yinhe

11.猪圈密码

· 加/解密方式:对表

zhu1
zhu2

12.猪圈密码变种

· 加/解密方式:对表

zqbz

13.天干地支表

tgdz

14.莫斯密码

· 加/解密方式:对表 | 网站解析

mose

15.培根密码

· 加/解密方式:对表

pekon

· 加/解密方式:Python3代码实现

__autor__ = '0HB'
letters1 = [
    'A', 'B', 'C', 'D', 'E', 'F', 'G',
    'H', 'I', 'J', 'K', 'L', 'M', 'N',
    'O', 'P', 'Q', 'R', 'S', 'T',
    'U', 'V', 'W', 'X', 'Y', 'Z',
]
letters2 = [
    'a', 'b', 'c', 'd', 'e', 'f', 'g',
    'h', 'i', 'j', 'k', 'l', 'm', 'n',
    'o', 'p', 'q', 'r', 's', 't',
    'u', 'v', 'w', 'x', 'y', 'z',
]
cipher1 = [
    "aaaaa", "aaaab", "aaaba", "aaabb", "aabaa", "aabab", "aabba",
    "aabbb", "abaaa", "abaab", "ababa", "ababb", "abbaa", "abbab",
    "abbba", "abbbb", "baaaa", "baaab", "baaba", "baabb",
    "babaa", "babab", "babba", "babbb", "bbaaa", "bbaab",
]
cipher2 = [
    "AAAAA", "AAAAB", "AAABA", "AAABB", "AABAA", "AABAB", "AABBA",
    "AABBB", "ABAAA", "ABAAA", "ABAAB", "ABABA", "ABABB", "ABBAA",
    "ABBAB", "ABBBA", "ABBBB", "BAAAA", "BAAAB", "BAABA",
    "BAABB", "BAABB", "BABAA", "BABAB", "BABBA", "BABBB",
]


def bacon1(string):  # 对应小写密文
    lists = []
    # 分割,五个一组
    for i in range(0, len(string), 5):
        lists.append(string[i:i + 5])
    # print(lists)
    # 循环匹配,得到下标,对应下标即可
    for i in range(0, len(lists)):
        for j in range(0, 26):
            if lists[i] == cipher1[j]:
                # print(j)
                print(letters1[j], end="")
    print("")


def bacon2(string):  # 对应大写密文
    lists = []
    # 分割,五个一组
    for i in range(0, len(string), 5):
        lists.append(string[i:i + 5])
    # print(lists)
    # 循环匹配,得到下标,对应下标即可
    for i in range(0, len(lists)):
        for j in range(0, 26):
            if lists[i] == cipher2[j]:
                # print(j)
                print(letters2[j], end="")
    print("")


if __name__ == "__main__":
    c = input('请输入培根密文:')
    if c.isupper():
        bacon2(c)
    elif c.islower():
        bacon1(c)
    else:
        print('输入错误,请检查!')

16.JSfuck密码

·简介

·JSFuck 可以让你只用 6 个字符 !+ 来编写 JavaScript 程序。

·例如你想用 JSFuck 来实现 alert(1) 代码如下:

[][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]][([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]]+([][[]]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[+!+[]]]]+([][[]]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]((![]+[])[+[[+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]+(!![]+[])[+[[+[]]]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[+!+[]]]+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+[+!+[]]+([][(![]+[])[+[[+[]]]]+([][[]]+[])[+[[!+[]+!+[]+!+[]+!+[]+!+[]]]]+(![]+[])[+[[!+[]+!+[]]]]+(!![]+[])[+[[+[]]]]+(!![]+[])[+[[!+[]+!+[]+!+[]]]]+(!![]+[])[+[[+!+[]]]]]+[])[+[[+!+[]]]+[[!+[]+!+[]+![]+!+[]+!+[]+!+[]]]])()

·加/解密方式:网页解析

jsfuck

17.BrainFuck密码

·简介

这种语言,是一种按照“Turing complete(图灵完备)”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainFuck 语言只有 ><±.,[] 八种符号,所有的操作都由这八种符号的组合来完成。

·加/解密方式:网页解析

bf

20.Ook!密码

·简介

所有明文转换成Ook.?!

·加/解密方式:网页解析

ok!

21.博多密码

·简介

·博多电码是法国工程师博多于1874年推出的一种电报码。它在20世纪中期取代了莫尔斯电码被广泛应用。
·博多码,是一种5位代表一个字节的编码。在那个年代,5位的系统已经非常复杂,位数更多不切合实际,但稍加分析便可知道,5位是不可能代表26个英文字母+数字+各种符号的,而博多码并不是一个像电脑所使用的,一个8位特定的二进制数字专门地表示一个字符的编码系统,博多使用了同一组编码分别表示字母集和数字标点符号集,通过两个字符实现字符集之间的切换。因此,当报文中同时包含了英文字母和数字和符号的时候,必须加入切换字符来表示在不同的集之间的切换。博多式电报机是这样的一个样子:发报收报端各一台看上去是钢琴一般的只有5个按键的机器,按键从左到右按字母顺序排列,通过电路两两相连,两边按下键盘时,对方的纸带上会打印出相对应按键的黑点,当需要打符号的时候,只需要按照编码表上表示切换到符号集(Figures)所代表编码按下对应的按键,此后输出的都会被收报员人工判读为符号或者数字,当需要恢复到输入字母时,按下编码表上表示字母集(Letters)的按键,此后的内容都会被判读为字母。

博多密码

22.键盘密码·QWE替换

·简介

QWE格式密码就是QWERTYUIOP ASDFGHJKL ZXCVBNM 依次表示字母ABCDEFGHIJKLMNOQRSTUVWXYZ。

·加/解密方式:对表

qwe

23.键盘密码·QWE包围

·简介

解密方式:每组密文所围住的按键上的字符
例: yujnbg, 观察键盘发现这六个字母围住了h,故明文为h。

·加/解密方式:观察键盘

键盘

24.键盘密码·九一

·名字自己胡诌的。此类键盘密码的特征是有两种形式,重复的数字重复的英文
·一是指键盘第一行的意思,九是指九宫格
·[NCTF2019]Keyboard
ooo yyy ii w uuu ee uuuu yyy uuuu y w uuu i i rr w i i rr rrr uuuu rrr uuuu t ii uuuu i w u rrr ee www ee yyy eee www w tt ee
·发现密文全在键盘字母第一行,若再上一行,则会得到字母与数字的映射关系,例如:q对应1,w对映2。
·此时会发现数字全都是小于10的,对应九宫格拼音,又重复次数在四次以内,则重复次数是一宫中的行坐标。
例:ooo -> 999 -> y
·[MRCTF2020]keyboard
得到的flag用
MRCTF{xxxxxx}形式包上
都为小写字母
6
666
22
444
555
33
7
44
666
66
3
·相比于重复字母,则是少了映射的一步,直接在九宫格定位。
·例:6 -> M

91

·加/解密方式:Python3代码实现

cipher = input('请输入键盘密码(数字或英文):')
base = " qwertyuiop"
a = [" ", " ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
dict_zm = {1: 'q', 2: 'w', 3: 'e', 4: 'r', 5: 't', 6: 'y', 7: 'u', 8: 'i', 9: 'o', 0: 'p'}
b = []
if ''.join(cipher.split(' ')).isdigit():  # 是数字时
    cipher = cipher.split(' ')
    for each in cipher:
        b.append(dict_zm[int(each[0])]*len(each))
    cipher = ' '.join(b)


for part in cipher.split(" "):
    s = base.index(part[0])
    count = len(part)
    print(a[s][count-1], end="")

xgt

25.棋盘密码

·简介

Polybius 密码又称为棋盘密码,一般是将给定的明文加密为两两组合的数字

·加/解秘方式:对表

·基础版

普通

·明文:HELLO 密文:23 15 31 31 34

·变异版

变异

·使用这种密码表的加密也叫作 ADFGX 密码(密文中只有 A D F G X)
·明文:HELLO 密文:DD XF AG AG DF

26.维吉尼亚密码

·简介

维吉尼亚密码是在凯撒密码基础上产生的一种加密方法,它将凯撒密码的全部25种位移排序为一张表,与原字母序列共同组成26行及26列的字母表。另外,维吉尼亚密码必须有一个密钥,这个密钥由字母组成,最少一个,最多可与明文字母数量相等。

·加/解密方式:网页解析

维吉尼亚密码加密方法示例如下:

明文:I’ve got it.
密钥:ok

密文:W’fs qcd wd.

首先,密钥长度需要与明文长度相同,如果少于明文长度,则重复拼接直到相同。本例中,明文长度为8个字母(非字母均被忽略),密钥会被程序补全为“okokokok”。

现在根据如下维吉尼亚密码表格进行加密:
wjny

明文第一个字母是“I”,密钥第一个字母是“o”,在表格中找到“I”列与“o”行相交点,字母“W”就是密文第一个字母;同理,“v”列与“k”行交点字母是“F”;“e”列与“o”行交点字母是“S”……

维吉尼亚密码只对字母进行加密,不区分大小写,若文本中出现非字母字符会原样保留。
如果输入多行文本,每行是单独加密的。

27.栅栏密码

·简介

·分为传统型与变异W型
·接下来,介绍传统型栅栏密码
·所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般不超过30个,也就是一、两句话)

传统栅栏

fence

·Python3实现

def enFence(string, space): # 解密
   s = ""
   for i in range(0, space):
       for j in range(i, len(string), space):
           # 不能越界
           if j < len(string):
               s += string[j]
   print(s)


def deFence(string, space): # 加密
   s = ""
   if len(string) % space == 0:
       key = len(string) // space
   else:
       key = len(string) // space + 1
   # 小于间隔继续
   for i in range(0, key):
       for j in range(i, len(string), key):
           # 不能越界
           if j < len(string):
               s += string[j]
   print(s)

from math import sqrt

def factoring(n):
    '''对大数进行因数分解'''
    if not isinstance(n, int):
        print ('You must give me an integer')
        return
    #开始分解,把所有因数都添加到result列表中
    result = []
    for p in primes:
        while n!=1:
            if n%p == 0:
                n = n/p
                result.append(p)
            else:
                break
        else:
            result = map(str, result)
            result = '*'.join(result)
            return result
    #考虑参数本身就是素数的情况
    if not result:
        return n


maxData = 10000
#小于maxData的所有素数
primes = [ p for p in range(2, maxData) if 0 not in
        [ p% d for d in range(2, int(sqrt(p))+1)] ]


m = input("请输入栅栏密码:")
len_m = len(m)
print(len_m, '=', factoring(len_m))
try:
    o = input("支持输入不只一个数字,但要用空格分开,例:X Y Z \n 每组字母数字:")
    o = o.split(' ')
    for each in o:
        print('每组字母数:', each)
        enFence(m, int(each))
except:
    print('错误!', '输入密文位数为', len_m)

W型栅栏

·简介

W型栅栏密码加密的方法中,明文由上至下顺序写上,当到达最低部时,再回头向上,一直重复直至整篇明文写完为止。

·加解密方式:网页解析

此例子中,其包含了三栏及一段明文:‘WEAREDISCOVEREDFLEEATONCE’。如下:

W . . . E . . . C . . . R . . . L . . . T . . . E
. E . R . D . S . O . E . E . F . E . A . O . C .
. . A . . . I . . . V . . . D . . . E . . . N . .

按行读取后的密文:

WECRLTEERDSOEEFEAOCAIVDEN
W型的加密密钥就不只能是字符串长度的因子,小于其长度的任何一个数都可能是其key值,所以第一步也是确定密钥。

28.凯撒密码

·简介

凯撒密码最早由古罗马军事统帅盖乌斯·尤利乌斯·凯撒在军队中用来传递加密信息,故称凯撒密码。此为一种位移加密手段,只对26个(大小写)字母进行位移加密,规则相当简单,容易被破解。下面是明文字母表移回3位的对比:
明文字母表 X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
密文字母表 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
然后A变成D,B变成E,Z变成C。
字母最多可移动25位(按字母表)。通常为向后移动,如果您想向前移动1位,则相当于向后移动25位,位移选择为25位。

·加/解密方式:Python3实现

#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
import re
import time

__author__ = '0HB'


def encryption(Emessage, key):
    change = []
    message = list(Emessage.lower())
    for letter in message:
        if letter >= 'a' and letter <= 'z':
            letter = chr((ord(letter) - ord('a') + 26 - key) % 26 + ord('a'))
            change.append(letter)
        else:
            change.append(letter)
            continue
    return ''.join(change)

"""
def search_key(mabeyMessage, words):
    result = []
    n = 0
    result = re.split(' |,|\.|!|\?', mabeyMessage)
    for em in result:
        if em in words.split():
            n = n + 1
    return n
"""

if __name__ == '__main__':
    Emessage = input('请输入凯撒密文:')

    words = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

    pipei = []
    for K in range(0, 26):
        start = time.perf_counter()
        """
        for i in range(1, 27):
            pipei.append(search_key(encryption(Emessage, i), words))
            if pipei[i - 1] > max:
                max = pipei[i - 1]
                K = i
        """

        end = time.perf_counter()
        print('位移', K, '明文:', encryption(Emessage, K))



"""
# 加密用法
        m1 = 'what can I do for you?'
        e1 = encryption(m1, 3)
        print('加密后:', e1)
"""

xgt2

29.拼音编码

·简介

即将生僻字转换成拼音,然后读出来的文字就是明文

·加/解密方式:网页解析

30.URL编码

·简介

密文格式:%66%6C%61%67%7B%61%6E%64%20%31%3D%31%7D

·加/解密方式:网页解析

py

31.quoted-printable编码

加/解密方式:网页解析

tp

32.Uuencode编码

·加/解密方式:网页解析

uu

33.Rabbit编码

·加/解密方式:网页解析

tz

34.ROT编码

·简介

ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性,可以自我解密,主要用于应对快速浏览,或者是机器的读取,而不让其理解其意。

ROT5 是 rotate by 5 places 的简写,意思是旋转5个位置,其它皆同。下面分别说说它们的编码方式:
ROT5:只对数字进行编码,用当前数字往前数的第5个数字替换当前数字,例如当前为0,编码后变成5,当前为1,编码后变成6,以此类推顺序循环。
ROT13:只对字母进行编码,用当前字母往前数的第13个字母替换当前字母,例如当前为A,编码后变成N,当前为B,编码后变成O,以此类推顺序循环。
ROT18:这是一个异类,本来没有,它是将ROT5和ROT13组合在一起,为了好称呼,将其命名为ROT18。
ROT47:对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。用于ROT47编码的字符其ASCII值范围是33-126,具体可参考ASCII编码。

·加/解密实现:网页解析

35.社会主义核心价值观编码

·加/解密方式:网页解析

shzyhao!

39.希尔密码

·简介

希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。
每个字母当作26进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。

·加/解密方式:网页解析

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐