现在的位置: 首页 > 综合 > 正文

base64加密,解密 java参考

2013年08月07日 ⁄ 综合 ⁄ 共 5226字 ⁄ 字号 评论关闭

一、编码规则:

Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。
例如字符串“张3” :
11010101 11000101 00110011
转换后:
00110101 00011100 00010100 00110011
用十进制表示即为:53 34 20 51
这个并不是最终的结果,还需要根据Base64的编码表查询出转换后的值。下面就是BASE64编码表:

Table 1: The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
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 (pad) =
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y

以上一共是64个编码,这也是Base64名称的由来,编码的编号对应的是得出的新字节的十进制值。因此,上例中字符串“张3”经过编码后就成了字符串“1iUz”了。

当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。譬如结果若最后余下的为2个字节的“张”:
字符串“张”
11010101 HEX:D5 11000101 HEX:C5

00110101 00011100 00010100
十进制53 十进制34 十进制20 pad
字符’1’ 字符’i’ 字符’U’ 字符’=’ 

这样,最后的2个字节被整理成了“1iU=”。
同理,若原代码只剩下一个字节,那么将会添加两个“=”。只有这两种情况,所以,Base64的编码最多会在编码结尾有两个“=”

注意:根据RFC822规定,每76个字符,还需要加上一个回车换行。


二、编码和解码

      在JAVA中要实现Base64的编码和解码是非常容易的,因为JDK中已经有提供有现成的类:


    编码:

String src ="BASE64编码测试";

sun.misc.BASE64Encoder en = new sun.misc.BASE64Encoder();

String encodeStr = en.encode(src.getBytes());

注意:当encodeStr的长度超过76时,会包含有回车和换行符


    解码:

sun.misc.BASE64Decoder dec = new sun.misc.BASE64Decoder();

byte[] data = dec.decodeBuffer(decodeStr);


注:sun的base64加密极其不推荐使用。

下面介绍apache的base64加密:

————————————————————————————————————————————

  1. import org.apache.commons.codec.binary.Base64;  
  2. import org.apache.commons.codec.digest.DigestUtils;    
  3. import org.junit.Test;  
  4. /**  
  5.  * @author liuxinglanyue  
  6.  * @since 2010-12-21 
  7.  * @version $Revision$  
  8.  */    
  9. public class MD5Test   
  10. {    
  11.     //被加密的文字串    
  12.     static final String TARGET = "changeme";    
  13.       
  14.     /* 
  15.      * 不可逆算法  MD5 
  16.      */  
  17.     @Test  
  18.     public void Md5()  
  19.     {  
  20.         String str = DigestUtils.md5Hex(TARGET);  
  21.         print("md5Hex:     "+str);  
  22.     }  
  23.     /* 
  24.      * 不可逆算法  SHA1 
  25.      */  
  26.     @Test  
  27.     public void Sha1()  
  28.     {  
  29.         String str = DigestUtils.shaHex(TARGET);  
  30.         print("shaHex:     "+str);  
  31.         str = DigestUtils.sha256Hex(TARGET);  
  32.         print("sha256Hex:  "+str);  
  33.         str = DigestUtils.sha384Hex(TARGET);  
  34.         print("sha384Hex:  "+str);  
  35.         str = DigestUtils.sha512Hex(TARGET);  
  36.         print("sha512Hex:  "+str);  
  37.     }  
  38.       
  39.     /* 
  40.      * 可逆算法  BASE64 
  41.      */  
  42.     @Test  
  43.     public void Base64()  
  44.     {  
  45.         //加密  
  46.         byte[] b = Base64.encodeBase64(TARGET.getBytes(), true);  
  47.         String str = new String(b);  
  48.         print("BASE64:     "+str);  
  49.           
  50.         //解密  
  51.         byte[] b1 = Base64.decodeBase64(str);  
  52.         print("解密之后内容为:  "+new String(b1));  
  53.     }  
  54.     public void print(Object obj)  
  55.     {  
  56.         System.out.println(obj);  
  57.     }  




一、编码规则:

Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。
例如字符串“张3” :
11010101 11000101 00110011
转换后:
00110101 00011100 00010100 00110011
用十进制表示即为:53 34 20 51
这个并不是最终的结果,还需要根据Base64的编码表查询出转换后的值。下面就是BASE64编码表:

Table 1: The Base64 Alphabet
Value Encoding Value Encoding Value Encoding Value Encoding
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 (pad) =
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y

以上一共是64个编码,这也是Base64名称的由来,编码的编号对应的是得出的新字节的十进制值。因此,上例中字符串“张3”经过编码后就成了字符串“1iUz”了。

当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。譬如结果若最后余下的为2个字节的“张”:
字符串“张”
11010101 HEX:D5 11000101 HEX:C5

00110101 00011100 00010100
十进制53 十进制34 十进制20 pad
字符’1’ 字符’i’ 字符’U’ 字符’=’ 

这样,最后的2个字节被整理成了“1iU=”。
同理,若原代码只剩下一个字节,那么将会添加两个“=”。只有这两种情况,所以,Base64的编码最多会在编码结尾有两个“=”

注意:根据RFC822规定,每76个字符,还需要加上一个回车换行。


二、编码和解码

      在JAVA中要实现Base64的编码和解码是非常容易的,因为JDK中已经有提供有现成的类:


    编码:

String src ="BASE64编码测试";

sun.misc.BASE64Encoder en = new sun.misc.BASE64Encoder();

String encodeStr = en.encode(src.getBytes());

注意:当encodeStr的长度超过76时,会包含有回车和换行符


    解码:

sun.misc.BASE64Decoder dec = new sun.misc.BASE64Decoder();

byte[] data = dec.decodeBuffer(decodeStr);


注:sun的base64加密极其不推荐使用。

下面介绍apache的base64加密:

————————————————————————————————————————————

  1. import org.apache.commons.codec.binary.Base64;  
  2. import org.apache.commons.codec.digest.DigestUtils;    
  3. import org.junit.Test;  
  4. /**  
  5.  * @author liuxinglanyue  
  6.  * @since 2010-12-21 
  7.  * @version $Revision$  
  8.  */    
  9. public class MD5Test   
  10. {    
  11.     //被加密的文字串    
  12.     static final String TARGET = "changeme";    
  13.       
  14.     /* 
  15.      * 不可逆算法  MD5 
  16.      */  
  17.     @Test  
  18.     public void Md5()  
  19.     {  
  20.         String str = DigestUtils.md5Hex(TARGET);  
  21.         print("md5Hex:     "+str);  
  22.     }  
  23.     /* 
  24.      * 不可逆算法  SHA1 
  25.      */  
  26.     @Test  
  27.     public void Sha1()  
  28.     {  
  29.         String str = DigestUtils.shaHex(TARGET);  
  30.         print("shaHex:     "+str);  
  31.         str = DigestUtils.sha256Hex(TARGET);  
  32.         print("sha256Hex:  "+str);  
  33.         str = DigestUtils.sha384Hex(TARGET);  
  34.         print("sha384Hex:  "+str);  
  35.         str = DigestUtils.sha512Hex(TARGET);  
  36.         print("sha512Hex:  "+str);  
  37.     }  
  38.       
  39.     /* 
  40.      * 可逆算法  BASE64 
  41.      */  
  42.     @Test  
  43.     public void Base64()  
  44.     {  
  45.         //加密  
  46.         byte[] b = Base64.encodeBase64(TARGET.getBytes(), true);  
  47.         String str = new String(b);  
  48.         print("BASE64:     "+str);  
  49.           
  50.         //解密  
  51.         byte[] b1 = Base64.decodeBase64(str);  
  52.         print("解密之后内容为:  "+new String(b1));  
  53.     }  
  54.     public void print(Object obj)  
  55.     {  
  56.         System.out.println(obj);  
  57.     }  




抱歉!评论已关闭.