MD5加密,解密算法原理

 Base64编码,是我们程序开发中经常使用到的编码方法。它是一种基于64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码的方法!也是MIME(多用途互联网邮件扩展,主要用作电子邮件标准)中一种可打印字符表示二进制数据的常见编码方法!它其实只是定义用可打印字符传输内容一种方法,并不会产生新的字符集!

Base64实现编码原理
  
它是用64个可打印字符表示二进制所有数据方法。由于26=64,所以可以用每6个位元(6个1或0)位一个单位,对应某个可打印字符。我们知道三个字节有24个位元,就可以刚好对应于4个Base64单元,即3个字节需要4个Base64的可打印字符来表示。在Base64中的可打印字符包括字母A-Z,a-z,数字0-9,这样共有62个字符,刺猬两个打印符号在不同的系统中一般有所不同。但是,我们经常所说的Base64另外2个字符是:“+/”。这64个字符,所对应表如下。
 
 
转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择上表中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
 
  如果最后剩下两个输入数据,在编码结果后加2个“=”;如果最后剩下一个输入数据,在编码结果后加1个“=”,如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
 
编码后的数据比原始数据略长,为原来的4/3。无论什么样的字符都会全部被编码。因此不像Quoted-printable 编码,还保留部分可打印字符。所以,它的可读性不如Quoted-printable编码!
 
 
M的Ascii码是77,前六位对应值为19,对应base64字符为T,如此类推。其他字符编码就而自动转换得到。我们看看不是刚好3个字节的情况!
 
 
Java实现Base64编码、解码
  1 package urlConnection;
  2 import java.io.ByteArrayOutputStream;
  3 public class Base64 {
  4     private static char[] base64EncodeChars = new char[] { 'A', 'B', 'C', 'D',
  5             'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q',
  6             'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
  7             'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
  8             'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3',
  9             '4', '5', '6', '7', '8', '9', '+', '/' };
 10     private static byte[] base64DecodeChars = new byte[] { -1, -1, -1, -1, -1,
 11             -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 12             -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 13             -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59,
 14             60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
 15             10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1,
 16             -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
 17             38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1,
 18             -1, -1 };
 19     private Base64() {
 20     }
 21     
 22     /**
 23      * Base64编码
 24      * Administrator
 25      * 2015年11月25日 上午10:34:28
 26      * @param data
 27      * @return
 28      */
 29     public static String encode(byte[] data) {
 30         StringBuffer sb = new StringBuffer();
 31         int len = data.length;
 32         int i = 0;
 33         int b1, b2, b3;
 34         while (i < len) {
 35             b1 = data[i++] & 0xff;
 36             if (i == len) {
 37                 sb.append(base64EncodeChars[b1 >>> 2]);
 38                 sb.append(base64EncodeChars[(b1 & 0x3) << 4]);
 39                 sb.append("==");
 40                 break;
 41             }
 42             b2 = data[i++] & 0xff;
 43             if (i == len) {
 44                 sb.append(base64EncodeChars[b1 >>> 2]);
 45                 sb.append(base64EncodeChars[((b1 & 0x03) << 4)
 46                         | ((b2 & 0xf0) >>> 4)]);
 47                 sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);
 48                 sb.append("=");
 49                 break;
 50             }
 51             b3 = data[i++] & 0xff;
 52             sb.append(base64EncodeChars[b1 >>> 2]);
 53             sb.append(base64EncodeChars[((b1 & 0x03) << 4)
 54                     | ((b2 & 0xf0) >>> 4)]);
 55             sb.append(base64EncodeChars[((b2 & 0x0f) << 2)
 56                     | ((b3 & 0xc0) >>> 6)]);
 57             sb.append(base64EncodeChars[b3 & 0x3f]);
 58         }
 59         return sb.toString();
 60     }
 61     
 62     /**
 63      * Base64解码
 64      * Administrator
 65      * 2015年11月25日 上午10:34:43
 66      * @param str
 67      * @return
 68      */
 69     public static byte[] decode(String str) {
 70         byte[] data = str.getBytes();
 71         int len = data.length;
 72         ByteArrayOutputStream buf = new ByteArrayOutputStream(len);
 73         int i = 0;
 74         int b1, b2, b3, b4;
 75         while (i < len) {
 76             /* b1 */
 77             do {
 78                 b1 = base64DecodeChars[data[i++]];
 79             } while (i < len && b1 == -1);
 80             if (b1 == -1) {
 81                 break;
 82             }
 83             /* b2 */
 84             do {
 85                 b2 = base64DecodeChars[data[i++]];
 86             } while (i < len && b2 == -1);
 87             if (b2 == -1) {
 88                 break;
 89             }
 90             buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4)));
 91             /* b3 */
 92             do {
 93                 b3 = data[i++];
 94                 if (b3 == 61) {
 95                     return buf.toByteArray();
 96                 }
 97                 b3 = base64DecodeChars[b3];
 98             } while (i < len && b3 == -1);
 99             if (b3 == -1) {
100                 break;
101             }
102             buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2)));
103             /* b4 */
104             do {
105                 b4 = data[i++];
106                 if (b4 == 61) {
107                     return buf.toByteArray();
108                 }
109                 b4 = base64DecodeChars[b4];
110             } while (i < len && b4 == -1);
111             if (b4 == -1) {
112                 break;
113             }
114             buf.write((int) (((b3 & 0x03) << 6) | b4));
115         }
116         return buf.toByteArray();
117     }
118 }

 在上述代码中>>>和>>作用一样的,因为都是正数进行位运算。


 

 

posted @ 2016-10-31 20:30  久眠深巷  阅读(354)  评论(0)    收藏  举报