beforeEncode为Encode之前的字符串
那么Encode后的字符串长度为:
1、如果beforeEncode.length()是3的整数倍,那么长度为
(beforeEncode.length()/3)*4
2、如果beforeEncode.length()不是3的整数倍,那么长度为
(beforeEncode.length()/3+1)*4
为什么是这个样子呢,原理如下:
https://blog.csdn.net/zm342021666/article/details/77461528
首先,base64编码的原理是先将源文件以标准字节(byte)为单位转化成二进制,一个字节占8个位(bit),如“ABC”的二进制是01000001、01000010、01000011,这样源文件就形成了每8个bit一组的一串二进制,然后将这些二进制串以base64特有的规则(每个字节占6个位)再转化成base64格式的字符(如下图),编码完成。解码就是这个过程反过来。
Base64 编码表
Value Char Value Char Value Char Value Char
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 /
"ABC"的转化为base64字符的逻辑如下:
A B C
ASCII十进制 65 66 67
8bit/byte 01000001 01000010 01000011
6bit/byte 010000 010100 001001 000011
base64十进制 16 20 9 3
base64字符 Q U J D
这样,"ABC"三个标准字符就转化成了"QUJD"四个base64字符。
明眼人就会发现,base64编码以后字节数会增加,事实上也确实如此,因为原先8个占位的字节转化成了6个占位的字节,每3个原先的字节就转化成了4个base64字节。这算是base64编码的一个副作用吧。先忽略这个,讲重点。
现在问题来了,既然编码和解码的规律是固定的大家都知道,那还怎么起到加密的作用呢?
这种编码的方式有个特点,就是解码的时候要么从最前面的字节往后推,要么从最后的字节往前推,最前面和最后面的字节可以直接影响到全部的解码结果。跟多米诺骨牌一样,一个错误,后面都会跟着错误。
既然这样,我们在源文件的最前面和最后面分别加上一个简单的字符,那解码出来的文件内容就跟源文件相差了十万八千里,因为第一个不对,那以此类推,后面的解码都会错误。
基于这种原理,我们采取的方法就是编码前,在源文件的前后分别加上干扰字符,为了增加破译的难度,这些字符可以稍微复杂点,但是要提前告知服务端的同学这种加密的格式,这样服务端才能在解码时排除干扰字符得到正确的内容。
---------------------
作者:无招的小扬
来源:CSDN
原文:https://blog.csdn.net/zm342021666/article/details/77461528
版权声明:本文为博主原创文章,转载请附上博文链接!