Base64算法
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。
http://www.cnblogs.com/shijiaqi1066/p/4288372.html
Base64 算法基本原理
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。
对字符串的编码效果
未编码:sjq security base64
编码后:c2pxIHNlY3VyaXR5IGJhc2U2NA==
Base64的主要特点就是将二进制数据编码成一段字符串。字符串包括:大小写字母各26个,10个数字,“+”,“/”,一共64个字符,以及“=”等号用于作为后缀。
由于log264 = 6,所以每6bit为一个“单元”,对应于一个可打印字符。
例:3 byte = 24 bit = 4 [Base64单元] ,即3个字节需要用4个可打印字符来表示。
Base64单元值与可打印字符的对应关系,显示如下:
当原数据长度不是3的整数倍时,如果最后剩下一个输入数据,在编码结果后加2个“=”;如果最后剩下两个输入数据,编码结果后加1个“=”;如果没有剩下任何数据,就什么都不要加,这样才可以保证数据还原的正确性。
例:对“Man”进行编码。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email、在XML中存储复杂数据。
Base64算法可以用于简易的加解密,其本质是使用替换字符的方式对数据进行加密。严格的说,Base64并不是一种加解密算法。
Java算法实现
Java中常用3种Base64的实现:
- JDK
- Commons Codec
- Bouncy Castle
JDK实现
package sjq.security; import java.io.IOException; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class JDKBase64 { private static String src = "sjq security base64"; public static String encoder(String src){ BASE64Encoder encoder = new BASE64Encoder(); String encode = encoder.encode(src.getBytes()); return encode; } public static String decoder(String code){ BASE64Decoder decoder = new BASE64Decoder(); byte[] bs = null; try { bs = decoder.decodeBuffer(code); } catch (IOException e) { e.printStackTrace(); } return new String(bs); } public static void main(String[] args) { String code = encoder(src); System.out.println(code); String src = decoder(code); System.out.println(src); } }
说明:
使用Eclipse编写Java代码时,可能找不到BASE64Decoder,BASE64Decoder;只需要在project build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。
Apache Commons Codec 的实现方式
package sjq.security; import org.apache.commons.codec.binary.Base64; public class CommonCodecBase64 { private static String src = "sjq security base64"; public static String encoder(String src) { byte[] bytes = Base64.encodeBase64(src.getBytes()); return new String(bytes); } public static String decoder(String code) { byte[] bytes = Base64.decodeBase64(code.getBytes()); return new String(bytes); } public static void main(String[] args) { String code = encoder(src); System.out.println(code); String src = decoder(code); System.out.println(src); } }
Bouncy Castle 的实现方式
package sjq.security; import org.bouncycastle.util.encoders.Base64; public class BouncyCastleBase64 { private static String src = "sjq security base64"; public static String encoder(String src) { byte[] bytes = Base64.encode(src.getBytes()); return new String(bytes); } public static String decoder(String code) { byte[] bytes = Base64.decode(code.getBytes()); return new String(bytes); } public static void main(String[] args) { String code = encoder(src); System.out.println(code); String src = decoder(code); System.out.println(src); } }
说明:
如果下载不到Bouncy Castle的Jar包,则可以使用MAVEN下载Jar包。
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk16</artifactId> <version>1.46</version> </dependency>
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处。LaplaceDemon/SJQ。
http://www.cnblogs.com/shijiaqi1066/p/4288372.html