介绍一些常见的编码,包含 Base64 隐写原理。
连字都看不懂,写什么博客?
ASCII
乱码的原因:编码体系不同
- 1 byte 表示 8 bits
- 第一位规定为 0,剩下 7 位组成 128 个字符
GB series
首位不为 0,与 ASCII 兼容
GB2312/GBK
- 每个字占据 2 bytes
GB18030
- 每个字占据 4 bytes
Unicode
符号集,定长编码,计算机内存中统一使用
容纳所有符号,解决乱码问题
浪费空间
- 存储方式:
- FF FE:小头,Unicode 反着来
- FE FF:大头,Unicode 正向存储
- Example:严 4E 25
- 小头:FF FE 25 4E
- 大头:FE FF 4E 25
- 编码方式较多,如 UTF-8 UTF-16 UTF-32
UTF-8
UTF-8 是 Unicode 的最广的实现方式
兼容ASCII
- 文件开头:EF BB BF
- 对于单字节符号,UTF-8 与 ASCII 相同
- 对于 N 字节,第 1 个字节的前 n 位为 1,n+1 位为 0,其他字节前 2 位设为 10;其他为 Unicode。
Base64
Base64加密
其实就是把文本 ascii 分为每 6 个一组编码,若不是 6 的倍数就加 0,加 2 个 0 添 1 个 =
-
将每 3 bytes 分为一组,共 24 bits
-
将 24 bits 分为 4 组,每组 6 bits
-
每组前加 2 个 00,扩展为 32 bits,分成四组,按下列表格编码转换
索引 对应字符 索引 对应字符 索引 对应字符 索引 对应字符 0 A 17 R 34 i 51 z 1 B 18 S 35 j 52 0 2 C 19 T 36 k 53 1 3 D 20 U 37 l 54 2 4 E 21 V 38 m 55 3 5 F 22 W 39 n 56 4 6 G 23 X 40 o 57 5 7 H 24 Y 41 p 58 6 8 I 25 Z 42 q 59 7 9 J 26 a 43 r 60 8 10 K 27 b 44 s 61 9 11 L 28 c 45 t 62 + 12 M 29 d 46 u 63 / 13 N 30 e 47 v 14 O 31 f 48 w 15 P 32 g 49 x 16 Q 33 h 50 y
- 若 bytes 数不足3:
- 2 bytes:2 -> 3 bytes,前方各加 2 个 0,最后 1 byte 后方再加 2 个 0,转换最后加一个 =
- 1 byte:1 -> 2 bytes,前方各加 2 个 0,最后 1 byte 后方再加 4 个 0,转换最后加两个 =
Base64 解码
- 转换成每个字符对应的十进制
- 将十进制数字转换为 6 位 bits
- 删去 num(‘=’) * 2 bits
- 将 bits 转为 bytes
故出现 base64 隐写:
- 将 = 所补充的 00 隐写信息:对 base64 编码的影响只限于最后一位,对 base64 解码无影响