`

Base64

阅读更多
Base64是一种编码的算法,最初是为了解决电子邮件传输的问题

勉强可以认为它是一种加密算法,但是安全系数极低。因为不仅算法是公开的,连密钥也是公开的

算法是这样的:

1、对于一个给定的字符或字符串,先按照某种编码字符集(如UTF-8、GBK等)编码,得到二进制码
2、对二进制码做分组变化,从8个bit一组,改成6个bit一组,最后一组不足6个的,在低位补0
3、换算成十进制,找到Base64字符表中的字符(范围从0-63,一共64个字符,这也是Base64名字的由来)
4、若最后一组字符不足4个,则在末尾用"="补足4个字符

比如对于字符"A"

1、用UTF-8编码,得到01000001
2、分组变化,得到010000 010000
3、十进制是16 16,查Base64编码表,得到Q Q
4、由于字符不足4个,在末尾补上2个"=",最后得到"QQ=="

字符"A"用Base64编码以后,得到的就是"QQ=="。如果原来字节数是3的整数倍,那么Base64编码之后就会是4的整数倍,就不需要在末尾补"="了。但是一般没那么巧,所以Base64编码的一个明显的特点,就是末尾的字符经常是"="或者"=="

再来算下长度,"A"用UTF-8编码后,只占1个字节;Base64编码之后,则占4个字节,是原来的4倍。不过这是比较极端的情况,如果对"AAA"编码,则原来是3个字节,编码后4个字节,是原来的4/3倍。无论何时,Base64编码后的字节数,都是4的整数倍

一般来说,经过Base64编码之后,都会比原来略大,这主要是因为分组变化,从8bit一组拆成了6bit一组的原因。至于最后补位的"=",一般可以忽略不计

注意,Base64是对字节进行编码,而不是直接对字符编码。所以同样的字符,首先用不同的编码字符集编码,最后得到的Base64编码也是不同的

Base64编码表的最后2个字符是"+"和"/",在URL里都是不能用的,所以后来又衍生出了URL Base64,把最后2个字符改成了"-"和"_"

JDK里也有Base64的实现,不过不推荐使用;一般用commons codec比较好

最后贴一段示例代码:
public static void main(String[] args) throws IOException {

		String encoding = "UTF-8";

		String name = "A";

		byte[] originBytes = name.getBytes(encoding);

		byte[] encodedBytes = Base64.encodeBase64(originBytes, false);

		System.out.println(originBytes.length);

		System.out.println(encodedBytes.length);

		System.out.println(new String(encodedBytes, encoding));

	}

更详细的内容,可以看一下《JAVA加密与解密的艺术》第5章,讲得更全面,只是稍微有些错误
分享到:
评论
1 楼 kewen342757003 2013-08-08  
看起来可以肉体解密的样子。。。

相关推荐

    Base64.dll(Base64编解码,附VB示例)

    Base64编码和解码库,支持API调用和COM调用,输入参数支持VB的字节数组Byte(),输出支持VB的字节数组Byte()和...Public Declare Sub DecodeFromVBStringEx Lib "Base64" (ByRef Dest() As Byte, ByRef Src As String)

    pb-base64.zip

    pb10调用base64.dll,实现将图片转换成base64编码,将base64编码转换成图片 函数声明 function long GetFileEncode64(ref string filename, ref string encode64)library "base64" alias for "GetFileEncode64;...

    sun.misc.BASE64Decoder(Android Base64Jar包以及Java源代码)

    sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及...

    BASE64Decoder包

    BASE64Decoder包 加密代码: 加密前字符串:String key="mykey"; byte[] bt = key.getBytes(); 加密后字符串:String newKey=(new BASE64Encoder()).encodeBuffer(bt); 解密代码: 加密后的字符串:String newkey=...

    pb10编码解码base64

    pb10调用base64.dll,实现将图片转换成base64编码,将base64编码转换成图片 函数声明 function long GetFileEncode64(ref string filename, ref string encode64)library "base64" alias for "GetFileEncode64;...

    2进制与base64编码转换C代码

    需要一个二进制与BASE64相互转换的函数,从网上找了几个,或者是错的,或者不输出长度,待转的二进制串中有可能出现00截断,因此不能直接以strlen来计算长度,所以我引用网上的一个可用代码后加以修改,变成现在的...

    sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用已解决

    最近项目实验发现导入工具程序后项目有错,查看发现sun.misc.BASE64Decoder和sun.misc.BASE64Encoder不可用,找不到相应的类。 二、原因分析 冲浪后发现JDK中的lib\tools.jar和JRE中的lib\rt.jar已从Java SE 9中...

    labview 图片缩放 base64编码base64解码

    labview 图片缩放 base64编码base64解码

    c# 用Base64实现文件上传

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,它是一种基于64个可打印字符来表示二进制数据的方法。  使用base64进行文件上传的具体流程是:前台使用js将文件转换为base64格式,后台通过高级编程语言...

    JS 版本的base64函数实现(base64encode,base64decode)

    用js实现的base64encode,base64decode函数. 包括: function base64encode(str) { function base64decode(str) { function utf16to8(str) { function utf8to16(str) { function doit() {

    JavaScript实现Base64编码转换

    Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。...

    linux下图片批量转base64

    #功能说明:批量将图片文件转换未base64编码文件(txt格式) #使用说明:将需要转换的批量图片与当前脚本存到到同一目录, # 给当前脚本赋予可执行权限 # 执行脚本即可生成与之对应的txt文件,文件内存放base64编码 #...

    微信小程序require 引用 BASE64.JS 失败问题的分析解决

    有朋友问, 微信小程序require ('base64.js')文件时,会失败,,, # 分析 事实上,微信小程序require很多JS模块都有不兼容现象。。。先从base64.js这个模块入手吧。 调试出错点: ~~~~ (function(global) {  'use ...

    js的base64(base64.js)

    js的base64(base64.js)

    Base64详解(文档+代码)

    Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会...

    LabVIEW实现Base64加密解密程序源码

    LabVIEW实现Base64加密解密程序源码,可以作为子VI直接调用,非常方便,经过测试没有问题。base64是一种用64个字符来表示任意二进制数据的方法。base 64编码可以将任意一组字节转换为较长的常见文本字符序列,从而...

    一个很好的Base64编码解码工具

    一个很好的Base64编-解码工具.转换很方便,支持中文,支持UTF-8,Unicode编码方式. Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24)...

    C语言实现Base64编解码(加密和解密).zip

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。 Base64要求把每三个8Bit的字节转换为四个6...

    sun.misc.BASE64Decoder.jar 绿色版完整 官方版本 直接调用

    sun.misc.BASE64Decoder.jar 绿色版 官方版本自己打包好的,可以直接调用,欢迎下载

    base64编码解码用于pb8pb9pb12.5等

    nvo_base64在pb8中导出的文件,需要有项目将此文件导入。 函数为: public function string base64encode (blob blobbuf) public function blob base64decode (string strbuf, ref character lc_return[]) //2013.11...

Global site tag (gtag.js) - Google Analytics