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

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

原理


  1. 所有转换完成的密文中的任意一个字符,都是下面转换表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);
    
    }

    参考链接

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

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

    猜你喜欢

    转载自blog.csdn.net/cmqwan/article/details/82425163
    今日推荐