zoukankan      html  css  js  c++  java
  • java单向加密算法小结(1)--Base64算法

      从这一篇起整理一下常见的加密算法以及在java中使用的demo,首先从最简单的开始.

    简单了解

         Base64严格来说并不是一种加密算法,而是一种编码/解码的实现方式.

      我们都知道,数据在计算机网络之间是使用字节流的方式进行传递的,所有的信息都要最终转换为0101的二进制,这本身就涉及到编码,解码的应用.

      Base64,顾名思义,是使用了64个基本的字符来对任意数据进行编码的一种实现方式,那既然有Base64,是不是也有Base32,Base16呢? 答案是没错,有.

      下面先看一下Base64的编码表:

         

      由图可见,Base64使用了26个字母的大小写,也就是52个字符,再加上10个数字和两个特殊的"+","/"组成,一共64个字符,其中最后两个字符选取不一定总是这两个.

    java代码实现

      首先看代码,然后再细说Base64实现的原理和应用:

     1 package com.wang.encryption;
     2 import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
     3 import sun.misc.BASE64Decoder;
     4 import sun.misc.BASE64Encoder;
     5 import java.io.IOException;
     6 /**
     7  * @author yogo.wang
     8  * @date 2016/11/03-下午3:58.
     9  */
    10 public class Base64Test {
    11 
    12     public static void main(String[] args) throws IOException {
    13 
    14         String msg="wang";
    15         byte[] bys=msg.getBytes("utf-8");
    16 
    17         /**
    18          * 使用BASE64 加密(编码)
    19          */
    20         //第一种方式
    21         BASE64Encoder base64Encoder=new BASE64Encoder();
    22         String s = base64Encoder.encodeBuffer(bys);
    23         System.out.println(s);
    24         System.out.println("---------------------");
    25         //第二种方式
    26         String s1 = Base64.encode(bys);
    27         System.out.println(s1);
    28         System.out.println("---------------------");
    29         /**
    30          * 使用BASE64 解密(解码)
    31          */
    32         //第一种方式
    33         BASE64Decoder base64Decoder=new BASE64Decoder();
    34         byte[] bys2 = base64Decoder.decodeBuffer(s);
    35         System.out.println(new String(bys2));
    36         System.out.println("---------------------");
    37         //第二种方式
    38         byte[] bys3 = Base64.decode(s);
    39         System.out.println(new String(bys3));
    40 
    41 
    42     }
    43 }

    输出结果如下:

    d2FuZw==

    ---------------------
    d2FuZw==
    ---------------------
    wang
    ---------------------
    wang

    原理和应用

      根据代码,可以看到,字符"wang"通过Base64的编码转化成了一个字符串"d2FuZw==",那么到底内部是怎么实现的呢?

      Base64使用了64的字符,那么只需要6个二进制位就可以表示,但是一个Base64字符是8个二进制位的,即8Bit,也就是说Base64在6Bit的基础上在左边加了俩0,所有它的左边两位永远为0.

      我们知道,一个字符是占了8位的,那怎么用6Bit表示8Bit的数呢,这好办,因为8和6的最小公倍数是24,那么,我用4个Base64的字符来表示3个常规的字符就可以了.

      知道了这些,我们就可以来看看"wang"这个字符串是怎么被编码成"d2FuZw=="的了.

      第一步:把常规字符转换为ASCII.

      第二步:把ASCII码转为8位2进制

      第三步:每6位2进制数划为一组

      第四步:将2进制转为10进制

      第五步:根据Base64编码表对应找出相应的字符

      对应下面的图:

      因为每三个常规字符,对应四个Base64字符,如果不够的话,会在后边补0,这里的"wang"是4个字符,不是3的整数倍,所以需要补0,那为什么编码的结果是"d2FuZw==",而不是"d2FuZwAA"呢? 

      原因其实也很简单,因为最后两个AA是没有实际意义的,并不携带有效信息,为了解码方便,Base64编码选择了使用"="来代替最后的"A",所以就是我们看到的"d2FuZw=="了.

      通过以上的过程我们可以发现,其实Base64是一种编码方式而非加密方式,因为它的编码解码过程是完全可逆的,且不需要额外信息,你只要有一张Base64的编码表就可以了,所以,不要将他用于对数据的加密.

    Base64的应用

      说了这么多,好像还是不太明白这种编码有什么必须存在的理由.....

      我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了(这段来自知乎)。

      不仅如此,比如说我们可以使用HTML来内嵌Base64编码的图片,这样就避免了不必要的外部资源加载,不过还是要量力而为,这种场景一般适用于尺寸比较小的图片,如果是高清图片,用这种方式会导致Base64编码后的字符串很大,反而影响加载速度.

      

  • 相关阅读:
    Android中ProgressDialog的应用
    Content的startActivity方法需添加FLAG_ACTIVITY_NEW_TASK flag
    android onKeydown
    8 个最优秀的 Android Studio 插件
    Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
    Android提供的LruCache类简介
    Android设计中的.9.png与Android Studio中的设置
    js实现双击后网页自己主动跑-------Day55
    Oracle经常使用函数
    《R实战》读书笔记三
  • 原文地址:https://www.cnblogs.com/fingerboy/p/6027519.html
Copyright © 2011-2022 走看看