蜀山劍俠
          總結(jié)另外一個(gè)人生
          posts - 0,comments - 7,trackbacks - 0

          Java BASE64加密解密

           

          Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)代碼的編碼方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的詳細(xì)規(guī)范。Base64編碼可用于在HTTP環(huán)境下傳遞較長(zhǎng)的標(biāo)識(shí)信息。例如,在Java Persistence系統(tǒng)Hibernate中,就采用了Base64來將一個(gè)較長(zhǎng)的唯一標(biāo)識(shí)符(一般為128-bit的UUID)編碼為一個(gè)字符串,用作HTTP表單和HTTP GET URL中的參數(shù)。在其他應(yīng)用程序中,也常常需要把二進(jìn)制數(shù)據(jù)編碼為適合放在URL(包括隱藏表單域)中的形式。此時(shí),采用Base64編碼不僅比較簡(jiǎn)短,同時(shí)也具有不可讀性,即所編碼的數(shù)據(jù)不會(huì)被人用肉眼所直接看到。

           

          RFC2045還規(guī)定每行位76個(gè)字符,每行末尾需添加一個(gè)回車換行符,即便是最后一行不夠76個(gè)字符,也要加換行符。

           

          實(shí)現(xiàn)原理

           

          Base64實(shí)際上是對(duì)二進(jìn)制碼做分組轉(zhuǎn)換操作

          1.每3個(gè)8位二進(jìn)制碼位一組,轉(zhuǎn)換為4個(gè)6位二進(jìn)制碼為一組(不足6位時(shí)地位補(bǔ)0)。3個(gè)8位二進(jìn)制碼和4個(gè)6位二進(jìn)制碼長(zhǎng)度都是24位。

          2.對(duì)獲得的4個(gè)6位二進(jìn)制碼補(bǔ)位,每個(gè)6位二進(jìn)制碼添加兩位高位0,組成4個(gè)8位二進(jìn)制碼。

          3.將獲得的4個(gè)8位二進(jìn)制碼轉(zhuǎn)換為4個(gè)十進(jìn)制碼。

          4.將獲得的十進(jìn)制碼轉(zhuǎn)換為Base64字符表中對(duì)應(yīng)的字符。

           

           

           

          字符串“A”,進(jìn)行Base64編碼,如下所示:

           

          字符                A

          ASCII碼           65

          二進(jìn)制碼          01000001

           

          4個(gè)6位二進(jìn)制碼 010000          010000

          4個(gè)8位二進(jìn)制碼 00010000       00010000

          十進(jìn)制碼          16                 16

          字符表映射碼     Q                  Q                   =                 =

           

           

          字符串“A”經(jīng)過Base64編碼后得到字符串“QQ==”。

          結(jié)果出現(xiàn)了兩個(gè)等號(hào)。很顯然,當(dāng)原文的二進(jìn)制碼長(zhǎng)度不足24位,最終轉(zhuǎn)換為十進(jìn)制時(shí)也不足4項(xiàng),這時(shí)就需要用等號(hào)補(bǔ)位。

          將Base64編碼后的字符串最多會(huì)有2個(gè)等號(hào),這時(shí)因?yàn)椋?/p>

          余數(shù) = 原文字節(jié)數(shù) MOD 3。

           

           

           

           

           

           

           

          字符串“密”,對(duì)其使用UTF-8編碼等到Byte數(shù)組{-27,-81,-122},

           

          字符                密

          UTF-8編碼        -27                -81               -122

          二進(jìn)制碼          11100101       10101111       10000110

          4個(gè)6位二進(jìn)制碼 111001          011010           111110          000110

          4個(gè)8位二進(jìn)制碼 00111001       00011010       00111110       00000110

          十進(jìn)制碼          57                 26                  62                6

          字符表映射碼     5                   a                   +                 G

           

          字符串“密”經(jīng)過Base64編碼后得到字符串“5a+G”。

           

           

          對(duì)照表:

           

           

          索引 對(duì)應(yīng)字符 索引 對(duì)應(yīng)字符 索引 對(duì)應(yīng)字符 索引 對(duì)應(yīng)字符
          0 A 17 R 34 i 51 z
          1 B 18 S 35 j 52 0
          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實(shí)現(xiàn)

           

          1.JDK實(shí)現(xiàn):

          Java代碼  收藏代碼
          1. import sun.misc.BASE64Decoder;     
          2. import sun.misc.BASE64Encoder;     
          3.     
          4. /**   
          5.  * BASE64加密解密   
          6.  */    
          7. public class BASE64     
          8. {     
          9.     
          10.     /**    
          11.      * BASE64解密   
          12.    * @param key          
          13.      * @return          
          14.      * @throws Exception          
          15.      */              
          16.     public static byte[] decryptBASE64(String key) throws Exception {               
          17.         return (new BASE64Decoder()).decodeBuffer(key);               
          18.     }               
          19.                   
          20.     /**         
          21.      * BASE64加密   
          22.    * @param key          
          23.      * @return          
          24.      * @throws Exception          
          25.      */              
          26.     public static String encryptBASE64(byte[] key) throws Exception {               
          27.         return (new BASE64Encoder()).encodeBuffer(key);               
          28.     }       
          29.          
          30.     public static void main(String[] args) throws Exception     
          31.     {     
          32.         String data = BASE64.encryptBASE64("http://aub.iteye.com/".getBytes());     
          33.         System.out.println("加密前:"+data);     
          34.              
          35.         byte[] byteArray = BASE64.decryptBASE64(data);     
          36.         System.out.println("解密后:"+new String(byteArray));     
          37.     }     
          38. }    
          39.    

             注意,sun.misc包是Sun公司提供給內(nèi)部使用的專用API,在java API文檔中我們看不到任何有關(guān)BASE64影子,不建議使用。

           

           

          2.Apache的實(shí)現(xiàn):(建議使用這種方式,當(dāng)然,自己實(shí)現(xiàn)也可以)

           參考org.apache.commons.codec.binary.Base64
          下載地址:
          http://commons.apache.org/codec/download_codec.cgi

           

          Apache還提供了,非標(biāo)準(zhǔn)的實(shí)現(xiàn)方式:

          1.不再添加回車符。

          2.Url Base64,也就是將“+”和“\”換成了“-”和“_”符號(hào),且不適用補(bǔ)位。

          posted on 2012-03-30 16:35 蜀山劍俠 閱讀(50815) 評(píng)論(7)  編輯  收藏

          FeedBack:
          # re: Java BASE64加密解密
          2012-12-09 10:49 | gfgfgfg
          # re: Java BASE64加密解密[未登錄]
          2014-06-03 18:13 | 123
          <script>alert('你好')</script>  回復(fù)  更多評(píng)論
            
          # re: Java BASE64加密解密
          2014-06-27 00:14 | 11
          <h1>呵呵</h1>  回復(fù)  更多評(píng)論
            
          # re: Java BASE64加密解密
          2014-08-04 17:13 | asdf
          # re: Java BASE64加密解密
          2014-08-04 17:14 | asdf
          &#x003c;&#x0073;&#x0063;&#x0072;&#x0069;&#x0070;&#x0074;&#x003e;&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;&#x0028;&#x0031;&#x0031;&#x0029;&#x003c;&#x002f;&#x0073;&#x0063;&#x0072;&#x0069;&#x0070;&#x0074;&#x003e;  回復(fù)  更多評(píng)論
            
          # re: Java BASE64加密解密
          2014-08-04 17:14 | asdf
          \x3c\x73\x63\x72\x69\x70\x74\x3e\x61\x6c\x65\x72\x74\x28\x31\x31\x29\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e  回復(fù)  更多評(píng)論
            
          # re: Java BASE64加密解密
          2014-12-02 16:06 | 11
          <script>alert('你好')</script>  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 敦化市| 合江县| 孟州市| 富阳市| 绍兴县| 揭西县| 遵义县| 景泰县| 芜湖县| 洪泽县| 德州市| 株洲县| 台江县| 合江县| 东山县| 芜湖市| 化德县| 建阳市| 建瓯市| 伊吾县| 南充市| 丰县| 贵南县| 孟津县| 秦皇岛市| 林西县| 蒙山县| 二连浩特市| 台中市| 潼关县| 宁都县| 大关县| 葫芦岛市| 从江县| 轮台县| 定州市| 山西省| 砀山县| 浮梁县| 淳安县| 土默特左旗|