古典密码-其他密码

记录一些见过的密码

时间不语,但却回答了很多问题

从网上找了些资料,以及一些大佬的博客,再结合自己所学,收集了一些加密方式。

一、培根密码

把字母用A,B两个字母表示

码表:

明文 密文 明文 密文 明文 密文 明文 密文
A AAAAA G AABBA N ABBAA T BAABA
B AAAAB H AABBB O ABBAB U/V BAABB
C AAABA I/J ABAAA P ABBBA W BABAA
D AAABB K ABAAB Q ABBBB X BABAB
E AABAA I ABABA R BAAAA Y BABBA
F AABAB M ABABB S BAAAB Z BABBB

培根密码不过是用A,B代替0,1表示其在字母表中的顺序(0——25)。

例如字母C的顺序是2,所以其密文是AAABA(00010)

工具:http://rumkin.com/tools/cipher/baconian.php

找了harry师傅的脚本(59条消息) CTF·Crypto·古典密码大全_博多密码_0HB的博客-CSDN博客

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
__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('输入错误,请检查!')

二、栅栏密码

原理

栅栏密码把要加密的明文分成 N 个一组,然后把每组的第 1 个字连起来,形成一段无规律的话。

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
明文:THERE IS A CIPHER
去掉空格
明文:THEREISACIPHER
取N=2,即2个字母一组
TH ER EI SA CI PH ER
先取每组第一个字母:TEESCPE
再去每组第二个字母:HRIAIHR
所以密文:TEESCPEHRIAIHR

如果明文是THERE IS CIPHER
分组:TH ER EI SC IP HE R
照样2个一组,然后先取每组第一个字母
密文:TEESIHRHRICPE

自己写了个加密代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
plaintext = "THEREISACIPHER"

def encrypto(plaintext,n):
array = []
cipher = ""
for i in range(0,len(plaintext),n):
array.append(plaintext[i:i+n])

for i in range(len(array[0])):
for j in array:
try:
cipher += j[i]
except:
pass
print("每组字数"+ str(n) +"加密结果" + cipher)

for i in range(2,len(plaintext)):
encrypto(plaintext,i)

工具:

栅栏密码_栅栏密码在线加密解密【W型】-ME2在线工具 (metools.info)

栅栏密码在线加密解密 - 千千秀字 (qqxiuzi.cn)

三、曲路密码

原理

曲路密码(Curve Cipher)是一种换位密码,需要事先双方约定密钥(也就是曲路路径)

eg:

1
明文:The quick brown fox jumps over the lazy dog

填入5行7列的表格(事先约定填充的行列数)

T h e q u i c
k b r o w n f
o x j u m p s
o v e r t h e
l a z y d o g

加密的回路线(事先约定)

1
密文:gesfc inpho dtmwu qoury zejre avxbh Tkool

四、列位移密码

列移位密码(Columnar Transposition Cipher)是一种比较简单,易于实现的换位密码,通过一个简单的规则将明文打乱混合成密文。

eg:

1
明文:The quick brown fox jumps over the lazy dog

填入5行7列的表格(事先约定填充的行列数)

T h e q u i c
k b r o w n f
o x j u m p s
o v e r t h e
l a z y d o g

选取密钥: how are u

how are u 在字母表中的出现的先后顺序进行编号,我们就有 a 为 1,e 为 2,h 为 3,o 为 4,r 为 5,u 为 6,w 为 7,所以先写出 a 列,其次 e 列,以此类推

最后得到的密文是qoury inpho Tkool hbxva uwmtd cfseg erjez

网站:Practical Cryptography

五、01248密码

01248密码又称云影密码

原理

使用 0,1,2,4,8 四个数字,其中把0当间隔,被0间隔开的数字进行相加,表示字母A—Z。eg:28代表10,即字母J

这里以2023HDCTF——爬过小山去看云

题目:

1
2
密文:ymyvzjtxswwktetpyvpfmvcdgywktetpyvpfuedfnzdjsiujvpwktetpyvnzdjpfkjssvacdgywktetpyvnzdjqtincduedfpfkjssne
在山的那头,有3个人,4只鸟,19只羊,11朵云

先将密文进行Hill密码解密,然后得到的密文是:842084210884024084010124

1
2
3
4
5
842084210884024084010124
把0去掉得到
842 8421 884 24 84 1 124
分别表示 14 15 20 6 12 1 7
表示N O T F L A G

解密脚本

自己写的解密脚本,可能有错

1
2
3
4
5
6
7
8
9
cipher = ""                         #输入密文,密文由01248构成
string = cipher.split('0') #以0作为间隔,实现分组
flag = ""
for i in string: #对每组数字进行求和
sum=0
for j in i:
sum += int(j) #int的作用是把字符转成数字
flag += chr(sum+64) #数字转对应的字母
print(flag)

加密脚本

自己写的,可能有误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
message = ""                    #输入要加密的字符串
cipher=""
for i in message:
sum = ord(i)-64
while sum > 0:
if sum >= 8:
cipher+='8'
sum -= 8
elif sum >= 4:
cipher+='4'
sum -= 4
elif sum >= 2:
cipher+='2'
sum -= 2
else:
cipher+='1'
sum -= 1
cipher += '0'

print(cipher)

六、JSFuck

原理

JSFuck 可以只用 6 个字符 []()!+ 来编写 JavaScript 程序。比如我们想用 JSFuck 来实现 alert(1) 代码如下

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

这个一点没理解

工具:

JSFuck - Write any JavaScript with 6 Characters: !+

七、BrainFuck

一种极小化的计算机语言,下面链接有详解。本人只是浅浅的了解了一下

BrainFuck用> < + - . ,[ ]八种符号替换C语言的各种语法和命令

其含义如下:

1
2
3
4
5
6
7
8
> :指针加一
< :指针减一
+ :指针指向字节的值加一
- :指针指向字节的值减一
. :输出指针指向的内容(以ASCII码的形式)
, :输入内容到指针指向的单元
[ :如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处
] :如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处

详细可见下面文章:

Brainfuck详解 - 知乎 (zhihu.com)

(59条消息) Brainfuck语言入门_bf语言_csuzhucong的博客-CSDN博客

工具:

[Brainfuck/Ook! Obfuscation/Encoding splitbrain.org]

八、Ook

Ook和BrainFuck类似,也是用了替换,Ook只有三个不同的语法:

1
2
3
4
5
6
7
8
9
10
Ook.   Ook?    Ook!
用这三个语法即可表示多种含义:
Ook. Ook?表示:指针加一
Ook? Ook.表示:指针减一
Ook. Ook.表示:指针指向字节的值加1
Ook! Ook!表示:指针指向字节的值减1
Ook. Ook!表示:输入内容到指针指向的单元(以ASCII码的形式)
Ook! Ook.表示:输出指针指向的内容(以ASCII码的形式)
Ook! Ook?表示:如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处
Ook? Ook!表示:如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处

可参考下面文章:Brainfuck与Ook!编程语言解析与解密 - M4x - 博客园 (cnblogs.com)

工具

[Brainfuck/Ook! Obfuscation/Encoding splitbrain.org]

九、猪圈密码(含变种)

根据码表

其来源于

变种

十、舞动的小人密码

十一、键盘密码

键盘密码就是用手机键盘或电脑键盘进行加密的密码

手机键盘密码

关于手机键盘加密还有另一种方式,就是拼音具体参照手机键盘来打,例如:「数字」表示出来就是:748 94。

电脑键盘棋盘

这个感觉挺怪的

电脑键盘坐标

用字母在电脑键盘上的坐标来表示,比如B表示为35

电脑键盘QWE

用QWE代表ABC,依次推下去

1
2
3
QWERTYUIOP表示ABCDEFGHIJ
ASDFGHJKL表示KLMNOPQRS
ZXCVBNM表示TUVWXYZ

QWE包围

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

代换

1
2
q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m替换成
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

十二、古埃及象形文字

十三、宝可梦图腾

十四、精灵语

十五、古精灵语

十六、夏多密码

夏多密码又称曲路密码

十七、圣堂武士密码

十八、盲文

十九、外星人密码

二十、音乐密码

二十一、标准银河密码

二十二、天干地支表

二十三、摩斯密码

在线解密:在线摩斯电码 - 码工具 (matools.com)

二十四、玛雅数字

这个是自己在做题的时候积累的

-------------已经到底啦!-------------