MISC EN/DECode

Fc04dB Lv4

CTF—MISC

[!IMPORTANT]

参考Lunatic师傅的文章:https://goodlunatic.github.io/posts/1ad9200

⚠👆👆👆👆👆⚠

加密/编码

base

1
2
3
4
5
6
7
8
9
10
11
12
base16                       flag         666C6167
base32[A-Z2-7] flag MZWGCZY=
base36 flag 727432
base58 flag 3cr9Ae
base64 flag Zmxh
base85 flag Ao(mg
base91 flag @iH<Z
base92 flag F#S<I
base100 flag 👝👣👘👞
base1024 flag
base2048 flag ڥڊװ
base65535 flag ꍦ鱡

base64还可以换表编码

比如24省赛预赛的realsignin

image-20241102130924210

套娃base,比如省赛的签到题:

image-20241102140326648

可以使用工具BaseCrack爆破套娃的base

image-20241107162739296

再进一步爆破就好了

MD5加密

1
2
3
4
5
6
明文:admin 
32位小写21232f297a57a5a743894a0e4a801fc3
32位大写21232F297A57A5A743894A0E4A801FC3
16位小写7a57a5a743894a0e
16位大写7A57A5A743894A0E
Tips:十六位其实就是取32位的8-24位

MD5 加密后的密文应该是 纯数字+纯字符

可能的爆破:md5在线解密破解,md5解密加密 (cmd5.com)

emoji-aes编码:

密文由一大串emoji表情组成,解密需要密钥,例如

已知key:th1sisKey,直接使用在线网站解密即可emoji-aes (aghorler.github.io)

1
🙃💵🌿🎤🚪🌏🐎🥋🚫😆😍🔬👣🖐🌏😇🥋😇😊🍎🏹👌🌊☃🦓🌏🐅🥋🚨📮🐍🎈📮📂✅🐍⏩⌨🎈😍🌊😇🐍☺💧🥋🍌🎤🍍😇👁🦓😇🍍📮📂🎅😡🍵✖✉🏹⌨🍵🎤😆🍵🚹🏹🍎🚨ℹ☃👑🎤🚪💵😎😀😎🔬💵🦓🏹👉🦓✖😀🐘🔪⌨🎈🥋👌🍌🚹😂✉🍎🍌🏎👌🏹💵👌👁🎃🗒

词频分析:

一堆文字,看着什么编码都不像的,可能是词频分析,用在线网站跑https://quipqiup.com/

字频分析:

用随波逐流直接分析

摩斯电码:

1
2
3
#第一种情况,只有.-或者只有01
#第二种情况,加入/或者空格来替换换行符
.--/./.-../-.-./---/--/./-/---/-./-.-/-.-./-/..-./--..--/-/...././.--./.-/.../.../.--/---/.-./-../../.../.----/-..../-.../-.--/-/./.../.-./.-/-./-../---/--/.-../-.--/--././-././.-./.-/-/./-../--..-

vigenere(维吉尼亚)密码:

1.给了密文和Key

直接拉到cyberchef中解密即可

2.给了密文,没给密钥,但是知道目标明文的格式

先用B神的脚本爆破出Key,然后再把这个Key放到cyberchef中解密

3.根据对照表,手搓密钥的前几位

维吉尼亚加密/解密 - Bugku CTF平台

一个爆破脚本,根据前20个字符自行判断(并不万能)

QQ_1730976929401

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
'''维吉尼亚破解'''
import numpy as np
import wordninja


def alpha(cipher): # 预处理,去掉空格以及回车
c = ''
for i in range(len(cipher)):
if (cipher[i].isalpha()):
c += cipher[i]
return c


def count_IC(cipher): # 给定字符串计算其重合指数
count = [0 for i in range(26)]
L = len(cipher)
IC = 0.0
for i in range(len(cipher)):
if (cipher[i].isupper()):
count[ord(cipher[i]) - ord('A')] += 1
elif (cipher[i].islower()):
count[ord(cipher[i]) - ord('a')] += 1
for i in range(26):
IC += (count[i] * (count[i] - 1)) / (L * (L - 1))
return IC


def count_key_len(cipher, key_len): # 对字符串按输入个数进行分组,计算每一组的IC值返回平均值
N = ['' for i in range(key_len)]
IC = [0 for i in range(key_len)]
for i in range(len(cipher)):
m = i % key_len
N[m] += cipher[i]
for i in range(key_len):
IC[i] = count_IC(N[i])
# print(IC)
print("长度为%d时,平均重合指数为%.5f" % (key_len, np.mean(IC)))
return np.mean(IC)


def length(cipher): # 遍历确定最有可能的密钥长度返回密钥长度
key_len = 0
mins = 100
aver = 0.0
for i in range(1, 10):
k = count_key_len(cipher, i)
if (abs(k - 0.065) < mins):
mins = abs(k - 0.065)
key_len = i
aver = k
print("密钥长度为%d,此时重合指数每组的平均值为%.5f" % (key_len, aver))
return key_len


def count_MIC(c1, c2, n): # n=k1-k2为偏移量,计算c1,c2互重合指数MIC
count_1 = [0 for i in range(26)]
count_2 = [0 for i in range(26)]
L_1 = len(c1)
L_2 = len(c2)
MIC = 0
for i in range(L_1):
if (c1[i].isupper()):
count_1[ord(c1[i]) - ord('A')] += 1
elif (c1[i].islower()):
count_1[ord(c1[i]) - ord('a')] += 1
for i in range(L_2):
if (c2[i].isupper()):
count_2[(ord(c2[i]) - ord('A') + n + 26) % 26] += 1
elif (c2[i].islower()):
count_2[(ord(c2[i]) - ord('a') + n + 26) % 26] += 1
for i in range(26):
MIC += count_1[i] * count_2[i] / (L_1 * L_2)
return MIC


def count_n(c1, c2): # 确定两个子串最优的相对偏移量n=k1-k2
n = 0
mins = 100
k = [0.0 for i in range(26)]
for i in range(26):
k[i] = count_MIC(c1, c2, i)
# print(i,k[i])
if (abs(k[i] - 0.065) < mins):
mins = abs(k[i] - 0.065)
n = i
return n


def group_k(cipher, key_len): # 完成分组操作并计算每一组与第一组的最优相对偏移量并返回
N = ['' for i in range(key_len)]
MIC = [0 for i in range(key_len)]
s = [0 for i in range(key_len)]
for i in range(len(cipher)): # 对密文进行分组
m = i % key_len
N[m] += cipher[i]
for i in range(1, key_len): # 计算与第一组之间的相对偏移量
s[i] = count_n(N[0], N[i]) # s[i] = k1-k(i+1)
MIC[i] = count_MIC(N[0], N[i], s[i]) # MIC[i] = MIC(1,i+1)
print("第1组和第%d组之间偏移为%d时,互重合指数为%.5f" % (i + 1, s[i], MIC[i]))
return s


def miyao(key_len, s, k): # k为第一个子串的移位,输出密钥并返回密钥所有字母的下标
mi = ['' for i in range(key_len)]
for i in range(key_len):
s[i] = -s[i] + k # k2=k1-n
mi[i] = chr((s[i] + 26) % 26 + ord('a'))
print("第一个偏移量为%d,密钥为%s时" % (k, mi))
return s


def the_end(cipher, key_len, s): # 输入密文密钥返回明文结果
plain = ''
i = 0
while (i < len(cipher)):
for j in range(key_len):
if (cipher[i].isupper()):
plain += chr((ord(cipher[i]) - ord('A') - s[j] + 26) % 26 + ord('A'))
else:
plain += chr((ord(cipher[i]) - ord('a') - s[j] + 26) % 26 + ord('a'))
i += 1
if (i == len(cipher)):
break
# print(plain)
return plain


if __name__ == "__main__":
fp = open("密文.txt", "r")
cipher = ''
for i in fp.readlines():
cipher = cipher + i
fp.close()
cipher = alpha(cipher)
key_len = length(cipher)
s = group_k(cipher, key_len)
m = s.copy()
for k in range(26):
s = m.copy()
s = miyao(key_len, s, k)
plain = the_end(cipher, key_len, s)
print(plain[0:20]) # 输出部分明文确定偏移量k1
print("参考输出,请输入第一个子串的偏移量:", end='')
k = int(input())
m = miyao(key_len, m, k)
plain = the_end(cipher, key_len, m)

'''对英文文本进行分词'''
word = wordninja.split(plain)
plain = ''
for i in range(len(word)):
plain += word[i]
plain += ' '
print("明文为\n" + plain)

希尔密码:

解密网站:http://www.metools.info/code/hillcipher243.html

已知密文和密钥,并且密钥(key)是一个网址,如http://www.verymuch.net

已知密文和密钥,并且密钥是四个数字

1
2
密文:ymyvzjtxswwktetpyvpfmvcdgywktetpyvpfuedfnzdjsiujvpwktetpyvnzdjpfkjssvacdgywktetpyvnzdjqtincduedfpfkjssne
密钥:3 4 19 11

Rabbi密码:

已知密文和密钥,密文有点像base64编码的(可能有+号)

QQ_1730978281433

云隐密码:

特征是:密文只由01248组成

用随波逐流或者CTFD中的脚本直接跑

曼彻斯特与差分曼彻斯特编码:

Online Manchester decoder/encoder ‐ eleif.net

  1. 曼彻斯特码:从高到低表示 1,从低到高表示 0
  2. 差分曼彻斯特码:在每个时钟周期的起始处(虚线处)有跳变表示 0;无跳变则表示1。

imgs/image-20240529203318823.png

社会主义核心价值观密码:

解密网址:http://www.hiencode.com/cvencode.html

公正民主公正文明公正和谐:abc

outguess解密图片:

在kali中下载outguess:outguess -k ‘abc’ -r mmm.jpg -t flag.txt

outguess -k ‘key’ -r 加密后的图片.jpg -t 明文.txt

盲文:

使用https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=mangwen在线翻译

文本加密为音乐符号:

Tips:这里要注意,加密的密文一定是以=结尾的,有时候需要自己把=加上

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

直接用在线网站解密:https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=yinyue

敲击码:

特征特点:敲击码是基于5×5方格波利比奥斯方阵来实现的,不同点是是用K字母被整合到C中,因此密文的特征为1-5的两位一组的数字,编码的范围是A-Z字母字符集,字母不区分大小写。

img

CTF在线工具-在线敲击码|敲击码编码|敲击码算法|tap code (hiencode.com)

Polybius密码(详见CTFwiki)

类似于11,22,11,24这样的

去逗号改成空格,拉入随波逐流直接解密

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

对称加密

DES加密算法
AES加密算法

imgs/aes1.png

AES-ECB(不需要IV)

CyberChef解密AES-ECB时需要将IV设置为\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00

如果 key 不足16字节可以尝试在后面补0

AES-CBC(需要填写IV)

密钥不足16字节时需要padding补齐16字节

可以使用能自动补齐的在线网站解密 https://www.sojson.com/encrypt_aes.html

埃特巴什码(Atbash)

类似于:(+w)v&LdG_FhgKhdFfhgahJfKcgcKdc_eeIJ_gFN

拉入厨子直接解密

1
flag{ ==> Atbash加密 ==> UOZT{

DNA编码

1
AATTCAACAACATGCTGC

解密脚本:

1
2
3
4
5
6
7
8
table = 'ACGT'
dic = {'AAA': 'a', 'AAC': 'b', 'AAG': 'c',
'AAT': 'd', 'ACA': 'e', 'ACC': 'f', 'ACG': 'g', 'ACT': 'h', 'AGA': 'i', 'AGC': 'j', 'AGG': 'k', 'AGT': 'l', 'ATA': 'm', 'ATC': 'n', 'ATG': 'o', 'ATT': 'p', 'CAA': 'q', 'CAC': 'r', 'CAG': 's', 'CAT': 't', 'CCA': 'u', 'CCC': 'v', 'CCG': 'w', 'CCT': 'x', 'CGA': 'y', 'CGC': 'z', 'CGG': 'A', 'CGT': 'B', 'CTA': 'C', 'CTC': 'D', 'CTG': 'E', 'CTT': 'F', 'GAA': 'G', 'GAC': 'H', 'GAG': 'I', 'GAT': 'J', 'GCA': 'K', 'GCC': 'L', 'GCG': 'M', 'GCT': 'N', 'GGA': 'O', 'GGC': 'P', 'GGG': 'Q', 'GGT': 'R', 'GTA': 'S', 'GTC': 'T', 'GTG': 'U', 'GTT': 'V', 'TAA': 'W', 'TAC': 'X', 'TAG': 'Y', 'TAT': 'Z', 'TCA': '1', 'TCC': '2', 'TCG': '3', 'TCT': '4', 'TGA': '5', 'TGC': '6', 'TGG': '7', 'TGT': '8', 'TTA': '9', 'TTC': '0', 'TTG': ' '}
cipher = 'TCATCAACAAAT'
plain = ''
for i in range(0, len(cipher), 3):
plain += dic[cipher[i:i+3]]
print(plain)

Decabit编码

正常的 Decabit编码 是十个字符一组的,如果不是十个一组,就很可能不是 Decabit编码

+-+-++–+- ++—+-++- -+–++-++- +–++-++– –+++++— ++-++—+- +++-+-+— +-+-+—++ —+++-++- -+–++-++- -+–+++-+- -+–++-++- -+–++-++- ++-+-+-+– -+–+++-+- ++-++—+- -++++—+- -+–++-++- ++-+-+-+– +-+++—+- +++-++—- —+++-++- +-+-+—++ ++-+-+-+– +-+-+–++- ++–+–++- -++++—+- +—+++-+- ++-+-+-+– -++++—+- -+–+++-+- +–+-+-++- +++-+-+— +-+++—+- -+–+-+++- -+–++-++- —+++-++- ++++—-+- -++++—+- -+–+++-+- -+–++-++- —-+++++-

直接使用 在线网站 解密即可

如果不是Decabit编码,可以试试看把+-分别用01替换

仿射密码

有两个key,key-a为必须是(1,3,5,7,9,11,15,17,19,21,23,25)中的一个,key-b是0~25的数字

可以使用在线网站CTF在线工具-在线仿射密码加密|在线仿射密码解密|仿射密码算法|Affine Cipher (hiencode.com) 或者随波逐流解密

1
2
3
gezx{j13p5oznp_1t_z_900y_k3z771h_k001}
key-a=17 key-b=77
flag{w13e5hake_1s_a_900d_t3a771c_t001}

BrainFuck编码

可以直接使用在线网站解码Brainfuck/OoK加密解密 - Bugku CTF平台 ,但是flag可能会藏在内存中然后被删去导致无法输出flag,因此可以用下面这个代码输出之前放在内存中的flag

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
67
68
69
70
71
72
73
74
75
#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
char s[30000]={0};
char code[2000];
int len = 0;
int stack[10000];
int stack_len=0;
int main()
{
char c;
int i=0,j,k,x=0;
FILE* f;
char* p=s+10000;
f=fopen("./bf.txt","r");
while(fread(&code[len],1,1,f)==1)
{
len++;
}
setbuf(stdout,NULL);
while(i<len) {
switch(code[i]) {
case '+':
(*p)++;
break;
case '-':
(*p)--;
break;
case '>':
p++;
break;
case '<':
p--;
break;
case '.':
putchar((int)(*p));
break;
case ',':
*p=getchar();
break;
case '[':
if(*p) {
stack[stack_len++]=i;
} else {
for(k=i,j=0;k<len;k++) {
code[k]=='['&&j++;
code[k]==']'&&j--;
if(j==0)break;
}
if(j==0)
i=k;
else {
fprintf(stderr,"%s:%dn",__FILE__,__LINE__);
return 3;
}
}
break;
case ']':
i=stack[stack_len-- - 1]-1;
break;
default:
break;
}
i++;
x++;
}
for(int i = 0; i < stack_len; i++) {
printf("%c", stack[i]);
}
printf("\n");
for(int i = 0; i < 30000; i++) {
printf("%c", s[i]);
}
return 0;
}

Gronsfeld密码

CTF在线工具-在线Gronsfeld密码加密|在线Gronsfeld密码解密|Gronsfeld密码算法|Gronsfeld Cipher (hiencode.com)

1
2
3
4
5
6
7
8
# 解密脚本
from pycipher import Gronsfeld

cipher = 'TGLBOMSJNSRAJAZDEZXGHSJNZWHG'
key = [1,50,61,8,9,20,63,41]
secret = Gronsfeld(key).decipher(cipher)

print(secret)

UUencode编码

看起来有点像base85

Uuencode编码(加密);Uuencode解码(解密)|文字加密和解密工具 (qqxiuzi.cn)

image-20241107225928814

AAencode编码

XXencode编码

随波逐流直接解密即可

无字天书(whitespace)或者snow隐写

一个文件打开都是空白字符

可以使用在线网站解密:https://vii5ard.github.io/whitespace/ 复制进去直接run即可

snow隐写,到snowdos32工具目录下运行 SNOW.EXE -C -p password flag.txt 命令即可

中文电报(中文电码)

类似于下面这种四位数一组的编码,直接在线网站解码即可https://dianma.bmcx.com/

5337 5337 2448 2448 0001 2448 0001 2161 1721 1869 6671 0008 3296 4430 0001 3945 0260 3945 1869 4574 5337 0344 2448 0037 5337 5337 0260 0668 5337 6671 0008 3296 1869 6671 0008 3296 1869 2161 1721

Quote-Printable编码

类似于下面这样的编码,直接使用 在线网站 解密即可

flag{ichunqiu_=E6=8A=80=E6=9C=AF=E6=9C=89=E6=B8=A9=E5=BA=A6}

flag{ichunqiu_技术有温度}

Unicode编码

这个编码有很多种格式,比如+U、\u、\x、&#啥的

Unicode code converter (r12a.github.io)

中文ascii码

1
27880 30693 25915 21892 38450 23454 39564 23460 21457 36865 112 108 98 99 116 102 33719 21462 21069 27573 102 108 97 103 20851 27880 79 110 101 45 70 111 120 23433 20840 22242 38431 22238 22797 112 108 98 99 116 102 33719 21462 21518 27573 102 108 97 103

加上&#和分号,直接 CyberChef 或者 在线网站 解密即可

培根密码

由 a、b 或者 A、B 或者 0、1 组成的密文,密文中只有两种字符,随波逐流一把梭

锟斤拷

这个东西的成因是 Unicode 的替换字符(Replacement Character,�)于 UTF-8 编码下的结果 EF BF BD 重复,在 GBK 编码中被解释为汉字 “锟斤拷”(EF BF BD EF BF BD)

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

a = input('请选择你的功能(1、加密 2、解密):')
if a == "1":
s = input('请输入你要加密的话:')
utf = s.encode('utf')
gbk = s.encode('utf').decode('gbk', errors='ignore')
if len(s)%2 == 1:
gbk = gbk + "�"
print(gbk)
os.system("pause")
if a == "2":
s = input('请输入你要解密的话:')
gbk = s.encode('gbk')
utf = s.encode('gbk').decode('utf-8', errors='ignore')
print(utf)
os.system("pause")

棋盘密码

直接使用CaptfEncoder或者随波逐流等工具输入密文和密钥解密即可

ADFGVX密码 默认棋盘:ph0qg64mea1yl2nofdxkr3cvs5zw7bj9uti8 默认密钥:german ADFGX密码 默认棋盘:phqgmeaynofdxkrcvszwbutil 默认密钥:german 波利比奥斯方阵密码 密钥:随机 默认密文字符:ABCDE

福尔摩斯密码

摩斯密码教程(一篇文章学会使用摩斯密码) - 科猫网

利用编程代码画图

  1. LOGO编程语言【例题-[RCTF2019]draw 】 在线编译器:https://www.calormen.com/jslogo/
  2. CFRS编程语言【例题-2024宁波市赛初赛 Misc2】 在线画图网站:https://susam.net/cfrs.html
  • Title: MISC EN/DECode
  • Author: Fc04dB
  • Created at : 2024-11-07 15:56:14
  • Updated at : 2024-11-07 23:37:57
  • Link: https://redefine.ohevan.com/2024/11/07/MISC ENDECode/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
MISC EN/DECode