Base64加密算法原理、具体例子及Java代码.md

Posted by lizhao on 07-09,2019

Base64加密算法原理、具体例子及Java代码

[toc]

原理

  1. 所有转换完成的密文中的任意一个字符,都是下面转换表64个中的一个

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

  1. 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);

}

参考链接

Base64 算法原理,以及编码、解码【加密、解密】 介绍

最全的加密算法之对称加密和非对称加密