现在的位置: 首页 > 编程·网络 > java编程 > 正文
Base64与Hex的数据加密
2014年10月07日 java编程 ⁄ 共 1988字 Base64与Hex的数据加密已关闭评论 ⁄ 被围观 1,763 views+

本篇文章主要在JDK6.0的基础上介绍另外两种第三方加密组件库,分别为Bouncy CastleApache Commons Codec.虽然SUN内部也提供了Base64加密算法,相关API可能参照文档,但下面将要介绍的两种组件分别在此基础上提供了更加灵活的运用, Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

关于这个编码的规则:

把3个字符变成4个字符..

每76个字符加一个换行符..

最后的结束符也要处理..

例子:
转换前 10101101 10111010 01110110

转换后 00101011 00011011 00101001 00110110

十进制 43 27 41 54

对应码表中的值 r b p 2

所以上面的24位编码,编码后的Base64值为 rbp2

首先我们是一下SUN内部对BASE64加密算法的实现:

String str = "base64加密测试";

byte[] input = str.getBytes();

//Base64编码
byte[] data = Base64.encode(input);

//Base64解码
byte[] output = Base64.decode(data);

我们也可以直接编码一个字符串如:

我们还可以在进行编码时直接指定编码格式:

对于大一点的数据如果使用输入输出流来直接进行编码会达到更好的效果。而直接通过流进行操作,SUN公司也提供了相关API说明如:

In similar manner, a stream can be decoded:

 

上面为SUN为我们提供的基本算法.

Commons Codec 也提供了Base64加密算法,并且尊循RFC 2045,其提供的API可参照如下:

//Base64编码
byte[] data = Base64.encodeBase64(input);

//Base64解码
byte[] output = Base64.decodeBase64(data);

另Common Codec还提供了Base64InputStream / Base64OutputStream API,我们可以以流的形式来读取数据,并进行加密,

Base64InputStream input = new Base64InputStream(is,false);

DataInputStream dis = new DataInputStream(input);

byte[] data = new byte[contentLength];

dis.readFully(data);

dis.close();

System.out.println(new String(data));

其中is:为网络输入流,contentLength:为数据长度。

//我们可以直接创建一个Base64OutputStream,来封装另一个现存的输出流
Base64OutputStream encodingStream = new Base64OutputStream(myOutputStream);

//我们直接编码数据到一个现存的文件中
Base64OutputStream encodingStream = new Base64OutputStream(new FileOutputStream("encoded.b64"));

//把数据写入流中,和普通流操作一样
encodingStream.write(bytes);

//关闭流
encodingStream.close();

//指定每行显示的个数,默认为 76,但我们可以自行指定,但最少不能小于壹
Base64OutputStream encodingStream = new Base64OutputStream(myOutputStream, 48);

用 Base64InputStream进行解码

//直接始从文件中读取
Base64InputStream decodingStream = new Base64InputStream(new FileInputStream("encoded.b64"));

//读取字节数据
decodingStream.read(bytes);

//关闭流
decodingStream.close();

另Hex 16进制算法与64算法在API上很相似,读取可参照相关API。



本文链接:Base64与Hex的数据加密

转载声明:本站文章若无特别说明,皆为原创,转载请注明来源:海鹏的博客,谢谢!^^


【上篇】
【下篇】

抱歉!评论已关闭.

无觅相关文章插件,快速提升流量