1 Base64算法的由来
Base64算法最早应用于解决电子邮件传输的问题。早期,由于“历史问题”,电子邮件只允许ASCII码字符,如果邮件中包含非ASCII码字符,当它通过有“历史问题”的网关时,这个网关会对该字符的二进制位进行调整,即将其8位二进制码的最高位置0,这样用户收到的邮件就会是一封乱码。为了解决这个问题,产生了Base64算法。
2 Base64算法的定义
RFC 2045中定义:Base64内容传输编码是一种以8位字节序列组合的描述形式,这种形式不易被人直接识别。
RFC 2045中规定,在电子邮件中,每行为76个字符,每行末需添加一个回车换行符("\r\n"),不管每行是否够76个字符,都要添加一个回车换行符。不过在实际应用中,根据实际需要,这一要求往往被忽略。
Base64算法的转换方式类似于古典加密算法里的单表置换算法
。RFC 2045中给出了Base64的字符映射表,如下图所示。
这张字符映射表中,Value是十进制编码,Encoding是字符,共映射了64个字符,这也是Base64算法命名的由来。映射表的最后一个字符“=”是用来补位的。
Base64算法的编码和解码操作可用作加密解密,但是Base64的字符映射表是公开的,因此并不能叫做加密算法。
Url Base64算法是由Base64算法衍生出来的,用于在http请求中传递二进制数据。将Base64中的“+”、“/”替换为“-”和“_”符号,对于补位符“=”,Bouncy Castle使用“.”替换,而Commons Codec则不使用补位符。
3 基本原理
Base64算法主要是将给定的字符以字符编码(如ASCII、UTF-8等)对应的十进制数为基准,做编码操作:
- 将给定的字符串以字符为单位,转换为对应的字符编码。
- 将获得的字符编码转换为二进制串。
- 将获得的二进制串做分组转换操作,每3个8位的二进制串为一组,将这样的一组再转换为4个6位二进制串,不足6位时低位补0。
- 对每组4个6位二进制串补位,即向6位二进制串的高位补两个0,生成4个8位二进制串。
- 将获得的4-8二进制码转换为十进制码。
- 将获得的十进制码用Base64字符映射表中对应的字符替换。
经过Base64编码后的数据会比原始数据略长,为原来的4/3倍,编码后的字符数是4的倍数。
编码后的字符串最多有2个补位的“=”,因为原始数据的二进制串的分组是以3个8位为一组的,余数 = 原始数据字节数 mod 3,余数只能为0、1、2。如果余数为0,3个8位转换为4个6位,高位补0之后是4个8位,则不需要补位符;如果余数为1,1个8位只能转换为2个6位,高位补0之后是2个8位,为了让编码之后的字符数是4的倍数,要补两个补位符;同理,如果余数为2,要补一个补位符。
ASCII码进行Base64编码的例子如下图,字符“A”编码之后的字符串为“QQ==”。
非ASCII码如GBK、UTF-8等编码,一个字符包含多个字节,如UTF-8用3个字节表示一个汉字,GBK用2个字节表示一个汉字。以字符串“密”为例,对应的UTF-8编码是-27、-81、-122,用Base64编码如下图,编码后的字符串为“5a+G”。
4 Base64算法的Java实现和使用
Java API中没有Base64的实现,实际上Sun也有Base64算法的实现,但是没有公布。Bouncy Castle提供了一般Base64算法的实现,Commons Codec提供了基于RFC 2045相关定义的Base64算法实现。
Bouncy Castle遵循的是一般Base64算法,就是根据字符映射表做了编码转换。Commons Codec中既支持RFC 2045定义的Base64算法,也支持一般的Base64算法。这两种的差异是RFC 2045定义的算法要求在编码后的字符串中换行和末尾添加回车换行符。
分享到:
相关推荐
java实现SHA1、SHA、MD5、AES加密、AES解密、BASE64解密、BASE64加密,以及apache BASE64 jar和源码
c++实现base64算法加密解密,不需要修改,直接运行即可
jquery实现的加密解密算法,页面经过jquery加密后,提交到后台,通过java的base64解密算法可以原样解析, demo中用的是servlet和jquery的$.ajax实现...
参照网上Base64 js加密解密写的java实现,网上没看到出现过,可能大神都不屑写这种小东东,只好自己写了。弄了好几天,总算弄好了。 因为是参照 js Base64写的java实现,所以代码可实现前台js,后台java的加密,...
java加密解密研究3、Base64算法
本源码从CSDN一位前辈的源码基础上做了更改,增加支持加密返回BASE64,更加完善。在此感谢原作者: http://download.csdn.net/download/qiaohaidong/9477264 需要注意的是仅在XE及以上版本支持Base64返回结果,...
用Java实现base64的加密解密
java base64 算法 java实现base64加密 解密
例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码...
jquery实现的加密解密算法,页面经过jquery加密后,提交到后台,通过java的base64解密算法可以原样解析, demo中用的是servlet和jquery的$.ajax实现...
java代码。支持加密与解密,Base64加密算法
一个很有用的java加密,解密算法,带有密钥,加密解密必须使用相同的密钥。
Base64 解密成明文,Base64 加密成Java密文. 参数输入输出流 共三个java文件。
C++实现了SHA1加密算法,MD5加密算法和base64加解密算法类。 程序中做了测试, 绝对可用。
Base64加密&解密工具,可以用以验证咱编写Base64加密&解密程序的正确性。
Base64.java加密解密类文件,Java使用Base64算法对字符串或文件进行加密的一个类实例,不包括例子,你可以看下这个类,需要的话自己用得上,是从国外网站下载的。
java中将数据通过des算法加密解密,可修改向量和加密填充方式,代码中有注释。
base64加密和解密算法完整事例代码,base64加密和解密算法完整事例代码
可以攻玉1094.1 加固你的系统1094.2 加密组件Bouncy Castle 1114.3 辅助...Base64算法与加密算法的关系1355.4 实现原理1365.5 模型分析1375.6 Base64算法实现1385.7 Url Base64算法实现1475.8 应用举例1515.9 小结153...
Delphi源码,算法相关,base64,加密,解密 Delphi base64 加密,解密示例源代码,这是个很常用但很流行的一种加密、解密算法,做过快车下载的朋友就知道,快车的下载链就是基于此种加密方法,除了加密网址外,它还可...