分享

Base64与Hex的数据加密

 燮羽 2010-12-24

本篇文章主要在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);

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

String encoded = Base64.encode("Hello, world!"); //编码

String decoded = Base64.decode(encoded); //解码

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

String encoded = Base64.encode("Hello, world!", "UTF-8"); //编码

String decoded = Base64.decode(encoded
, "UTF-8"); //解码

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

InputStream inputStream = new FileInputStream("source.jpg");
OutputStream outputStream = new FileOutputStream("encoded.b64");
Base64.encode(inputStream, outputStream);
outputStream.close();
inputStream.close();

In similar manner, a stream can be decoded:

InputStream inputStream = new FileInputStream("encoded.b64");
OutputStream outputStream = new FileOutputStream("decoded.jpg");
Base64.decode(inputStream, outputStream);
outputStream.close();
inputStream.close();


更进上步说,还可以直接操作java.io.File对象。如:

//直接从文件中读取数据进行编码
File source = new File("source.jpg");
File encoded = new File("encoded.b64");
Base64.encode(source, encoded);

//编码到另一个文件中
File encoded = new File("encoded.b64");
File decoded = new File("decoded.jpg");
Base64.decode(encoded, 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。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多