前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >base64数据隐写实现原理分析

base64数据隐写实现原理分析

作者头像
戴兜
发布2023-02-23 10:01:33
3260
发布2023-02-23 10:01:33
举报
文章被收录于专栏:daidrdaidr

在开始这篇文章前,先让我们来看一组base64编码的字符串

代码语言:javascript
复制
ZG==
YY==
aW==
ZF==
cm==
aM==
b2==
dc==
c2==
Zf==

解码后的内容是daidrhouse,似乎没有什么问题。但是仔细看,第一行和第4行解码后的结果都是d,但内容竟然不太一样?

按照正常的base64编码,daidrhouse应该得到下面的结果。

代码语言:javascript
复制
ZA==
YQ==
aQ==
ZA==
cg==
aA==
bw==
dQ==
cw==
ZQ==

显然,与前者相比,每串base64的第二个字符都被改变了,但解码后的内容依然不变,这得从base64编码的原理说起。

什么是base64

顾名思义,base64编码就是用64个ascii字符作为基础来编码二进制内容的一种编码方式。相信各位一定在网页中看到过base64编码的内嵌图片,甚至QQ音乐传输歌词文件时,也采用了base64编码。将二进制编码为ascii字符,使数据在某些场景下更便于阅读、便于传输。当然,将所有二进制「浓缩」到区区64个字符来表示,一定会在体积上作出妥协。字符在编码完成后,会增大1/3倍,至于原因,下面会讲到。

索引表

base64有一张标准编码表,为64个ascii字符排序并赋予索引。

索引

字符

索引

字符

索引

字符

索引

字符

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

/

有时为了防止混淆(比如链接),会使用 . _ 来代替索引表中的 + /

编码方式

base64将3个字节(24位)作为一组进行处理。不足3字节时填充0,并在结尾使用 = 来标识填充的字节数。并将每6位作为1小组,将24位编码成4组6位二进制。此时,这6位二进制一共有 2^6=64 种情况,正好能够用64个字符来表示。(这也解释了为什么编码完成后体积会增大1/3)

举些栗子

https://i.loli.net/2020/04/15/n8vJEqX9lZDeLCG.png
https://i.loli.net/2020/04/15/n8vJEqX9lZDeLCG.png
https://i.loli.net/2020/04/15/R2VOBWTtFxDcNQu.png
https://i.loli.net/2020/04/15/R2VOBWTtFxDcNQu.png

隐写的原理

base64在解码的时候,会按照字符串末尾的 = 数量来删除相应字节数。或许你已经发现了,当一组字符的数量为1字节或2字节的时候,会有4位或2位二进制在解码时被忽略,及下图的红色标识。

https://i.loli.net/2020/04/15/ZBpPwsz5OeaH3FG.png
https://i.loli.net/2020/04/15/ZBpPwsz5OeaH3FG.png
https://i.loli.net/2020/04/15/NK23ZzryPj9YBpi.png
https://i.loli.net/2020/04/15/NK23ZzryPj9YBpi.png

红色标识的这些二进制,能够被编码,但解码时却会被忽略。修改这些位置的内容,不会影响到原始数据。

解决问题

现在,可以来尝试解决文章开头的问题了。那组base64编码的字符串,隐藏了什么?

https://i.loli.net/2020/04/15/lB4MaF8n7cLumoK.png
https://i.loli.net/2020/04/15/lB4MaF8n7cLumoK.png
https://i.loli.net/2020/04/15/SLzdo2aRkPuNCIg.png
https://i.loli.net/2020/04/15/SLzdo2aRkPuNCIg.png
https://i.loli.net/2020/04/15/28YQ51zwRFc7nex.png
https://i.loli.net/2020/04/15/28YQ51zwRFc7nex.png
https://i.loli.net/2020/04/15/HQ4YFGybsDJtknX.png
https://i.loli.net/2020/04/15/HQ4YFGybsDJtknX.png
https://i.loli.net/2020/04/15/72MNPdlLSqtE9Ws.png
https://i.loli.net/2020/04/15/72MNPdlLSqtE9Ws.png
https://i.loli.net/2020/04/15/dbnrZ7FQxSNEC5H.png
https://i.loli.net/2020/04/15/dbnrZ7FQxSNEC5H.png
https://i.loli.net/2020/04/15/9WGyZHgQzqwbnIN.png
https://i.loli.net/2020/04/15/9WGyZHgQzqwbnIN.png
https://i.loli.net/2020/04/15/9hR4fM5IKtEbm28.png
https://i.loli.net/2020/04/15/9hR4fM5IKtEbm28.png
https://i.loli.net/2020/04/15/6gUAZ7awTP8tOsX.png
https://i.loli.net/2020/04/15/6gUAZ7awTP8tOsX.png
https://i.loli.net/2020/04/15/c3ni5uUbFqaO4To.png
https://i.loli.net/2020/04/15/c3ni5uUbFqaO4To.png

将所有红色标识的二进制位拼接起来,可以得到最后的结果hello

https://i.loli.net/2020/04/15/R2scY1wrXBpFtmx.png
https://i.loli.net/2020/04/15/R2scY1wrXBpFtmx.png

code{background: #f5f2f0;}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是base64
    • 索引表
      • 编码方式
        • 举些栗子
        • 隐写的原理
          • 解决问题
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档