CTF-加解密及常见编码

内含常用的编码解码在线工具

Posted by BlackDn on April 14, 2020

“长夜无眠,为海祈梦。星海横流,岁月成胧。”

前言

找时间一点点看了各种编码,然后写个总结
少说几百种头嗡嗡大,所以介绍一下常见的
剩下的…遇到了再说吧…

加解密及常见编码

常见编码

网络传输中常用的加密编码

0. ASCII

美国信息交换标准代码,不多说,主要记几个标志性符号

0: 48
A: 65
a: 97

1. Unicode

众所周知 ASCII 码用一个字节表示一个字符,但是表示不了中文(和除了英语的其他语言)于是提出 Unicode,用两个字节表示一个字符。原本的英文字符(ASCII 码)就在高位加 0
包含 UTF-8(以 8 位为一个编码单位的可变长编码),UTF-16(16 位),UTF-32 等

Unicode 编码有以下四种编码方式:(源文本:The)

  1. &#x [Hex]:The
  2. &# [Decimal]:Th&#00101
  3. \U [Hex]:\U0054\U0068\U0065
  4. \U+ [Hex]:\U+0054\U+0068\U+0065

2. Escape 编码/Unescape 解码

Escape 编码:又叫%u 编码,采用 UTF-16BE 模式, Escape 编码/加密,就是字符对应 UTF-16,16 进制表示方式前面加%u
Unescape 解码:去掉”%u”后,将 16 进制字符还原后,由 utf-16 转码到自己目标字符
特点:%xxxx(xxxx 等于 UTF-16 对应十六进制编码)

文本: The
Escape编码:%u0054%u0068%u0065

3. URL 编码

url 编码又叫百分号编码,是统一资源定位(URL)编码方式。除了常用字母数字,url 地址中其它字符通过%xx 编码处理
在 ascii 码的的 16 进制字符前面加%

“\” => %5c (“\”的ascii码是92,92的十六进制是5c)
你好 => %E4%BD%A0%E5%A5%BD

4. base 编码

Base 家族主要有 Base16、Base32、Base64。

base64

对二进制数据以 6 个位(bit)为一组切分,所以分切之前的二进制位数应该是 24 的倍数(即 6,8 的最小公倍数)。如果不足 24 位,则在编码后数据后面添加”=”
特征:由 64 个字符(A-Z,a-z,0-9,+,/)组成,末尾可能会出现 1 或 2 个’=’ 最多有 2 个

数值 字符 数值 字符 数值 字符 数值 字符
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /
  1. 数据编码转为二进制,5 个位为一组,转为十进制
  2. 将十进制转为编码表中对应字符
  3. 不足 24 位,则在编码后数据后面添加”=”,相当于 6 个位
文本:    ILU
ASCII编码:73    76    85
二进制:010010|01    0100|1100    01|010101
十进制:18|20|49|21
Base64编码:SUxV

base32

对二进制数据以 5 个位(bit)为一组进行切分,由于传输数据的单位是字节(即 8 个位),所以分割之前的二进制位数是 40 的倍数(40 是 5 和 8 的最小公倍数)。如果不足 40 位,则在编码后数据补充”=”,一个”=”相当于一个组(5 个位)
特征:密文由 32 个字符(A-Z,2-7)组成,末尾可能会有‘=’,但最多有 6 个

数值 字符 数值 字符 数值 字符 数值 字符
0 A 8 I 16 Q 24 Y
1 B 9 J 17 R 25 Z
2 C 10 K 18 S 26 2
3 D 11 L 19 T 27 3
4 E 12 M 20 U 28 4
5 F 13 N 21 V 29 5
6 G 14 O 22 W 30 6
7 H 15 P 23 X 31 7
填充 =            
  1. 数据编码转为二进制,5 个位为一组,转为十进制
  2. 将十进制转为编码表中对应字符
  3. 若不足 40 的倍数,添加“=”相当于一个组(5 个位),编码后的数据是原先 8/5 倍
文本:    ILU
ASCII编码:73    76    85
二进制:01001|001    01|00110|0    0101|0101
十进制:9|5|6|5|10
Base32编码:JFGDK===

base16

将 ASCII 字符集中可打印的字符(0-9A-F)对应的二进制字节数据进行编码
(base16 编码表其实就是 0-9A-F)
特征:密文由 16 个字符(0-9,A-F)组成

  1. 将数据(根据 ASCII 编码,UTF-8 编码等)转成二进制数,不足 8 比特位高位补 0。然后将所有的二进制全部串起来,4 个位为一组,转化成十进制数
  2. 根据十进制数值找到 Base16 编码表里面对应的字符
  3. 因为 ASCII 码用一个字节表示一个字符,base16 采用 4 位分组。若原数据采用 ASCII 编码,每个字符都被编码为两个字符,数据量变为原来两倍
文本:    ILU
ASCII编码:73    76    85
二进制:0100|1001    0100|1100    0101|0101
十进制:4|9    4|12    5|5
Base16编码:4 9 4 C 5 5

base91

base91 是一种将二进制数据编码为 ASCII 字符的方法,它的开销取决于输入数据
base91 需要 91 个字符来表示用 ASCII 编码的二进制数据。在 94 个可打印的 ASCII 字符(0x21-0x7e)中,省略破折号、反斜杠、撇号来组成 91 个编码表
其编码表和 bash 安装(Linux/Unix,MacOS)安装可见:basE91 encoding

5. UUencode 编码

将二进制文件转换为文本文件

  1. 将数据每三字节为一组(24bit),每组重新以 6bit 分为四组
  2. 将 6bit 的二进制转为十进制,数值在 0-63 间,每个再加上 32,结果在 32-95 间(ASCII 中 32-空格,95-底线),实现二进制到文本符号转换
  3. 最后部分少于三个字节,用零补齐
  4. 每 60 个编码输出(相当于 45 个输入字节)将输出为独立的一行,在每行的开头加上长度字符。除最后一行外,长度字符都应该是 M(M 的 ASCII=77=32+45)
文本:(长度为3)Cat
ASCII编码:67    97    116
二进制:010000|11    0110|0001    01|110100
十进制:(3)16|54|5|52
+32:(35)48|86|37|84
UUencode编码:#0V%T

6. XXencode 编码

和 UUencode 类似,也是把每三字节 24bit 的数据分为四组 6bit,然后转为十进制
每行的长度字符定义也相似
唯一的不同是不+32,而采用自己的编码表
跟 base64 编码表符相比,就是多一个“-” 字符,少一个”/” 字符

数值 字符 数值 字符 数值 字符 数值 字符
0 + 16 E 32 U 48 k
1 - 17 F 33 V 49 l
2 0 18 G 34 W 50 m
3 1 19 H 35 X 51 n
4 2 20 I 36 Y 52 o
5 3 21 J 37 Z 53 p
6 4 22 K 38 a 54 q
7 5 23 L 39 b 55 r
8 6 24 M 40 c 56 s
9 7 25 N 41 d 57 t
10 8 26 O 42 e 58 u
11 9 27 P 43 f 59 v
12 A 28 Q 44 g 60 w
13 B 29 R 45 h 61 x
14 C 30 S 46 i 62 y
15 D 31 T 47 j 63 z
文本:(长度为3)Cat
ASCII编码:67    97    116
二进制:010000|11    0110|0001    01|110100
十进制:(3)16|54|5|52
XXencode编码:1Eq3o

7. MD5

MD5 信息摘要算法,它将源的字符串通过哈希函数转换为特定长度的字符串
MD5 编码具有单向性,即由明文变密文简单,由密文变明文困难。基于这个特性,MD5 可以有效保证信息的完整性,常用于验证数据是否被篡改

  1. MD5 码以 512 位分组来处理输入的信息,且每一分组又被划分为 16 个 32 位子分组,经过了一系列的处理后,算法的输出由 4 个 32 位分组组成,并级联后将生成一个 128 位散列值。
  2. 继续向后取 512 位数据,不够则进行填充。每次的运算都由前一轮的 128 位散列值和当前的 512bit 值进行运算
  3. 因此 MD5 结果值是一段固定长度的数据,无论原始数据是多长或多短,其 MD5 值都是 128bit
  4. 最后按十六进制计算输出,即结果为 0-9a-f

8. SHA

安全散列算法(Secure Hash Algorithm),是一个密码散列函数家族。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法
SHA-0 -> SHA-1 -> SHA -2:包括 SHA-224、SHA-256、SHA-384 和 SHA-512 等
SHA-3:采用另一种方法进行编码,用于替代 SHA-2
SHA 得到摘要的方法和 MD5 思想类似,将数据分组后后面的组利用前面的组进行计算处理,最后一个组得到结果摘要

SHA-1算法
生成160报文摘要
1. 对源数据以512bit为一组进行分组,以abc为例
(a-97, b-98, c-99)得到源数据:01100001 01100010 01100011
2. 不足则补位,使长度对512求余为448,填充的最高位补1,其余补0。随后转为十六进制
初始:01100001 01100010 01100011
补位:01100001 01100010 01100011 100...0(423个0)
十六进制:
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000
3. 附加长度值,在信息摘要后面附加 64 Bits 的信息,用来表示原始信息摘要的长度。这一步执行完毕后信息报文便是 512 Bits 的倍数
abc占3字节,即24位 ,换算为十六进制即为 0x18
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000018
4. 初始化缓存。一个 160 位 MD 缓冲区用以保存中间和最终散列函数的结果。它可以表示为 5 个 32 位的寄存器
5. 一顿操作计算,最后将五个寄存器内容连接得出结果
SHA-256算法
1. 填充附加位
和SHA-1类似,对报文进行填充使报文长度与 448 模 512 同余(长度 = 448 mod 512)
填充比特串的最高位为1,其余位为0,直到长度满足 mod 512=448
2. 附加长度值
和SHA-1基本一致,将填充前的报文位长度填充在低位,共64位,至此数据达到512位
3. 初始化缓存
4. 处理分组计算输出,对所有512位分组处理完毕后,最后一个分组产生的便是256位报文摘要

9. 仿射密码(Affine Cipher)

仿射密码为单表加密的一种,简单来说就是对 26 个字母编号,然后根据映射函数将编号进行变化,然后重新转为字母。
字母和编号的对应很简答,通常是对 a-z 进行 0-25 对应编号,难点在于映射函数,包括加密函数和解密函数

若密钥为k(a, b)
加密函数:y=f(x)=ax+b (mod 26)
解密函数:x=f(y)^-1= a^-1(x-b) (mod 26), 其中a^-1是a在Zm群的乘法逆元
m表示字母数量,此处为26(a-z)。其乘法逆元可有扩展欧几里得算法求解

方便起见这里给出 Z26 上所有与 26 互素元素的乘法逆元

1-1 3-1 5-1 7-1 9-1 11-1 15-1 17-1 19-1 21-1 23-1 25-1
1 9 21 15 3 19 7 23 11 5 17 25
例:密钥k=(7,3), 尝试加解密china

加密:
加密函数:f(x)=7x+3 (mod 26)
china对应2, 7, 8, 13, 0
根据加密函数变为17, 0, 7, 16, 3
再变成对应密文:rahqd

解密:rahqd
根据乘法逆元得到7^-1=15
解密函数:f(y)=15(x-3)
密文对应数字为17, 0, 7, 16, 3,经过解密函数计算得2, 7, 8, 13, 0
转换为明文即为china

文本加密

主要是那些不在网络中用到的加密编码,包含一些古典密码和奇奇怪怪的加密方法

1. 凯撒密码

一种替换加密,明文中的所有字母都在字母表上向后(或向前)偏移固定位数后被替换成密文
比如当偏移量是 3 的时候,所有的字母 A 将被替换成 D,B 变成 E,以此类推

偏移量:1
明文:The quick brown fox jumps over the lazy dog
密文:Uif rvjdl cspxo gpy kvnqt pwfs uif mbaz eph

2. 栅栏密码

栅栏密码(Rail-fence Cipher),把要加密的明文分成 N 个一组,然后把每组的第 1 个字符组合,每组第 2 个字符组合…每组的第 N(最后一个分组可能不足 N 个)个字符组合

2栏栅栏加密
明文:The quick brown fox jumps over the lazy dog
去空格:Th|eq|ui|ck|br|ow|nf|ox|ju|mp|so|ve|rt|he|la|zy|do|g
第一组:Teucbonojmsvrhlzdg
第二组:hqikrwfxupoeteayo
密文:Teucbonojmsvrhlzdghqikrwfxupoeteayo

3. 标准银河字母 SGA

标准银河字母(Standard Galactic Alphabet)出自游戏《指挥官基恩》系列。是系列中使用的书写系统。
百科:标准银河字母
其实也没啥,就是 26 个字母有各自的写法,可以看成一种新的语言
之所以在这里提一下是因为感觉很好玩,这套字母被许多游戏沿用,比如《minecraft》中的附魔台上就有

代码混淆

码混淆(Obfuscated code),亦称花指令,是将计算机程序的代码转换成一种功能等价,但是难于阅读的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。

1. Brainfuck

Brainfuck 是一种极小化的计算机语言

字符集(共八个字符):
> < + – . , [ ]

2. Ook!

是由 David Morgan-Mar 创建的一个玩笑深奥的编程语言
实际上是将 Brainfuk 用各种 Ook 和标点符号表示

Brainfuck Ook!
> Ook.Ook?
< Ook?Ook.
+ Ook.Ook.
- Ook!Ook!
. Ook!Ook.
, Ook.Ook!
[ Ook!Ook?
] Ook?Ook!

3. JSfuck

jsfuck 源于 brainfuck,只用 6 个字符来编写 JavaScript 程序
通常可用浏览器的 console 运行

字符集:
[ ]( ) ! +

4. Jother

运用于 JS 语言,利用少量字符构造精简匿名函数方法对字符串进行编码操作,即 javascript 中使用少量特定字符对匿名函数进行编码加密
通常可用浏览器的 console 运行

特定字符包:
+ ! ( ) [ ] { }

信息传递

那些靠媒介传递文本信息的方法

1. 莫尔斯电码

时通时断的且通过不同的排列顺序来表达不同英文字母、数字和标点符号的信号代码
不能区分大小写
主要由以下 5 种它的代码组成:

  1. 点(.)
  2. 划(-)
  3. 每个字符间短的停顿(通常用空格表示停顿)
  4. 每个词之间中等的停顿(通常用/划分)
  5. 句子之间长的停顿
编码表:
A  .-    N  -.    .  .-.-.-  +  .-.-.    1  .----
B  -...  O  ---   ,  --..--  _  ..--.-   2  ..---
C  -.-.  P  .--.  :  ---...  $  ...-..-  3  ...--
D  -..   Q  --.-  "  .-..-.  &  .-...    4  ....-
E  .     R  .-.   '  .----.  /  -..-.    5  .....
F  ..-.  S  ...   !  -.-.--              6  -....
G  --.   T  -     ?  ..--..              7  --...
H  ....  U  ..-   @  .--.-.              8  ---..
I  ..    V  ...-  -  -....-              9  ----.
J  .---  W  .--   ;  -.-.-.              0  -----
K  -.-   X  -..-  (  -.--.
L  .-..  Y  -.--  )  -.--.-
M  --    Z  --..  =  -...-

2. 敲击码

通过使用一系列的点击声音来编码
敲击码是基于 5×5 方格波利比奥斯方阵来实现的,不同点是是用 K 字母被整合到 C 中
同样不能区分大小写

   1  2  3  4  5
  --------------
1| A  B C/K D  E
2| F  G  H  I  J
3| L  M  N  O  P
4| Q  R  S  T  U
5| V  W  X  Y  Z
文本:F O X
位置:2,1    3,4    5,3
敲击码:..  .    ...  ....    ......  ...

在线工具

  1. Unicode,UTF-8,URL 编码:站长工具
  2. Base 系列:千千秀字
  3. 摩尔斯编码:世纪算命网
  4. 条形码/二维码:online-barcode-reader
  5. MD5,Escape/Unescape:站长工具
  6. UUencode 编码:在线工具
  7. XXencode 编码:在线工具
  8. 恺撒密码:千千秀字
  9. 栅栏密码:千千秀字(包含空格)Rail-fence Cipher(自动去空格)
  10. Brainfuck/Ook!:Brainfuck/Ook!(这好像是外网,可能会慢些)
  11. JSFuck:JSF*ck demo
  12. ASCII 转换:ASCII 在线转换器-十六进制,十进制、 二进制
  13. Base91:Base91 Cipher

参考

ctf 常见的编码
CTF 中常见的编码,代码混淆及加、解密
Base16,Base32,Base64 编码的介绍
CTF 中那些脑洞大开的编码和加密
jother 编码
SHA 算法简介
转盘密码和仿射加密