首页 > 代码库 > java进阶12 Base64 UrlBase64 Hex 加密 解密技术

java进阶12 Base64 UrlBase64 Hex 加密 解密技术

  java的加密与解密技术:

  现在的加密技术主要有

  单向加密算法:以MD5 SHA算法为代表

  对称加密算法:以DES 三重DES AES PBE算法为代表

  非对称加密算法:以RSA为代表

  简要的说下这三种加密算法的区别

  

  先是单向加密算法,顾名思义,它不会有密钥,因为它是单向的,加密之后无法解密,就连程序猿都无法知道加密之后的东西是什么

  主要用处是数据完整性的验证。

  对称加密算法,其特征是公钥与私钥相同。一般用来数据储存,比如将数据加密之后存入数据库,那么数据库管理员就无法泄密数据库中的类容

  有密钥的人却可以根据密钥解密数据库中的真正数据。

  非对称加密算法,就是公钥与私钥不同,一般公钥公开,私钥在你想给人看到数据的人的手上,利用私钥来解密数据。它一般是用于数据传输的加密。

  先由浅入深,先说说伪加密 Base64 UrlBase64 Hex

  首先java api中没有实现这三个类,所以你需要下载jar包。

  

  就是这2个。

  先来说说Base64吧。

  新建它的类。

package Cipher;


import org.bouncycastle.util.encoders.Base64;

public class Base64Coder {
    /*
     * 经Base64编码后的字符串的字符数是以4为单位的整数倍
     * */
    public final static String ENCODING="UTF-8";
    //加密
    public static String encode(String data) throws Exception{
        byte[] b=Base64.encode(data.getBytes(ENCODING));//执行编码
        return new String(b,ENCODING);
    }
    //解密
    public static String decode(String data) throws Exception{
        byte[] b=Base64.decode(data.getBytes(ENCODING));//解密编码
        return new String(b,ENCODING);
    }
}

  然后在主函数中运行下。

  

package Cipher;

public class CipherTest {
    public static void main(String[] args) throws Exception{
        Base64Test();
    }
    
    /*
     * Base64编码
     * */
    static void Base64Test() throws Exception{
        String data="I love the Word 亲爱的世界";        
        System.out.println("编码前->"+data);
        String encipher=Base64Coder.encode(data);
        System.out.println("编码后->"+encipher);
        String decipher=Base64Coder.decode(encipher);
        System.out.println("解码后->"+decipher);
        System.out.println();
    }

}

输出结果:

编码前->I love the Word 亲爱的世界
编码后->SSBsb3ZlIHRoZSBXb3JkIOS6sueIseeahOS4lueVjA==
解码后->I love the Word 亲爱的世界

 

这就将这句 加密成SSBsb3ZlIHRoZSBXb3JkIOS6sueIseeahOS4lueVjA==

 这个加密后的东西是不是很熟悉,如果你经常在网页抓包的话,就会遇到这种东西

 有些网页Get提交的数据就是这个。

  =就是Base64的关键标志

  至于为什么说它是伪加密呢?

  因为SSBsb3ZlIHRoZSBXb3JkIOS6sueIseeahOS4lueVjA==给你字符映射表 你自己都能手动解出来。

  因为这个表示公开的,所以才说它是伪加密。

  接下来说说UrlBase64

  

package Cipher;


import org.bouncycastle.util.encoders.UrlBase64;

public class UrlBase64Coder {
    /*
     * Base64算法最初用于电子邮件系统,后经演变成为显示传递Url参数的一种编码方法
     * 将字符映射表中用作补位的"="换成"."
     * 并用"-"代替"+"
     * 用"_"代替"/"
     * 使得Base64编码符合Url参数规则,可以将二进制数据以Get方式进行传输
     * */
    public final static String ENCODING="UTF-8";
    
    //编码
    public static String encode(String data) throws Exception{
        byte[] b=UrlBase64.encode(data.getBytes(ENCODING));
        return new String(b,ENCODING);
    }
    
    //解码
    public static String decode(String data) throws Exception{
        byte[] b=UrlBase64.decode(data.getBytes(ENCODING));
        return new String(b,ENCODING);
    }
    
}

在主函数中运行下

public class CipherTest {
    public static void main(String[] args) throws Exception{
        Base64Test();
        UrlBase64Test();
        
    }
    
    /*
     * Base64编码
     * */
    static void Base64Test() throws Exception{
        String data="I love the Word 亲爱的世界";        
        System.out.println("编码前->"+data);
        String encipher=Base64Coder.encode(data);
        System.out.println("编码后->"+encipher);
        String decipher=Base64Coder.decode(encipher);
        System.out.println("解码后->"+decipher);
        System.out.println();
    }
    static void UrlBase64Test() throws Exception{
        String data="I love the Word 亲爱的世界";        
        System.out.println("编码前->"+data);
        String encipher=UrlBase64Coder.encode(data);
        System.out.println("编码后->"+encipher);
        String decipher=UrlBase64Coder.decode(encipher);
        System.out.println("解码后->"+decipher);
        System.out.println();
    }

}

输出结果:

看见这两个的区别没有, 只是=换成了.  再想想这个类的名字UrlBase64

 在网页上提交URL的时候 = 会被当成后面跟了参数

  所以这个UrlBase64 就是专门为URL参数加密而设计的。

Base64算法最初用于电子邮件系统,后经演变成为显示传递Url参数的一种编码方法
将字符映射表中用作补位的"="换成"."
并用"-"代替"+"
用"_"代替"/"
 使得Base64编码符合Url参数规则,可以将二进制数据以Get方式进行传输

 

最后说说Hex 这个类用于十六进制转换。

package Cipher;

import org.bouncycastle.util.encoders.Hex;

public class HexCoder {
    //Hex类用于十六进制转换,常配合摘要算法处理摘要值,以十六进制形式公示
    public static final String ENCODING="UTF-8";
    
    //编码
    public static String encode(String data) throws Exception{
        byte[] b=Hex.encode(data.getBytes(ENCODING));
        return new String(b,ENCODING);
    }
    //解码
    public static String decode(String data) throws Exception{
        byte[] b=Hex.decode(data.getBytes(ENCODING));
        return new String(b,ENCODING);
    }
}

在主函数中操作下

package Cipher;

public class CipherTest {
    public static void main(String[] args) throws Exception{
        
        HexTest();
    }
    


    static void HexTest()throws Exception{
        String data="I love the Word 亲爱的世界";        
        System.out.println("编码前->"+data);
        String encipher=HexCoder.encode(data);
        System.out.println("编码后->"+encipher);
        String decipher=HexCoder.decode(encipher);
        System.out.println("解码后->"+decipher);
        System.out.println();
    }
}

输出结果:

它就将语句转出十六进制。

关于加密解密先讲到这里。