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
Base64算法的更多相关文章
- MD5加密、时间戳转换、base64算法加密、解密
#region MD5加密 /// <summary> /// MD5加密 /// </summary> /// <param name="str"& ...
- java Base64算法的使用
Base64是常见的网络加密算法,Base64编码可用于在HTTP环境下传递较长的标识信息.详见 Base64介绍 1 自定义的base64算法 Base64Encrypt.java public c ...
- MD5加密算法(信息摘要算法)、Base64算法
1 什么是MD5 信息摘要算法,可以将字符进行加密,每个加密对象在进行加密后都是等长的 应用场景:将用户密码经过MD5加密后再存储到数据库中,这样即使是超级管理员也没有能力知道用户的具体密码是多少:因 ...
- c# base64算法解密
/// <summary> /// 将字符串使用base64算法加密 /// </summary> /// <param name="code_type&quo ...
- java基础---->Base64算法的使用
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息.详细的Base64信息,可以参见维基百科:https://en.wikipedia.org ...
- 【转】Base64算法详解
原文链接:https://blog.csdn.net/robertcpp/article/details/51628647 完整的BASE64定义可见RFC 1421和RFC 2045.编码后的数据比 ...
- java Base64算法
Base64算法并不是加密算法,他的出现是为了解决ASCII码在传输过程中可能出现乱码的问题.Base64是网络上最常见的用于传输8bit字节码的可读性编码算法之一.可读性编码算法不是为了保护数据的安 ...
- Base64 算法原理,以及编码、解码【加密、解密】 介绍
Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用 ...
- 传奇的通迅协议与base64算法
传奇的数据根本就没加密. 只要把#(数字)!去掉,中间的那些全部减0x3c,然后,四个字节一组,每个字节取低六位组成6*4=24位,然后分成3个字节,这个是很经典的base64的算法.不过小改了一些, ...
随机推荐
- [转贴]JAVA 百度地图SDK地图学习——实现定位功能
之前已经完成了百度地图SDK和百度定位SDK的配置. http://my.oschina.net/u/1051634/blog/180880 实现百度定位的功能,最好仔细看看官方的文档,看了好几次才有 ...
- Xamarin IOS – hello word
原文:Xamarin IOS – hello word 环境 硬件:Macbook pro Retina 13 系统:10.11.3 EI Capitan Xcode:7.0 Ps:配置刚刚够用. 安 ...
- POJ_1742_Coins_(动态规划,多重部分和)
描述 http://poj.org/problem?id=1742 n种不同面额的硬币 ai ,每种各 mi 个,判断可以从这些数字值中选出若干使它们组成的面额恰好为 k 的 k 的个数. 原型: n ...
- PrintWriter out = response.getWriter() 输出中文乱码问题
HttpServletResponse response = ServletActionContext.getResponse(); response.setCharacterEncod ...
- 遍历Dataset并输出数据实例
转自:http://www.cnblogs.com/csdm/archive/2010/02/02/1661808.html <%@ Page Language="C#" A ...
- HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))
Equation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- C中位域的使用
一.位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一 ...
- Cogs 309. [USACO 3.2] 香甜的黄油 dijkstra,堆,最短路,floyd
题目:http://cojs.tk/cogs/problem/problem.php?pid=309 309. [USACO 3.2] 香甜的黄油 ★★ 输入文件:butter.in 输出文件 ...
- 使用alloctor模板来实现string类
虽然以前做过更复杂的各种数据结构,不过那只是在看完c++prime7章后做的,没有考虑到类的拷贝体现出来是类值还是类指针,于是写了一些半成品类,不过那些主要是练数据结构,不想再改,于是就想办法模仿了下 ...
- Nginx+tomcat负载均衡并动静态分离
Nginx使用正则表达式配置location,指定某些后缀的文件直接从文件路径中找(如*.jpg直接去C:/XX/XX/XX/img下找),其他的请求转发给tomcat 同时可以配置多个tomcat ...