天天看點

Java BASE64加密解密Java加密解密系列

Java加密解密系列

Java 加密解密基礎

Java byte數組與十六進制字元串互轉

Java BASE64加密解密

Java 加密解密之消息摘要算法(MD5 SHA MAC)

Java 加密解密之對稱加密算法DES

Java 加密解密之對稱加密算法DESede

Java 加密解密之對稱加密算法AES

Java 加密解密之對稱加密算法PBE

Java BASE64加密解密

Base64是網絡上最常見的用于傳輸8Bit位元組代碼的編碼方式之一,大家可以檢視RFC2045~RFC2049,上面有MIME的詳細規範。Base64編碼可用于在HTTP環境下傳遞較長的辨別資訊。例如,在Java Persistence系統Hibernate中,就采用了Base64來将一個較長的唯一辨別符(一般為128-bit的UUID)編碼為一個字元串,用作HTTP表單和HTTP GET URL中的參數。在其他應用程式中,也常常需要把二進制資料編碼為适合放在URL(包括隐藏表單域)中的形式。此時,采用Base64編碼不僅比較簡短,同時也具有不可讀性,即所編碼的資料不會被人用肉眼所直接看到。

RFC2045還規定每行位76個字元,每行末尾需添加一個回車換行符,即便是最後一行不夠76個字元,也要加換行符。

實作原理

Base64實際上是對二進制碼做分組轉換操作

1. 每3個8位二進制碼位一組,轉換為4個6位二進制碼為一組(不足6位時地位補0)。3個8位二進制碼和4個6位二進制碼長度都是24位。

2. 對獲得的4個6位二進制碼補位,每個6位二進制碼添加兩位高位0,組成4個8位二進制碼。

3. 将獲得的4個8位二進制碼轉換為4個十進制碼。

4. 将獲得的十進制碼轉換為Base64字元表中對應的字元。

例如:

  1. 字元串“A”,進行Base64編碼,如下所示:
    描述
    字元 A
    ASCII碼 65
    二進制碼 01000001
    4個6位二進制碼 010000 010000
    4個8位二進制碼 00010000 00010000
    十進制碼 16 16
    字元表映射碼 Q Q = =

    字元串“A”經過Base64編碼後得到字元串“QQ==”。

    結果出現了兩個等号。很顯然,當原文的二進制碼長度不足24位,最終轉換為十進制時也不足4項,這時就需要用等号補位。

    将Base64編碼後的字元串最多會有2個等号,這時因為:

    餘數 = 原文位元組數 MOD 3。

  2. 字元串“密”,對其使用UTF-8編碼等到Byte數組{-27,-81,-122},
    描述
    字元
    UTF-8編碼 -27 -81 -122
    二進制碼 11100101 10101111 10000110
    4個6位二進制碼 111001 011010 111110 000110
    4個8位二進制碼 00111001 00011010 00111110 00000110
    十進制碼 57 26 62 6
    字元表映射碼 5 a + G
    字元串“密”經過Base64編碼後得到字元串“5a+G”。

對照表:

索引 對應字元 索引 對應字元 索引 對應字元 索引 對應字元
A 17 R 34 i 51 z
1 B 18 S 35 j 52
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y

java實作

  1. JDK實作:
    import sun.misc.BASE64Decoder;  
    import sun.misc.BASE64Encoder;  
    
    /** * BASE64加密解密 */  
    public class BASE64 {  
        /** * BASE64解密 * @param key * @return * @throws Exception */  
        public static byte[] decryptBASE64(String key) throws Exception {  
            return (new BASE64Decoder()).decodeBuffer(key);  
        }  
    
        /** * BASE64加密 * @param key * @return * @throws Exception */  
        public static String encryptBASE64(byte[] key) throws Exception {  
            return (new BASE64Encoder()).encodeBuffer(key);  
        }  
    
        public static void main(String[] args) throws Exception {  
            String data = BASE64.encryptBASE64("http://aub.iteye.com/".getBytes());  
            System.out.println("加密前:" + data);  
            byte[] byteArray = BASE64.decryptBASE64(data);  
            System.out.println("解密後:" + new String(byteArray));  
        }  
    }  
               
    注意,sun.misc包是Sun公司提供給内部使用的專用API,在java API文檔中我們看不到任何有關BASE64影子,不建議使用。
  2. Apache的實作:(建議使用這種方式,當然,自己實作也可以)

    參考org.apache.commons.codec.binary.Base64

    下載下傳位址:http://commons.apache.org/codec/download_codec.cgi

    Apache還提供了,非标準的實作方式:

    • 不再添加回車符。
    • Url Base64,也就是将“+”和“\”換成了“-”和“_”符号,且不适用補位。

本文參考《java 加密與解密的藝術》,和百度百科。