分类 算法 下的文章

Base64算法过程解析以及优缺点

base64的优点
1.支持广泛,平台和语言支持都比较广泛,浏览器绝大多数都支持,直接可在前端编解码,很多加密算法的都有base64的应用。
2.在小图片base64后,可以减少请求,在某些场景下用途很大。
3.有些情况下传输不可见字符不方便,base64后都是可见字符。
4.能直接把二进制文件变成字符传输。
base64的缺点
1.他的编码方式注定会有三分之一的冗余
base64的实现
Base-64编码将一个8位子节序列拆散为6位的片段,并为每个6位的片短分配一个字符,这个字符是Base-64字母表中的64个字符之一。这64个输出字符都是很常见的,可以安全地放在HTTP首部字段中。这64个字符中包括大小写字母、数字、+和/,还是用里特殊字符=。base64编码收到一个8位字节序列,将这个二进制序列流划分成6位的块。二进制序列有时不能正好平均地分为6位的块,在这种情况下,就在序列末尾填充零位,使二进制序列的长度成为24的倍数(6和8的最小公倍数),对已填充的二进制进行编码时,任何完全填充(不包括原始数组中的位)的6位组都有特殊的第65个符号"="表示。如果6位组是部分填充的,就将填充位设置为0.
转换过程:
转前:ciika

转前 ascii十进制 二进制 8位变6位 高位补0 十进制 索引表
c 99 01100011 011000 00011000 24 Y
i 105 01101001 110110 00110110 54 2
i 105 01101001 100101 00100101 37 l
k 107 01101011 101001 00101001 41 p
a 97 01100001 011010 00011010 26 a
110110 00110110 54 2
000100 00000100 4 E

8位变6位示意图:qq%e5%9b%be%e7%89%8720161203133423
5个字母乘以8位等于40位,8和6最小的公倍数是48,即还需要48-40=8位,最后一个低位补两个0,最后6位全是0,用=号代替,所以ciika最终的base64编码是Y2lpa2E=

 

base64的在开发中遇到的问题
在url中+号会被转义,在BASE64的基础上进行一下的编码:去除尾部的"=",把"+"替换成"-",把"/"替换成"_"
在实际开发过程中,在AES加密后,会产生+/=等,如果万一需要通过get传输,需要做一些转换
"ciika".replace(/\+/g, "%2B").replace(/\&/g, "%26");
案例
这是一个真实的案例,大概需要是这样的,需要对用户的文件进行加密,然后进行还原,采用的大概算法是对原始字符采用占位,采用二叉树的思想,最中间位首字母,左树是真实字母,右边为混淆,依次采用左右交叉存放,最后在针对整个字符串base64或者在每一位混淆的均采用base64的索引编码。如图所示
webwxgetmsgimg

附件:

Base64编码索引表

索引
对应字符
0
A
1
B
2
C
3
D
4
E
5
F
6
G
7
H
8
I
9
J
10
K
11
L
12
M
13
N
14
O
15
P
16
Q
17
R
18
S
19
T
20
U
21
V
22
W
23
X
24
Y
25
Z
26
a
27
b
28
c
29
d
30
e
31
f
32
g
33
h
34
i
35
j
36
k
37
l
38
m
39
n
40
o
41
p
42
q
43
r
44
s
45
t
46
u
47
v
48
w
49
x
50
y
51
z
52
0
53
1
54
2
55
3
56
4
57
5
58
6
59
7
60
8
61
9
62
+
63
/

ascii对应表

ASCII值 控制字符
65 A
66 B
67 C
68 D
69 E
70 F
71 G
72 H
73 I
74 J
75 K
76 L
77 M
78 N
79 O
80 P
81 Q
82 R
83 S
84 T
85 U
86 V
87 W
88 X
89 Y
90 Z
97 a
98 b
99 c
100 d
101 e
102 f
103 g
104 h
105 i
106 j
107 k
108 l
109 m
110 n
111 o
112 p
113 q
114 r
115 s
116 t
117 u
118 v
119 w
120 x
121 y
122 z