java加密解密研究3、Base64算法
3509 点击·0 回帖
![]() | ![]() | |
![]() | 一、Base64算法概述 Base64算法最早应用于解决电子邮件传输的问题。它是一种基于64个字符的编码算法,根据RFC 2045的定义:“Base64内容传输编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别。” 经过Base64编码后的数据会比原始数据略长,为原来的4/3倍。经过编码后的字符串的字符数是以4为单位的整数倍。 Base64算法的编码和解码的操作可充当加密和解密的操作,还有一张字符映射表充当了密钥。尽管如此,Base64算法仍不能叫做加密算法。 二、Base64算法实现原理 Base64算法主要是将给定的字符以与字符编码(如ASCII码,UTF-8码)对应的十进制数为基准,做编码操作: 1、将给定的字符串以字符为单位,转换为对应的字符编码(如ASCII码)。 2、将获得的字符编码转换为二进制码。 3、对获得的二进制吗做分组转换操作,每3个8位二进制码为一组,转换为每4个6位二进制为一组(不足6位时地位补0)。这是一个分组变化的过程,3个8位二进制码和4个6位二进制码的长度都是24位(3*8=4*6=24)。 4、对获得的4-6二进制码补位,向6位二进制码添加2位高位0,组成4个8位二进制码。 5、将获得的4-8二进制码转换为十进制码。 6、将获得的十进制码转换为Base64字符表中对应的字符。 举个例子: 有一个字符串:“Ad3”我们要对其进行加密处理。 字符串: Ad3 字 符: A d 3 ASCII码: 65 100 51 二进制码: 01000001 01100100 00110011 4-6二进制码: 010000 010110 010000 110011 4-8二进制码: 00010000 00010110 00010000 00110011 十进制码 : 16 22 16 51 字符表映射码: Q W Q z 因此,字符串“Ad3”经过Base64编码后就得到了“QWQz” Base64的字符表映射码: ![]() 三、Base64算法的实现 Sun公司本身并没有提供Base64算法的相关实现。所以我们要用到其他开源组件的Base64算法的实现。如Bouncy Castle和Commons Codec。 1、Bouncy Castle的应用 Bouncy Castle实现的只是一般的Base64算法,没有遵循RFC标准 直接将下载的bcprov-jdk16-143.jar包导入工程即可。具体应用如下: [java] package Test; import java.io.UnsupportedEncodingException; import org.bouncycastle.util.encoders.Base64; /** * 封装Base64的工具类 * */ class Base64Coder{ public final static String ENCODING="UTF-8"; //加密 www.atcpu.com public static String encoded(String data) throws UnsupportedEncodingException{ byte[] b=Base64.encode(data.getBytes(ENCODING)); return new String(b,ENCODING); } //解密 public static String decode(String data) throws UnsupportedEncodingException{ byte[] b=Base64.decode(data.getBytes(ENCODING)); return new String(b,ENCODING); } } /** * 测试类 */ public class Base64Test { public static void main(String[] args) throws UnsupportedEncodingException { String str="Ad3"; //加密该字符串 String encodedString=Base64Coder.encoded(str); System.out.println(encodedString); //解密该字符串 String decodedString=Base64Coder.decode(encodedString); System.out.println(decodedString); } } package Test; import java.io.UnsupportedEncodingException; import org.bouncycastle.util.encoders.Base64; /** * 封装Base64的工具类 * */ class Base64Coder{ public final static String ENCODING="UTF-8"; //加密 public static String encoded(String data) throws UnsupportedEncodingException{ byte[] b=Base64.encode(data.getBytes(ENCODING)); return new String(b,ENCODING); } //解密 public static String decode(String data) throws UnsupportedEncodingException{ byte[] b=Base64.decode(data.getBytes(ENCODING)); return new String(b,ENCODING); } } /** * 测试类 */ public class Base64Test { public static void main(String[] args) throws UnsupportedEncodingException { String str="Ad3"; //加密该字符串 String encodedString=Base64Coder.encoded(str); System.out.println(encodedString); //解密该字符串 String decodedString=Base64Coder.decode(encodedString); System.out.println(decodedString); } } 2、Commons Codec的应用 Commons Codec即实现了一般的Base64算法,也实现了遵循RFC标准的Base64算法 直接将下载的commons-codec-1.6-bin.zip解压,将解压开的文件夹里面的commons-codec-1.6.jar包导入工程即可。 [java] package Test; import java.io.UnsupportedEncodingException; import org.apache.commons.codec.binary.Base64; /** * 封装Base64的工具类 * */ class Base64Coder { public final static String ENCODING = "UTF-8"; // 加密 public static String encoded(String data) throws UnsupportedEncodingException { byte[] b = Base64.encodeBase64(data.getBytes(ENCODING)); return new String(b, ENCODING); } // 加密,遵循RFC标准 public static String encodedSafe(String data) throws UnsupportedEncodingException { byte[] b = Base64.encodeBase64(data.getBytes(ENCODING),true); return new String(b, ENCODING); } // 解密 public static String decode(String data) throws UnsupportedEncodingException { byte[] b = Base64.decodeBase64(data.getBytes(ENCODING)); return new String(b, ENCODING); } } /** * 测试类 */ public class Base64Test { public static void main(String[] args) throws UnsupportedEncodingException { String str = "Ad3"; // 加密该字符串 String encodedString = Base64Coder.encodedSafe(str); System.out.println(encodedString); // 解密该字符串 String decodedString = Base64Coder.decode(encodedString); System.out.println(decodedString); } } package Test; import java.io.UnsupportedEncodingException; import org.apache.commons.codec.binary.Base64; /** * 封装Base64的工具类 * */ class Base64Coder { public final static String ENCODING = "UTF-8"; // 加密 public static String encoded(String data) throws UnsupportedEncodingException { byte[] b = Base64.encodeBase64(data.getBytes(ENCODING)); return new String(b, ENCODING); } // 加密,遵循RFC标准 public static String encodedSafe(String data) throws UnsupportedEncodingException { byte[] b = Base64.encodeBase64(data.getBytes(ENCODING),true); return new String(b, ENCODING); } // 解密 public static String decode(String data) throws UnsupportedEncodingException { byte[] b = Base64.decodeBase64(data.getBytes(ENCODING)); return new String(b, ENCODING); } } /** * 测试类 */ public class Base64Test { public static void main(String[] args) throws UnsupportedEncodingException { String str = "Ad3"; // 加密该字符串 String encodedString = Base64Coder.encodedSafe(str); System.out.println(encodedString); // 解密该字符串 String decodedString = Base64Coder.decode(encodedString); System.out.println(decodedString); } } 具体的应用可以参照Bouncy Castle和Commons Codec的API。 | |
![]() | ![]() |