CTF·Crypto·古典密码大全

CTF·Crypto·古典密码大全

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

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

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

0.究极奥义

解密方式

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

1.埃及文字

·加/解密方式:对表

2.宝可梦图腾

·加/解密方式:对表

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

·加/解密方式:对表

4.精灵语

·加/解密方式:对表

5.盲文

·加/解密方式:对表

6.曲折密码/夏多密码

· 加/解密方式:对表

7.圣堂武士密码

· 加/解密方式:对表

8.外星人密码

· 加/解密方式:对表

9.音乐密码

· 加/解密方式:对表

10.标准银河字母

· 加/解密方式:对表

11.猪圈密码

· 加/解密方式:对表

12.猪圈密码变种

· 加/解密方式:对表

13.天干地支表

14.莫斯密码

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

15.培根密码

· 加/解密方式:对表

· 加/解密方式: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) 代码如下:

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

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

17.BrainFuck密码

·简介

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

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

20.Ook!密码

·简介

所有明文转换成Ook.?!

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

21.博多密码

·简介

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

22.键盘密码·QWE替换

·简介

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

·加/解密方式:对表

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

·加/解密方式: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="")

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

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

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

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

27.栅栏密码

·简介

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

传统栅栏

·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)

"""

29.拼音编码

·简介

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

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

30.URL编码

·简介

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

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

31.quoted-printable编码

加/解密方式:网页解析

32.Uuencode编码

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

33.Rabbit编码

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

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.社会主义核心价值观编码

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

39.希尔密码

·简介

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

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

相关推荐

视频采集卡使用指南:从连接到设置的全步骤
beat365正版唯一官网

视频采集卡使用指南:从连接到设置的全步骤

📅 08-15 👁️ 3176
小米手机自带浏览器介绍
beat365正版唯一官网

小米手机自带浏览器介绍

📅 09-12 👁️ 987
《部落冲突》加好友教程攻略 怎么加好友
beat365正版唯一官网

《部落冲突》加好友教程攻略 怎么加好友

📅 08-20 👁️ 7136