1.凯撒密码

凯撒密码(Caesar)加密时会将明文中的 每个字母 都按照其在字母表中的顺序向后(或向前)移动固定数目(循环移动)作为密文。

1.固定密钥:(密钥往往通过遍历获得)

1
2
明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG        //密钥为3
密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ

2.密钥不定:

1
2
3
4
密文:s0a6u3u1s0bv1a
密钥:guangtou //字母对应数字 a-z ~ 1 - 26
偏移:6,20,0,13,6,19,14,20
明文:y0u6u3h1y0uj1u

2.Atbash Cipher(移位密码)

它使用字母表中的最后一个字母代表第一个字母,倒数第二个字母代表第二个字母。在罗马字母表中,它是这样出现的:

1
2
明文: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
密文:Z Y X W V U T S R Q P O N M L K J I H G F E D C B A

3.简单替换密码

将每个明文字母替换为与之唯一对应且不同的字母

1
2
明文字母 : abcdefghijklmnopqrstuvwxyz
密钥字母 : phqgiumeaylnofdxjkrcvstzwb

破解方法:

可以利用quipquip网站进行暴力解密:

quipqiup - cryptoquip and cryptogram solver

4.仿射密码(特点在于只有 26 个英文字母)

仿射密码的加密函数是

1
E(x)=(ax+b)(modm)
  • x 表示明文按照某种编码得到的数字
  • a 和 m 互质
  • m 是编码系统中字母的数目。

解密函数是

1
D(x)=a−1(x−b)(modm)    

其中 a−1 是 a 在 Zm群的乘法逆元。

5.Playfair 密码

  1. 选取一串英文字母,除去重复出现的字母,将剩下的字母逐个逐个加入 5 × 5 的矩阵内,剩下的空间由未加入的英文字母依 a-z 的顺序加入。注意,将 q 去除,或将 i 和 j 视作同一字。

  2. 将要加密的明文分成两个一组。若组内的字母相同,将 X(或 Q)加到该组的第一个字母后,重新分组。若剩下一个字,也加入 X 。

  3. 在每组中,找出两个字母在矩阵中的地方。

    1.若两个字母不同行也不同列,在矩阵中找出另外两个字母(第一个字母对应行优先),使这四个字母成为一个长方形的四个角。

    2.若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)。

    3.若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)。

例:

以 playfair example 为密匙,得

1
2
3
4
5
P L A Y F
I R E X M
B C D G H
K N O Q S
T U V W Z
1
2
HI DE TH EG OL DI NT HE TR EX ES TU MP      //明文
BM OD ZB XD NA BE KU DM UI XM MO UV IF //密文

6.棋盘密码(特点:两两一组,且种类不超过5)

1.12345密码表:

5yvuLR.png

2.ADFGX密码表:

5yvlo6.png

例:

1
2
3
HELLO                 //明文
23 15 31 31 34 //第一种密文
DD XF AG AG DF //第二种密文

7.维吉尼亚密码

首先,对密钥重复使得与明文等长。

其次,对照维吉尼亚密码表。

5yvUOA.png

1
2
3
明文:comegreatwall
密钥:crypto -> cryptocryptoc
密文:efktzferrltzn

解密网站

Vigenere Solver | guballa.de

8.希尔密码

使用每个字母在字母表中的顺序作为其对应的数字,即 A=0,B=1,C=2 等,然后将明文转化为 n 维向量,跟一个 n × n 的矩阵相乘,再将得出的结果模 26。注意用作加密的矩阵(即密匙)在 Z26n 必须是可逆的,否则就不可能解码。只有矩阵的行列式和 26 互质,才是可逆的。

例:

5yvYSe.png

1
2
明文:ACT
密文:POH

9.培根密码(题目描述食物可联想)

特点:

  • 只含A 和 B
  • 每一段的长度为 5

5yvwwt.png

10.栅栏密码

栅栏密码把要加密的明文进行分组,再组合.

1
2
3
4
5
6
明文:THEREISACIPHER
栅栏密码有两种分组方式 (
1. 总体分,即THEREIS和ACIPHER //分成两组
得到密文:TAHCEIRPEHIESR
2. 个体分,即分成 TH ER EI SA CI PH ER //分成N组,每组两个元素
得到密文:TEESCPEHRIAIHR

11.01248密码(云影密码)

其中 0 用来表示间隔,其他数字以加法可以表示出 如:28=10,124=7,18=9,再用 1->26 表示 A->Z。

特点:只有0,1,2,4,8

首先,按照 0 来进行分割

1
2
3
4
明文:8842101220480224404014224202480122
逐个想加,如88421 -> 8+8+4+2+1 = 23
对照英文表,23->W
密文:WELLDONE

12.JSFuck

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

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

13.BrainFuck

例:

1
2
3
++++++++++[>+++++++>++++++++++>+++>+<<<<-]
>++.>+.+++++++..+++.>++.<<+++++++++++++++.
>.+++.------.--------.>+.>.

工具:

14.猪圈密码:

图片对比即可

我们举一个例子,如明文为 X marks the spot ,那么密文如下

WHENXHEPIGWANXXOEAX

whenthepigwanttoeat

5yvDFf.png

工具:

还有另外两种类似:

猪圈密码的变种:

1圣堂武士密码:

pPiYl9I.png

pPiYM4A.png

15.舞动的小人密码

每一个跳舞的小人实际上对应的是英文二十六个字母中的一个,而小人手中的旗子则表明该字母是单词的最后一个字母,如果仅仅是一个单词而不是句子,或者是句子中最后的一个单词,则单词中最后一个字母不必举旗。

5yvNyd.png

16.键盘密码

1.手机键盘密码

第一种,用两位数字来表示字母,例如:ru 用手机键盘表示就是:7382,那么这里就可以知道了,手机键盘加密方式不可能用 1 开头,第二位数字不可能超过 4

第二种,用数字位数表示第几个数字,位数不超过4,如6对应6的第三个字母o

5yvdeI.png

2.电脑键盘棋盘

电脑键盘棋盘加密,利用了电脑的棋盘方阵。

5yvgyj.png

3.电脑键盘坐标

电脑键盘坐标加密,利用键盘上面的字母行和数字行来加密,例:bye 用电脑键盘 XY 表示就是:351613

有时需考虑被多个字母包围的字母。

5yv6Sg.png

4.电脑键盘 QWE

电脑键盘 QWE 加密法,就是用字母表替换键盘上面的排列顺序。

5yvrY8.png

解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import argparse
str1="QWERTYUIOPASDFGHJKLZXCVBNM"
str2="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
parser=argparse.ArgumentParser()
parser.add_argument('mode',help='encipherment/decipherment')
args=parser.parse_args()
str3=''
if args.mode=='e':
en_str=raw_input('Please input encrypted string:')
for s in en_str:
str3=str3+str1[str2.index(s.upper())]
elif args.mode=='d':
de_str=raw_input('Please input decryption string:')
for s in de_str:
str3=str3+str2[str1.index(s.upper())]
print('result:%s'%str3)

17.摩斯电码

通常为音频,且只含两种音,靠听力听出停顿或根据图谱停顿。

与电码表对照即可

5yv0TP.png

18.盲文密码

根据盲文进行转换加密

5yvny9.png

19.甲子年加密

通常需要对甲子年进行ASCII码转换。

5yvsfS.png

20.ASCII码运算加密

通过对ASCII码进行各种运算进行加密。

如:

1
2
3
4
5
97 102 90 95 114 57 86 89 102 83 99 79 101 79 95 85 76 94 82 87 85 99
a f Z _ r 9
102 108 97 103 123
flag{
ASCII码的差值递增:567.....。

21.当铺密码:

当铺密码 [1] 就是一种将中文和数字进行转化的密码算法相当简单:当前汉字有多少笔画出头,就是转化成数字几。例如:

王:该字外面有 6 个出头的位置,所以该汉字对应的数字就是 6;

口:该字外面没有出头的位置,那就是0;

人:该字外面有 3 个出头的位置,所以该汉字对应的数字就是 3;

1
2
3
4
5
6
7
8
9
10
11
s ='田由中人工大王夫井羊'        
code=input("请输入当铺密码:")
code = code.split(" ")
w = ''
for i in code:
k=""
for j in i:
k+=str(s.index(j))
w+=chr(int(k))
print(w)

22.转盘密码(也叫转轮机)

字母矩阵注意结果可能在一行中,可能在一列中,也可能有其余情况,需要仔细观察,一般拼接后是单词。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
明文:
1: <ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2: <KPBELNACZDTRXMJQOYHGVSFUWI <
3: <BDMAIZVRNSJUWFHTEQGYXPLOCK <
4: <RPLNDVHGFCUKTEBSXQYIZMJWAO <
5: <IHFRLABEUOTSGJVDKCPMNZQWXY <
6: <AMKGHIWPNYCJBFZDRUSLOQXVET <
7: <GWTHSPYBXIZULVKMRAFDCEONJQ <
8: <NOZUTWDCVRJLXKISEFAPMYGHBQ <
9: <QWATDSRFHENYVUBMCOIKZGJXPL <
10: <WABMCXPLTDSRJQZGOIKFHENYVU <
11: <XPLTDAOIKFZGHENYSRUBMCQWVJ <
12: <TDSWAYXPLVUBOIKZGJRFHENMCQ <
13: <BMCSRFHLTDENQWAOXPYVUIKZGJ <
14: <XPHKZGJTDSENYVUBMLAOIRFCQW <

密钥: 2,5,1,3,6,4,9,7,8,14,10,13,11,12

密文:HCBTSXWCRQGLES

这是一个转盘加密:

比如第一个密钥匙:2、密文匙:H

把转盘第二行单独提出来 2: <KPBELNACZDTRXMJQOYHGVSFUWI <

从H的地方一直剪切,把剪切的内容放在最前面,变成 2: <HGVSFUWIKPBELNACZDTRXMJQOY <

依次类推把14行都按这样的方式整一遍就得到这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
2:  <HGVSFUWIKPBELNACZDTRXMJQOY <
5: <CPMNZQWXYIHFRLABEUOTSGJVDK <
1: <BVIQHKYPNTCRMOSFEZWAXJGDLU <
3: <TEQGYXPLOCKBDMAIZVRNSJUWFH <
6: <SLOQXVETAMKGHIWPNYCJBFZDRU <
4: <XQYIZMJWAORPLNDVHGFCUKTEBS <
9: <WATDSRFHENYVUBMCOIKZGJXPLQ <
7: <CEONJQGWTHSPYBXIZULVKMRAFD <
8: <RJLXKISEFAPMYGHBQNOZUTWDCV <
14:<QWXPHKZGJTDSENYVUBMLAOIRFC <
10:<GOIKFHENYVUWABMCXPLTDSRJQZ <
13:<LTDENQWAOXPYVUIKZGJBMCSRFH <
11:<ENYSRUBMCQWVJXPLTDAOIKFZGH <
12:<SWAYXPLVUBOIKZGJRFHENMCQTD <

结果就在其中。

23.JScript和VBScript脚本加密

具体的密文具体格式目前还不太清楚,应该和下面这个类似,见过一个VBScript脚本加密:

1
#@~^TgAAAA=='[6*liLa6++p'aXvfiLaa6i[[avWi[[a*p[[6*!I'[6cp'aXvXILa6fp[:6+Wp[:XvWi[[6+XivRIAAA==^#~@

工具:

24.Ook加密

密文形式一(常见):

1
2
3
4
5
6
7
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook.

密文形式二(不常见):

1
2
3
4
5
6
7
8
9
..... ..... ..... ..... !?!!. ?.... ..... ..... ..... .?.?! .?... .!...
..... ..... !.?.. ..... !?!!. ?!!!! !!?.? !.?!! !!!.. ..... ..... .!.?.
..... ...!? !!.?. ..... ..?.? !.?.. ..... .!.?. ..... ..... !?!!. ?!!!!
!!!!! !?.?! .?!.? ..... ....! ?!!.? ..... ...?. ?!.?. ..... !.?.. .....
!?!!. ?!!!! !!?.? !.?!! !!!!! !!!!. ..... ...!. ?.... ...!? !!.?. .....
?.?!. ?..!. ?.... ..... !?!!. ?!!!! !!!!? .?!.? !!!!! !!!!! !!!.? .....
..!?! !.?.. ....? .?!.? ....! .!!!. !!!!! !!!!! !!!!! !!.?. ..... .!?!!
.?... ...?. ?!.?. ..... !.!!! !!!!! !.?.. ..... ..!?! !.?.. ..... .?.?!
.?... ..... !.?.

25.base编码

1.base64,含大小写((A-Z、a-z、0-9、+、/)),结尾通常含有 “ == ”

2.base32,只含大写(字母A-Z和数字2-7),结尾也含有“ == ”

3.base16,只含(数字0-9和字母A-F)结尾不含“ == ”,但有可能对于 == 的要去掉 == 再base16解密。

base循环爆破:

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
import base64
file = open("flag_encode.txt",'r')
text = file.read()
while(1):
try:
text = base64.b32decode(text ).decode()
except:
try:
text = base64.b64decode(text ).decode()
except:
try:
text = base64.b16decode(text ).decode()
except:
print("text!")
break

import base64
with open("flag_encode.txt","r") as f:
data = f.read()
f.close()
while True:
if "{" in str(data):
print(data)
break
try:
data = base64.b16decode(data)
except Exception:
try:
data = base64.b32decode(data)
except Exception:
try:
data = base64.b64decode(data)
except Exception:
data = base64.b85decode(data)

python3(逐行base64)

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
import base64
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('./base.txt', 'rb') as f:
flag = ''
bin_str = ''
for line in f.readlines():
stegb64 = str(line, "utf-8").strip("\n")
rowb64 = str(base64.b64encode(base64.b64decode(stegb64)), "utf-8").strip("\n")
offset = abs(b64chars.index(stegb64.replace('=', '')[-1]) - b64chars.index(rowb64.replace('=', '')[-1]))
equalnum = stegb64.count('=') # no equalnum no offset
if equalnum:
bin_str += bin(offset)[2:].zfill(equalnum * 2)
# flag += chr(int(bin(offset)[2:].zfill(equalnum * 2), 2))
# print(flag) 这样写得不出正确结果
print([chr(int(bin_str[i:i + 8], 2)) for i in range(0, len(bin_str), 8)])





import base64
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('./base.txt', 'r') as f: # 使用文本模式读取文件
flag = ''
bin_str = ''

for line in f:
stegb64 = line.strip() # 直接去掉行末的换行符
if not stegb64: # 跳过空行
continue

try:
decoded = base64.b64decode(stegb64)
rowb64 = base64.b64encode(decoded).decode('utf-8')
except Exception as e:
print(f"Error decoding line: {line.strip()}, {e}")
continue

# 计算偏移量
last_char_steg = stegb64.replace('=', '')[-1]
last_char_row = rowb64.replace('=', '')[-1]

if last_char_steg in b64chars and last_char_row in b64chars:
offset = abs(b64chars.index(last_char_steg) - b64chars.index(last_char_row))
else:
offset = 0

equalnum = stegb64.count('=')

if equalnum:
bin_str += bin(offset)[2:].zfill(equalnum * 2)

# 生成 flag 字符串
flag = ''.join([chr(int(bin_str[i:i + 8], 2)) for i in range(0, len(bin_str), 8) if len(bin_str[i:i + 8]) == 8])

print(flag) # 打印最终结果

多次base64:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import base64

def decode(f):
n = 0;
while True:
try:
f = base64.b64decode(f)
n += 1
except:
print('[+]Base64共decode了{0}次,最终解码结果如下:'.format(n))
print(str(f,'utf-8'))
break

if __name__ == '__main__':
f = open('./base64.txt','r').read()
decode(f)

base64换表:

1
2
3
4
5
6
7
8
9
import base64
import string

encode = "5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8==" #密文

string1 = "qvEJAfHmUYjBac+u8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD" #自定义base加密表
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print(base64.b64decode(encode.translate(str.maketrans(string1,string2))))

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
换表加密(如果给的是换表解密后的结果,用加密回逆):
# coding:utf-8
s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234{}789+/'
def My_base64_encode():
inputs = b'\x9e\x9b\x9c\xb5\xfe\x70\xd3\x0f\xb2\xd1\x4f\x9c\x02\x7f\xab\xde\x59\x65\x63\xe7\x40\x9d\xcd\xfa\x04'
# 将字符串转化为2进制
bin_str = []
for i in inputs:
x = str(bin(i)).replace('0b', '')
bin_str.append('{:0>8}'.format(x))
# print(bin_str)
# 输出的字符串
outputs = ""
# 不够三倍数,需补齐的次数
nums = 0
while bin_str:
# 每次取三个字符的二进制
temp_list = bin_str[:3]
if(len(temp_list) != 3):
nums = 3 - len(temp_list)
while len(temp_list) < 3:
temp_list += ['0' * 8]
temp_str = "".join(temp_list)
# print(temp_str)
# 将三个8字节的二进制转换为4个十进制
temp_str_list = []
for i in range(0, 4):
temp_str_list.append(int(temp_str[i*6:(i+1)*6], 2))
# print(temp_str_list)
if nums:
temp_str_list = temp_str_list[0:4 - nums]

for i in temp_str_list:
outputs += s[i]
bin_str = bin_str[3:]
outputs += nums * '='
print("Encrypted String:\n%s " % outputs)
My_base64_encode()

换表在线网站:

http://web.chacuo.net/netbasex

26.escape编码

escape是对字符串(string)进行编码,作用是让它们在所有电脑上可读,其中 ASCII字母、数字、@*/+ ,这几个字符不会被编码。
编码之后的效果是%XX或者%uXXXX这种形式,可能是\也不会被编码吧,也遇到过这种:\134\170\65\143。

27.html加密

特点:以&#开头,例如:

1
&#102;&#108;&#97;&#103;&#37;&#55;&#66;&#99;&#116;&#102;&#95;&#116;&#102;&#99;&#50;&#48;&#49;&#55;&#49;&#55;&#113;&#119;&#101;&#37;&#55;&#68;

通常有3种:

  • base

  • MD5加密 (不可逆,无法解密,但能使用撞库的方法来解,就是在存放密文-明文的库中寻找和已知密文对应的密文-明文对,从而找出明文。)

  • sha1加密

解密网站:https://convertstring.com/zh_CN/EncodeDecode/HtmlDecode

28.银河字母加密

对照银河字母表:

5yvGWD.png

29.ROT编码

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

工具:

30.与佛论禅/与熊论道/核心价值观/花朵

与佛论禅: 佛曰: ——————— 解密网站:与佛论禅 (keyfc.net)

与熊论道: 熊曰: ————————— 解密网站:与熊论道/熊曰加密 - PcMoe!

核心价值观: ———– 解密网站:CTF在线工具-在线核心价值观编码|核心价值观编码算法|Core Values Encoder (hiencode.com)

花朵: ❀❀❀ 解密网站:文本加密为花朵符号,可自设密码|文本在线加密解密工具 (qqxiuzi.cn)

31.Unicode编码:

4种格式:

DaaueH.png

工具:

32.aaencode(颜文字)

aaencode:将JS代码转换成常用的网络表情。直接在控制台就能解密。

例:

1
ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]

加密网站:http://utf-8.jp/public/aaencode.html

同样存在于Unicode中,参考:https://cloud.tencent.com/developer/article/1602547

33.jjencode

将JS代码转换成只有符号的字符串。jjencode可以用自定义的符号对代码进行混淆,并且实际上的效果和加密的效果是一样的,因为如果不知道自定义的符号 key,过程是不可逆的。

工具:

34.xor加密

若得到两串字符串,可以放入010edit获取二进制,进行异或再变换为十六进制,进而变换为ASCII

例题:异性相吸 https://blog.csdn.net/zz_Caleb/article/details/88587238

35.64进制加密

64进制用的是base64的索引表进行的加密:

5yv3FK.png

36.js编码

利用![]{}+组成的编码,可直接控制台解码

1
[][(![]+[])[!![]+!![]+!![]]+({}+[])[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]][({}+[])[!![]+!![]+!![]+!![]+!![]]+({}+[])[+!![]]+({}[[]]+[])[+!![]]+(![]+[])[!![]+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]]+({}[[]]+[])[+[]]+({}+[])[!![]+!![]+!![]+!![]+!![]]+(!![]+[])[+[]]+({}+[])[+!![]]+(!![]+[])[]

37.幂数加密

二进制数除了0和1的表示方法外,在由二进制转换成十进制的时候,还可以表示成2的N次方的形式。例如:

15=2^0+2^1+2^2+2^3

并且我们发现,任意的十进制数都可以用2^n或2^n+2^m+……的形式表示出来,可以表示的单元数由使用的max n来决定。

可表示的单元数=2^(n+1)-1

二进制幂数加密法就是应用这个原理,由于英文字母只有26个字母,由公式可知,只要2的0、1、2、3、4次幂就可以表示31个单元。通过用二进制幂数表示字母序号数来加密。例如

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
明文: d o n o t p u l l a l l y o u r e g g s i n o n e b a s k e t

字母序号:4 15 14 15 20 16 21 12 12 1 12 12 25 15 21 18 5 7 7 19 9 14 15 14 5 2 1 19 11 5 20

由于4=2^2 所以D加密过之后是215=2^0+2^1+2^2+2^3所以O加密后是0123。同理得到上述明文的加密后的密文

密文:2 0123/123 0123 24/4 024 23 23/0 23 23/034 0123 024 14/02 012 012 014/03 123 /0123 123 02/1 0 014 013 02 24
其中空格表示字母的间隔,/表示单词的间隔。

字母加密结果对照:
A 1-------0

B 2-------1

C 3------01

D 4------2

E 5------02

F 6------12

G 7------012

H 8------3

I 9------03

J 10-----13

K 11-----013

L 12-----23

M 13----023

N 14----123

O 15----0123

P 16----4

Q 17----04

R 18----14

S 19-----014

T 20-----24

U 21-----024

V 22-----124

W 23-----0124

X 24-----34

Y 25-----034

Z 26-----134

38.打印字符编码(也叫URL编码)

特点:=开头和连接

1
=E5=9C=A8=E6=89=80=E6=9C=89=E9=82=AE=E4=BB=B6=E5=A4=84=E7=90=86=E7=9A=84=E5=90=84=E5=BC=8F=E5=90=84=E6=A0=B7=E7=9A=84=E7=BC=96=E7=A0=81=E4=B8

工具:

39.Rabbit加密

形式类似base64

工具:

40.MD5加密

工具:

41.埃特巴什码 - Atbash Cipher

埃特巴什码(Atbash Cipher)是一个系统:最后一个字母代表第一个字母,倒数第二个字母代表第二个字母。

明文: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

密文:Z Y X W V U T S R Q P O N M L K J I H G F E D C B A

工具:

42.base64编码表

如得到一串类似base编码,却不能base解码,可尝试base编码表替换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
s= '3EP/3VNFFmNEAnlHD5dCMmVHD5ad9uG'                          //密文
t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' //base编码表
l=""
for i in s:
l += t[(t.index(i)-30)%64]

if len(l)%4!=0:
l=l+"="*(4-(len(l)%4))
print(l)


##ZmxhZ3vnnIvmiJHplb/kuI3plb8/fQo=
再次进行base64解码,得到:
flag{看我长不长?}

码表替换:若编码里缺少0-9或其他,并且多出来了一些base64之外的,如)!@#$%^&*(等等,先加这些替换掉再base64解码。

1
2
3
4
5
6
7
8
import base64
m = 'VGhlIGdlb@xvZ#kgb@YgdGhlIEVhcnRoJ#Mgc#VyZmFjZSBpcyBkb@!pbmF)ZWQgYnkgdGhlIHBhcnRpY#VsYXIgcHJvcGVydGllcyBvZiB#YXRlci$gUHJlc@VudCBvbiBFYXJ)aCBpbiBzb@xpZCwgbGlxdWlkLCBhbmQgZ@FzZW(!cyBzdGF)ZXMsIHdhdGVyIGlzIGV$Y@VwdGlvbmFsbHkgcmVhY#RpdmUuIEl)IGRpc#NvbHZlcywgdHJhbnNwb#J)cywgYW%kIHByZWNpcGl)YXRlcyBtYW%%IGNoZW!pY@FsIGNvbXBvdW%kcyBhbmQgaXMgY@(uc#RhbnRseSBtb@RpZnlpbmcgdGhlIGZhY@Ugb@YgdGhlIEVhcnRoLiBFdmFwb#JhdGVkIGZyb@)gdGhlIG(jZWFucywgd@F)ZXIgdmFwb#IgZm(ybXMgY@xvdWRzLCBzb@!lIG(mIHdoaWNoIGFyZSB)cmFuc#BvcnRlZCBieSB#aW%kIG(@ZXIgdGhlIGNvbnRpbmVudHMuIENvbmRlbnNhdGlvbiBmcm(tIHRoZSBjbG(!ZHMgcHJvdmlkZXMgdGhlIGVzc@VudGlhbCBhZ@VudCBvZiBjb@%)aW%lbnRhbCBlcm(zaW(uOiByYWluLlRoZSByYXRlIGF)IHdoaWNoIGEgbW(sZWN!bGUgb@Ygd@F)ZXIgcGFzc@VzIHRob#VnaCB)aGUgY#ljbGUgaXMgbm()IHJhbmRvbQpBbmQgdGhlIGZsYWcgaXM^IENURnsyMi!RV)VSVFlVSU*tUExLSkhHRkRTLUFaWENWQk%NfQ=='
c = ')!@#$%^&*('
for i in m:
for j in range(10):
if i == c[j]:
m = m.replace(i,str(j))
print(base64.b64decode(m))

43.十二星座加密

1
2
3
4
5
6
7
8
9
10
11
12
白羊座 ♈ U+2648321日 - 420日)
金牛座 ♉ U+2649421日 - 521日)
双子座 ♊ U+264A(522日 - 621日)
巨蟹座 ♋ U+264B(622日 - 722日)
狮子座 ♌ U+264C(723日 - 822日)
处女座 ♍ U+264D(823日 - 922日)
天秤座 ♎ U+264E(923日 - 1023日)
天蝎座 ♏ U+264F(1024日 - 1122日)
射手座 ♐ U+26501123日 - 1221日)
摩羯座 ♑ U+26511222日 - 120日)
水瓶座 ♒ U+2652121日 - 219日)
双鱼座 ♓ U+2653220日 - 320日)

分别对应0123456789ab

44.键盘移动

左移或右移,

1
2
vtu[ypslg;sh}lrunpstf[sddeptf\       //密文
cryptoakflag{keyboardpassword} //明文,由密文对应键盘左移一位得到。

45.AES+emoji加密

描述:带密钥的表情包加密:

工具:

​ 解密网站:

46.零宽字符加密

描述:打开txt文本发现只有少量内容,但下标显示有很多列,即有很多零宽字符看不到。

工具:

47.仓颉编码

描述:多个字母对应一个汉字,重点是中文。

YDHML_QKA_PDK_HVD_NAHI_OQ_K_GR

以下划线分割,每一部分对应一个汉字。

48.八卦编码

描述:震坤艮 震艮震 坤巽坤 坤巽震 震巽兑 震艮震 震离艮 震离艮

八卦对应二进制表:

1
2
3
4
5
6
7
8
9
10
11
12
c =  "震坤艮 震艮震 坤巽坤 坤巽震 震巽兑 震艮震 震离艮 震离艮"
table={'乾':'111','坤':'000','震':'001','兑':'011','离':'101','艮':'100','巽':'110'}
t = ""
for i in c:
if i==' ':
t+=" "
else:
t += table[i]
flag=""
for i in t.split(' '):
flag+=chr(int(i,2))
print('NSSCTF{%s}'%(flag))

49.气泡编码(bubble)

在线解码:CTF在线工具-在线BubbleBabble编码|Bubble编码|BubbleBabble解码|BubbleBabble编码原理|BubbleBabble编码算法 (hiencode.com)

50.关键字密码

题目涉及keyword字样。

在线解码:http://www.hiencode.com/keyword.html

51.Serpent

法语是蛇,与蛇有关的解密。

在线解码:http://serpent.online-domain-tools.com/

52.音符加密

形如:♭♯♪‖¶♬♭♭♪♭‖‖♭♭♬‖♫♪‖♩♬‖♬♬♭♭♫‖♩♫‖♬♪♭♭♭‖¶∮‖‖‖‖♩♬‖♬♪‖♩♫♭♭♭♭♭§‖♩♩♭♭♫♭♭♭‖♬♭‖¶§♭♭♯‖♫∮‖♬¶‖¶∮‖♬♫‖♫♬‖♫♫§=

在线解码:https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=yinyue

53.敲击码

敲击码(由两个数字定位一个字母,使用“/”进行字母间的分隔。)

密文:….. ../… ./… ./… ../ 5 2 /3 1/3 1/3 2 / 明文: W L L M

对照表:

pAQo8pV.png

54.中文电码

汉字和电码的抓换: 人对应0086

在线解码:http://code.mcdvisa.com/

55.五笔编码

同上: 如:也对应bnhn

https://www.qqxiuzi.cn/bianma/wubi.php

56.logo编程

在线解码:https://www.calormen.com/jslogo/

57.提瓦特文字

原神启动!:

pA8jv2F.png

58.排列组合

1
2
3
4
5
import itertools
s = []
#s是一个包含n个元素的列表
#取出所有7个元素的排列组合
combinations_list = list(itertools.combinations(s, 7))