编码:将原始信息转为编码信息进行传输,解决一些特殊字符、不可见字符的传输问题
解码:将编码信息转为原始信息
https://www.iamwawa.cn/
1、hex
将信息转为十六进制
s="flag"
s1 = s.encode().hex() #编码,中文字符的解码编码都要加utf-8
s2 = int(s1,16) #转为十进制
s3 = ord('a') #单字符直接使用ord()
s4 = hex(s2) #十进制转16进制,并会在前面自动补0x,s4[2:]可以去掉0x,如果是long,末尾加L,可使用[2:-1]
print(s1,s2,s3,s4) #666c6167 1718378855 97 0x666c6167
f = "你好!"
f1 = f.encode("utf-8").hex() #中文字符编码
def dec(s):
if len(s)%2 != 0: #decode解码时必须保证hex编码的字符串是偶数,如果是奇数,要补0
s = "0"+s
return bytes.fromhex(s).decode() #使用fromhex()方法将十六进制字符串转换为字节串,然后使用decode()方法将字节串解码为原始字符串
string = "576f726c6421"
result = dec(string)
print(result)
from Crypto.Util.number import long_to_bytes,bytes_to_long #将长整型转换为字节串的函数
flag = b"flag{123}"
print(bytes_to_long(flag))
print(long_to_bytes(bytes_to_long(flag)))
2、urlencode
用于浏览器和网站之间的数据交换,在特殊字符hex的基础上,每个字符前加一个“%”,遇到%时,连带%的三个字符对应明文的一个字符
https://www.iamwawa.cn/urldecode.html
flag = b"flag{123!@#$}"
import urllib
f2 = urllib.parse.quote(flag)
print(f2) #flag%7B123%21%40%23%24%7D
f3 = urllib.parse.unquote(f2)
print(f3) #flag{123!@#$}
3、morsecode(摩斯电码)
'.‘和’-‘组成,使用’/'分隔
https://www.iamwawa.cn/morse.html
下面是莫斯电码(Morse code)的对照表:
字母:
A: .- N: -. 0: -----
B: -... O: --- 1: .----
C: -.-. P: .--. 2: ..---
D: -.. Q: --.- 3: ...--
E: . R: .-. 4: ....-
F: ..-. S: ... 5: .....
G: --. T: - 6: -....
H: .... U: ..- 7: --...
I: .. V: ...- 8: ---..
J: .--- W: .-- 9: ----.
K: -.- X: -..-
L: .-.. Y: -.--
M: -- Z: --..
标点符号和特殊字符:
.: .-.-.- ,: --..-- ?: ..--..
': .----. !: -.-.-- /: -..-.
(: -.--. ): -.--.- &: .-...
": .-..-. ;: -.-.-. =: -...-
+: .-.-. -: -....- _: ..--.-
$: ...-..- @: .--.-. space: /
[: -.--.-
]: -.--.-
morse_code_dict = {
'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': '--..',
'0': '-----', '1': '.----', '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....',
'7': '--...', '8': '---..', '9': '----.',
'.': '.-.-.-', ',': '--..--', '?': '..--..', '/':'-..-.', '!': '-.-.--', '@': '.--.-.', '(':'-.--.',
')': '-.--.-', '&':'.-...', ';': '-.-.-.', '=': '-...-', '+': '.-.-.', '-': '-....-', '_': '..--.-',
'$': '...-..-', '@':'.--.-.', '[': '-.--.-', ']': '-.--.-'
}
#解码
def decode_morse_code(morse_code):
morse_code_dict = {
'.-': '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', '.----': '1', '..---': '2', '...--': '3', '....-': '4',
'.....': '5', '-....': '6', '--...': '7', '---..': '8', '----.': '9',
'-----': '0', '/': ' '
}
words = morse_code.split(' / ')
decoded_text = ''
for word in words:
letters = word.split(' ')
for letter in letters:
if letter in morse_code_dict:
decoded_text += morse_code_dict[letter]
decoded_text += ' '
return decoded_text.strip()
# return decoded_text
# morse_code = "- .... . / .-- --- .-. -. .. -. --. / - --- / -.-. --- -- .--. .. .-. . / .- -. -.. / .. ... / -... .-. --- .-- -. / .. ... / - --- / .- / -.-. .- -. / --- ..-. / - .... . / .-- .. -.. . / - --- / -.-. --- -- .--. .. .-. ."
morse_code = "-- --- .-. ... . -.-. --- -.. . .. ... ... --- .. -. - . .-. . ... - .. -. --."
decoded_text = decode_morse_code(morse_code)
print(decoded_text.lower())
4、jsfuck
由“()+[]!”组成的编码
5、uuencode
二进制文件转为可见字符文本的文件,将连续3字节扩展为4字节,取值从32(空白)到95(底线),没有小写字母
https://www.qqxiuzi.cn/bianma/uuencode.php
6、base家族:base16、base32、base64
将特殊字符和不可见字符转为常见字符
base64:a-z,A-Z,0-9,+,/,=
base32:A-Z,2-7,=
base16:A-F,0-9,= base64.b16encode(“flag”).lower() == “flag”.encode().hex()
判断:最后有没有=,“=”用于补位
https://www.qqxiuzi.cn/bianma/base64.htm
import base64
print(base64.b32encode(flag))
参考书目:FlappyPig-CTF特训营:技术详解、解题方法与竞赛技巧