免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2933 | 回复: 0
打印 上一主题 下一主题

base64编码原理简介和python的base64模块的使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-30 21:21 |只看该作者 |倒序浏览

               
Base64编码,首先我们应该搞清楚,为什么里面有个64的字样呢?其实是因为该编码使用64个明文来编码
任意的二进制文件,它里面只使用了A-Z,a-z,0-9,+,/这64个字符,有“略懂”的同学就会说了,里面还有“=”号啊,不错,不过等号不属于编
码字符,而是填充字符。
    还有就是,为什么发明这么个编码呢,其实这个编码的原理是很简单的,“破解”也很容易,电子邮件刚出来的
时候,只传递英文字符,这没有问题,但是后来,中国人,日本人都要发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编码在线转换器 :
[color="#336699"]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个字符的原因,这样就需要一张映射
表,表如下:
[color="#ff6600"]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")
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/95603/showart_1915592.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP