base64编码原理简介和python的base64模块的使用
时间:2009-04-09 来源:blackjimmy
还有就是,为什么发明这么个编码呢,其实这个编码的原理是很简单的,“破解”也很容易,电子邮件刚出来的时候,只传递英文字符,这没有问题,但是后来,中国人,日本人都要发email,这样问题就来了,因为这些字符有可能会被邮件服务器或者网关当成命令处理,故必须得有一种编码来对邮件进行加密,但是加密的目的是为了能够使得一些原始的服务器不出问题(新得牛叉服务器已经能处理这些乱七八糟得情况了,不过因为已经形成了一套规范,所以邮件还是得经过Base64编码才能传递),这样加密必须得简单(那搞个取反,异或加密吧,:-),还是没解决根本问题咯),加密简单,这样客户端程序加密解密也快,又要是明文Ascii编码,这样Base64就诞生了。当初设计人员主要是考虑了两个问题:
1、加密算法复杂程度和效率
2、如何处理传输
Base64基本都能满足,如果因为发一封邮件把CPU占到100%或者把内存给用完了,那就完全没必要了,编码之后只要普通人一眼看不出内容就行了。
下面谈谈Base64的编码原理,按照RFC2045的定义,The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.我之前在网上查Base64的资料时,发现了一个很好的网站,
base64编码在线转换器 :http://www.motobit.com/util/base64-decoder-encoder.asp,大家对Base64感兴趣的话,可以去看看。Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。6bit2进制能表示的最大数是2的6次方减一,刚好是64,这也是为什么是64个字符的原因,这样就需要一张映射表,表如下:
The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
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 (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
编码原理:将3个字节转换成4个字节((3 X 8)=24=(4X6)),先读入3个字节,每读一个字节,左移8位,再右移四次,每次6位,这样就有4个字节了。
解码原理:将4个字节转换成3个字节,先读入4个6位(用或运算),每次左移6位,再右移3次,每次8位,这样就还原了。
Base64将3个字节转变为4个字节,因此,编码后的代码量(以字节为单位,下同)约比编码前的代码量多了1/3。如果代码量正好是3的整数倍,那么恰好多了1/3。但如果不是呢?这个时候“=”终于派上用场啦,当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位,总之要保证最后编码出来得字节数是4的倍数。
原理也说了表也给,大家可以编码了哈……
再说说python对Base64的支持,有个base64模块,专门干这个事情的,大家去看看就行了,直接贴点例子代码。
#!/usr/bin/env python # -*- coding: utf-8 -*- # utility @ Python # Functions: Base64 编解码模块 # Created By MagicTong on 2008-07-16 import base64 import os import StringIO # encode,decode, encodestring,decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode class KBase64: """ Base64 编码和解码模块,用于对文件,字符串,URL的编解码 对base64的简单封装 """ def __init__(self): pass def encodeFile(self, strFileName, strDecName): """ 将一个文件的内容编码为Base64 """ if not os.path.exists(strFileName): return False f1 = None f2 = None try: f1 = open(strFileName, "r") f2 = open(strDecName, "w") base64.encode(f1, f2) except Exception, e: print e if f1 != None: f1.close() if f1 != None: f2.close() return False f1.close() f2.close() return True def decodeFile(self, strFileName, strDecName): """ 将一个Base64文件的内容解码 """ if not os.path.exists(strFileName): return False f1 = None f2 = None try: f1 = open(strFileName, "r") f2 = open(strDecName, "w") base64.decode(f1, f2) except Exception, e: print e if f1 != None: f1.close() if f1 != None: f2.close() return False f1.close() f2.close() return True def encodeSting(self, strSrc): """ 对字符串进行Base64编码 """ try: strDec = base64.encodestring(strSrc) except Exception, e: print e return "", False return strDec, True def decodeSting(self, strSrc): """ 将Base64字符串解码为源字符串 """ try: strDec = base64.decodestring(strSrc) except Exception, e: print e return "", False return strDec, True if __name__ == "__main__": baseObj = KBase64() print baseObj.encodeSting("a")
摘自:http://blog.csdn.net/magictong/archive/2008/07/21/2687183.aspx