Topquan's Blog

          分享價值----成就你我----我的博客----你的家

          Base64加密算法

          原理:
                Base64 使用US-ASCII子集的64個字符,即大小寫的26個英文字母,0-9,+,/。
          編碼總是基于3個字符,每個字符用8位二進制表示,因此一共24位,再分為4四組,每組6位,表示一個Base64的值。如下:
          "A", "B", "C", "D", "E", "F", "G", "H", "I","J", "K", "L", "M", "N", "O", "P",
          "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f",
          "g", "h", "i","j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
          "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/"
          Base64值為0就是A,為27的就是b。這樣,每3個字符產(chǎn)生4位的Base64字符。如果被加密的字符串每3個一組,還剩1或2個字符,使用特殊字符"="補齊Base64的4字。

          如,編碼只有2個字符“me”,m的ascii是109,e的是101,用二進制表示分別是01101101、01100101,連接起來就是0110110101100101,再按6位分為一組:011011、010110、010100(不足6位補0),分別ascii分別是27、22、20,即Base64值為bWU,Base64不足4字,用=補齊,因此bWU=就me的Base64值。

          用java的按位邏輯和移位運算就可以實現(xiàn)該算法。但實際上,并不用我們自己去編程實現(xiàn)。現(xiàn)有實現(xiàn)該加密解密算法的程序很多,如javamail的MimeUtility。

          實踐:javamail的MimeUtility實現(xiàn)對字符串的加密解密

          第一步,在eclipse新建一個java項目,并引進javamail.jar
          第二步,在com.mascot.encrypt包下創(chuàng)建測試單元,注意引進javax.mail.internet.MimeUtility
          package com.mascot.encrypt;

          import java.io.BufferedReader;
          import java.io.ByteArrayInputStream;
          import java.io.ByteArrayOutputStream;
          import java.io.InputStreamReader;

          import javax.mail.internet.MimeUtility;

          public class Base64 {

            public static BufferedReader decode(String b64string) throws Exception {
              return new BufferedReader(
                      new InputStreamReader(
                        MimeUtility.decode(
                            new ByteArrayInputStream(
                              b64string.getBytes()), "base64")));
            }
            public static void main(String args[]) throws Exception{
                System.out.println(encodeAsString("hello"));
                System.out.println(decodeAsString("aGVsbG8="));
                System.out.println(decodeAsString("aGVsbG8A"));
             
            }

            public static String decodeAsString(String b64string) throws Exception {
              if (b64string == null) {
                  return b64string;
              }
              String returnString = decode(b64string).readLine();
              if (returnString == null) {
                  return returnString;
              }
              return returnString.trim();
            }

            public static ByteArrayOutputStream encode(String plaintext)
                  throws Exception {
              ByteArrayOutputStream out = new ByteArrayOutputStream();
              byte[] in = plaintext.getBytes();
              ByteArrayOutputStream inStream = new ByteArrayOutputStream();
              inStream.write(in, 0, in.length);
              //補0
              if ((in.length % 3 ) == 1){
                  inStream.write(0);
                  inStream.write(0);
              } else if((in.length % 3 ) == 2){
                  inStream.write(0);
              }
              inStream.writeTo( MimeUtility.encode(out, "base64") );
              return out;
            }

            public static String encodeAsString(String plaintext) throws Exception {
              return encode(plaintext).toString();
            }
          }
          第三步,運行程序,結(jié)果:
          aGVsbG8A
          hello
          hello

          注意到hello的加密結(jié)果并不是aGVsbG8=,而是aGVsbG8A,這是因為程序補齊都是補0,而0對應的Base64值就是A,這是我們程序?qū)崿F(xiàn)與上述理論不同造成的。

          posted on 2006-10-14 16:21 topquan 閱讀(7727) 評論(0)  編輯  收藏 所屬分類: Classical Arithmetic


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 遵义市| 祁东县| 贵德县| 灵丘县| 惠州市| 富宁县| 多伦县| 新沂市| 安徽省| 长白| 家居| 新竹市| 雷州市| 友谊县| 平泉县| 蒙自县| 许昌县| 手机| 黔江区| 山东省| 牙克石市| 彰化市| 义乌市| 余庆县| 武乡县| 册亨县| 镇巴县| 巴彦淖尔市| 庄浪县| 阿巴嘎旗| 封丘县| 新田县| 漯河市| 甘孜县| 阜康市| 关岭| 通江县| 黄平县| 监利县| 镇江市| 大安市|