Base64加密算法原理、具体例子及Java代码
原理
- 所有转换完成的密文中的任意一个字符,都是下面转换表64个中的一个
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/Base64二进制数6位为一个单元(所以总字符数只能是64),一个字节有8位,所以可以说:3个原字符将会转换成4个Base64密文。
转换过程
先将要转换的数据转成二进制数据
根据ASCII编码值进行转换
补位
在每24个二进制位中:
6位为一个单位,不够先补0。
6位都是0,转换成等号。
转换
根据这个转换表获取不同
示例
下面的示例包含了无需补位、补1位和补2位的转换
代码实现
Java
这个可以直接使用java自带的函数(java 8之后)
final Base64.Decoder decoder = Base64.getDecoder();
final Base64.Encoder encoder = Base64.getEncoder();
final String text = "字串文字";
final byte[] textByte = text.getBytes("UTF-8");
//编码
final String encodedText = encoder.encodeToString(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(decoder.decode(encodedText), "UTF-8"));
final Base64.Decoder decoder = Base64.getDecoder();
final Base64.Encoder encoder = Base64.getEncoder();
final String text = "字串文字";
final byte[] textByte = text.getBytes("UTF-8");
//编码
final String encodedText = encoder.encodeToString(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(decoder.decode(encodedText), "UTF-8"));
或者使用 org.apache.commons中的函数
import java.io.IOException;
import org.apache.commons.codec.binary.Base64;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* 该类是Base64算法的实现
*/
public class JavaBase64 {
private static String src = "面向对象编程,object-oriented!@#*5"; // 需要加密的原始字符串
public static void main(String[] args) throws IOException {
System.out.println("原始字符串:\t\t\t" + src);
System.out.println();
jdkBase64();
System.out.println();
commonsCodecBase64();
System.out.println();
bouncyCastleBase64();
}
/** JDK实现Base64编码 */
public static void jdkBase64() throws IOException{
//如果这里没有出现sun的base64可以从Build Path中删除然后添加
BASE64Encoder encoder = new BASE64Encoder();
String encode = encoder.encode(src.getBytes());//编码
BASE64Decoder decoder = new BASE64Decoder();
String decode = new String(decoder.decodeBuffer(encode));//解码
System.out.println("JDK实现的base64编码:\t\t" + encode);
System.out.println("JDK实现的base64解码:\t\t" + decode);
}
/** Commons Codec实现base64编码 */
public static void commonsCodecBase64() {
byte[] encode = Base64.encodeBase64(src.getBytes());
byte[] decode = Base64.decodeBase64(encode);
System.out.println("Commons Codec实现base64编码:\t" + new String(encode));
System.out.println("Commons Codec实现base64解码:\t" + new String(decode));
}
/**Bouncy Castle实现base64编码 */
public static void bouncyCastleBase64() {
byte[] encode = org.bouncycastle.util.encoders.Base64.encode(src.getBytes());
byte[] decode = org.bouncycastle.util.encoders.Base64.decode(encode);
System.out.println("Bouncy Castle实现base64编码:\t"+new String(encode));
System.out.println("Bouncy Castle实现base64解码:\t"+new String(decode));
}
}
PHP
<?php
/**
*base64编码方法、本方法只是做base64转换过程代码举例说明,通过该例子可以任意改造不同语言版
*@author 程默
*@copyright http://blog.chacuo.net
*@param $src 原字符串
*@return string base64字符串*
*/
function c_base64_encode($src)
{
static $base="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
////将原始的3个字节转换为4个字节
$slen=strlen($src);
$smod = ($slen%3);
$snum = floor($slen/3);
$desc = array();
for($i=0;$i<$snum;$i++)
{
////读取3个字节
$_arr = array_map('ord',str_split(substr($src,$i*3,3)));
///计算每一个base64值
$_dec0= $_arr[0]>>2;
$_dec1= (($_arr[0]&3)<<4)|($_arr[1]>>4);
$_dec2= (($_arr[1]&0xF)<<2)|($_arr[2]>>6);
$_dec3= $_arr[2]&63;
$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$base[$_dec2],$base[$_dec3]));
}
if($smod==0) return implode('',$desc);
///计算非3倍数字节
$_arr = array_map('ord',str_split(substr($src,$snum*3,3)));
$_dec0= $_arr[0]>>2;
///只有一个字节
if(!isset($_arr[1]))
{
$_dec1= (($_arr[0]&3)<<4);
$_dec2=$_dec3="=";
}
else
{
///2个字节
$_dec1= (($_arr[0]&3)<<4)|($_arr[1]>>4);
$_dec2= $base[($_arr[1]&7)<<2];
$_dec3="=";
}
$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$_dec2,$_dec3));
return implode('',$desc);
}