base64加密原理

今天面试被问到以前的项目有没有用到网络传输加密,当时脑袋抽风没想起来直接说了没有。回来后看书看到了base64几个字,顿时醒悟了过来。


Shit!明明最近的项目就用到了base64方法加密的,只是做的比较久远了,后面又没怎么改动过,就把它忽略了。既然这样,那就白纸黑字记下来吧,以免下次脑袋抽风。


首先,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编码的一个副作用吧。先忽略这个,讲重点。


现在问题来了,既然编码和解码的规律是固定的大家都知道,那还怎么起到加密的作用呢?


这种编码的方式有个特点,就是解码的时候要么从最前面的字节往后推,要么从最后的字节往前推,最前面和最后面的字节可以直接影响到全部的解码结果。跟多米诺骨牌一样,一个错误,后面都会跟着错误。


既然这样,我们在源文件的最前面和最后面分别加上一个简单的字符,那解码出来的文件内容就跟源文件相差了十万八千里,因为第一个不对,那以此类推,后面的解码都会错误。


基于这种原理,我们采取的方法就是编码前,在源文件的前后分别加上干扰字符,为了增加破译的难度,这些字符可以稍微复杂点,但是要提前告知服务端的同学这种加密的格式,这样服务端才能在解码时排除干扰字符得到正确的内容。


好了,原理就是这些了。其他的加密方法还有待进一步研究,到时候再做个对比。

你可能感兴趣的:(工作心得)