给你们网站...自己下载..记得加分.^_^
http://www.programsalon.com/download.asp?type_id=35

解决方案 »

  1.   

    /*
     * $Header: /u/users20/santtu/src/java/MD5/RCS/MD5.java,v 1.5 1996/12/12 10:47:02 santtu Exp $
     *
     * MD5 in Java JDK Beta-2
     * written Santeri Paavolainen, Helsinki Finland 1996
     * (c) Santeri Paavolainen, Helsinki Finland 1996
     *
     * This library is free software; you can redistribute it and/or
     * modify it under the terms of the GNU Library General Public
     * License as published by the Free Software Foundation; either
     * version 2 of the License, or (at your option) any later version.
     * 
     * This library is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * Library General Public License for more details.
     * 
     * You should have received a copy of the GNU Library General Public
     * License along with this library; if not, write to the Free
     * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     * 
     * See http://www.cs.hut.fi/~santtu/java/ for more information on this
     * class.
     * 
     * This is rather straight re-implementation of the reference implementation
     * given in RFC1321 by RSA.
     *
     * Passes MD5 test suite as defined in RFC1321.
     *
     *
     * This Java class has been derived from the RSA Data Security, Inc. MD5 
     * Message-Digest Algorithm and its reference implementation. 
     *
     *
     * $Log: MD5.java,v $
     * Revision 1.5  1996/12/12 10:47:02  santtu
     * Changed GPL to LGPL
     *
     * Revision 1.4  1996/12/12 10:30:02  santtu
     * Some typos, State -> MD5State etc.
     *
     * Revision 1.3  1996/04/15 07:28:09  santtu
     * Added GPL statemets, and RSA derivate stametemetsnnts.
     *
     * Revision 1.2  1996/03/04 08:05:48  santtu
     * Added offsets to Update method
     *
     * Revision 1.1  1996/01/07 20:51:59  santtu
     * Initial revision
     *
     *//**
     * Contains internal state of the MD5 class
     */class MD5State {
      /**
       * 128-byte state 
       */
      int state[];  /**
       * 64-bit character count (could be true Java long?)
       */
      int count[];  /**
       * 64-byte buffer (512 bits) for storing to-be-hashed characters
       */
      byte buffer[];  public MD5State() {
        buffer = new byte[64];
        count = new int[2];
        state = new int[4];
        
        state[0] = 0x67452301;
        state[1] = 0xefcdab89;
        state[2] = 0x98badcfe;
        state[3] = 0x10325476;    count[0] = count[1] = 0;
      }  /** Create this State as a copy of another state */
      public MD5State (MD5State from) {
        this();    int i;    for (i = 0; i < buffer.length; i++)
          this.buffer[i] = from.buffer[i];
        
        for (i = 0; i < state.length; i++)
          this.state[i] = from.state[i];    for (i = 0; i < count.length; i++)
          this.count[i] = from.count[i];
      }
    };/**
     * Implementation of RSA's MD5 hash generator
     *
     * @version $Revision: 1.5 $
     * @author Santeri Paavolainen <[email protected]>
     */public class MD5 {
      /**
       * MD5 state
       */
      MD5State state;
     
      /**
       * If Final() has been called, finals is set to the current finals
       * state. Any Update() causes this to be set to null.
       */
      MD5State  finals;  /** 
       * Padding for Final()
       */
      static byte padding[] = {
        (byte) 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
      };  /**
       * Initialize MD5 internal state (object can be reused just by
       * calling Init() after every Final()
       */
      public synchronized void Init () {
        state = new MD5State();
        finals = null;
      }
      

  2.   


      /**
       * Class constructor
       */
      public MD5 () {
        this.Init();
      }  /**
       * Initialize class, and update hash with ob.toString()
       *
       * @param ob Object, ob.toString() is used to update hash
       * after initialization
       */
      public MD5 (Object ob) {
        this();
        Update(ob.toString());
      }  private int rotate_left (int x, int n) {
        return (x << n) | (x >>> (32 - n));
      }  /* I wonder how many loops and hoops you'll have to go through to
         get unsigned add for longs in java */  private int uadd (int a, int b) {
        long aa, bb;
        aa = ((long) a) & 0xffffffffL;
        bb = ((long) b) & 0xffffffffL;
        
        aa += bb;    return (int) (aa & 0xffffffffL);
      }  private int uadd (int a, int b, int c) {
        return uadd(uadd(a, b), c);
      }  private int uadd (int a, int b, int c, int d) {
        return uadd(uadd(a, b, c), d);
      }  private int FF (int a, int b, int c, int d, int x, int s, int ac) {
        a = uadd(a, ((b & c) | (~b & d)), x, ac);
        return uadd(rotate_left(a, s), b);
      }  private int GG (int a, int b, int c, int d, int x, int s, int ac) {
        a = uadd(a, ((b & d) | (c & ~d)), x, ac);
        return uadd(rotate_left(a, s), b);
      }  private int HH (int a, int b, int c, int d, int x, int s, int ac) { 
        a = uadd(a, (b ^ c ^ d), x, ac);
        return uadd(rotate_left(a, s) , b);
      }  private int II (int a, int b, int c, int d, int x, int s, int ac) {  
        a = uadd(a, (c ^ (b | ~d)), x, ac);
        return uadd(rotate_left(a, s), b);
      }  private int[] Decode (byte buffer[], int len, int shift) {
        int out[];
        int  i, j;    out = new int[16];    for (i = j = 0; j < len; i++, j += 4) {
          out[i] = ((int) (buffer[j + shift] & 0xff)) | 
    (((int) (buffer[j + 1 + shift] & 0xff)) << 8) |
    (((int) (buffer[j + 2 + shift] & 0xff)) << 16) | 
    (((int) (buffer[j + 3 + shift] & 0xff)) << 24);/*      System.out.println("out[" + i + "] = \t" +
     ((int) buffer[j + 0 + shift] & 0xff) + "\t|\t" +
     ((int) buffer[j + 1 + shift] & 0xff) + "\t|\t" +
     ((int) buffer[j + 2 + shift] & 0xff) + "\t|\t" +
     ((int) buffer[j + 3 + shift] & 0xff));*/
        }
        
        return out;
      }
      

  3.   

    public class MD5 {
      /**
       * MD5 state
       */
      MD5State state;
     
      /**
       * If Final() has been called, finals is set to the current finals
       * state. Any Update() causes this to be set to null.
       */
      MD5State  finals;  /** 
       * Padding for Final()
       */
      static byte padding[] = {
        (byte) 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
      };  /**
       * Initialize MD5 internal state (object can be reused just by
       * calling Init() after every Final()
       */
      public synchronized void Init () {
        state = new MD5State();
        finals = null;
      }  /**
       * Class constructor
       */
      public MD5 () {
        this.Init();
      }  /**
       * Initialize class, and update hash with ob.toString()
       *
       * @param ob Object, ob.toString() is used to update hash
       * after initialization
       */
      public MD5 (Object ob) {
        this();
        Update(ob.toString());
      }  private int rotate_left (int x, int n) {
        return (x << n) | (x >>> (32 - n));
      }  /* I wonder how many loops and hoops you'll have to go through to
         get unsigned add for longs in java */  private int uadd (int a, int b) {
        long aa, bb;
        aa = ((long) a) & 0xffffffffL;
        bb = ((long) b) & 0xffffffffL;
        
        aa += bb;    return (int) (aa & 0xffffffffL);
      }  private int uadd (int a, int b, int c) {
        return uadd(uadd(a, b), c);
      }  private int uadd (int a, int b, int c, int d) {
        return uadd(uadd(a, b, c), d);
      }  private int FF (int a, int b, int c, int d, int x, int s, int ac) {
        a = uadd(a, ((b & c) | (~b & d)), x, ac);
        return uadd(rotate_left(a, s), b);
      }  private int GG (int a, int b, int c, int d, int x, int s, int ac) {
        a = uadd(a, ((b & d) | (c & ~d)), x, ac);
        return uadd(rotate_left(a, s), b);
      }  private int HH (int a, int b, int c, int d, int x, int s, int ac) { 
        a = uadd(a, (b ^ c ^ d), x, ac);
        return uadd(rotate_left(a, s) , b);
      }  private int II (int a, int b, int c, int d, int x, int s, int ac) {  
        a = uadd(a, (c ^ (b | ~d)), x, ac);
        return uadd(rotate_left(a, s), b);
      }  private int[] Decode (byte buffer[], int len, int shift) {
        int out[];
        int  i, j;    out = new int[16];    for (i = j = 0; j < len; i++, j += 4) {
          out[i] = ((int) (buffer[j + shift] & 0xff)) | 
    (((int) (buffer[j + 1 + shift] & 0xff)) << 8) |
    (((int) (buffer[j + 2 + shift] & 0xff)) << 16) | 
    (((int) (buffer[j + 3 + shift] & 0xff)) << 24);/*      System.out.println("out[" + i + "] = \t" +
     ((int) buffer[j + 0 + shift] & 0xff) + "\t|\t" +
     ((int) buffer[j + 1 + shift] & 0xff) + "\t|\t" +
     ((int) buffer[j + 2 + shift] & 0xff) + "\t|\t" +
     ((int) buffer[j + 3 + shift] & 0xff));*/
        }
        
        return out;
      }
      

  4.   

    public class MD5 

    /* 
    * A Java implementation of the RSA Data Security, Inc. MD5 Message 
    * Digest Algorithm, as defined in RFC 1321. 
    * Based on the javascript implementation of Paul Johnston 
    * Copyright (C) Paul Johnston 1999 - 2000. 
    * See http://pajhome.org.uk/site/legal.html for details. 
    * Java Version by Thomas Weber (Orange Interactive GmbH) 
    */ 
    /* 
    * Convert a 32-bit number to a hex string with ls-byte first 
    */ 
    String hex_chr = "0123456789abcdef"; 
    private String rhex(int num) 

    String str = ""; 
    for(int j = 0; j <= 3; j++) 
    str = str + hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F) + hex_chr.charAt((num >> (j * 8)) & 0x0F); 
    return str; 
    } /* 
    * Convert a string to a sequence of 16-word blocks, stored as an array. 
    * Append padding bits and the length, as described in the MD5 standard. 
    */ 
    private int[] str2blks_MD5(String str) 

    int nblk = ((str.length() +  >> 6) + 1; 
    int[] blks = new int[nblk * 16]; 
    int i = 0; 
    for(i = 0; i < nblk * 16; i++) { 
    blks[i] = 0; 

    for(i = 0; i < str.length(); i++) { 
    blks[i >> 2] |= str.charAt(i) << ((i % 4) * 8); 

    blks[i >> 2] |= 0x80 << ((i % 4) * 8); 
    blks[nblk * 16 - 2] = str.length()*8; return blks; 
    } /* 
    * Add integers, wrapping at 2^32 
    */ 
    private int add(int x, int y) 

    return ((x&0x7FFFFFFF) + (y&0x7FFFFFFF)) ^ (x&0x80000000) ^ (y&0x80000000); 
    } /* 
    * Bitwise rotate a 32-bit number to the left 
    */ 
    private int rol(int num, int cnt) 

    return (num << cnt) | (num >>> (32 - cnt)); 
    } /* 
    * These functions implement the basic operation for each round of the 
    * algorithm. 
    */ 
    private int cmn(int q, int a, int b, int x, int s, int t) 

    return add(rol(add(add(a, q), add(x, t)), s), b); 

    private int ff(int a, int b, int c, int d, int x, int s, int t) 

    return cmn((b & c) | ((~b) & d), a, b, x, s, t); 

    private int gg(int a, int b, int c, int d, int x, int s, int t) 

    return cmn((b & d) | (c & (~d)), a, b, x, s, t); 

    private int hh(int a, int b, int c, int d, int x, int s, int t) 

    return cmn(b ^ c ^ d, a, b, x, s, t); 

    private int ii(int a, int b, int c, int d, int x, int s, int t) 

    return cmn(c ^ (b | (~d)), a, b, x, s, t); 
    } /* 
    * Take a string and return the hex representation of its MD5. 
    */ 
    public String calcMD5(String str) 

    int[] x = str2blks_MD5(str); 
    int a = 0x67452301; 
    int b = 0xEFCDAB89; 
    int c = 0x98BADCFE; 
    int d = 0x10325476; for(int i = 0; i < x.length; i += 16) 

    int olda = a; 
    int oldb = b; 
    int oldc = c; 
    int oldd = d; a = ff(a, b, c, d, x[i+ 0], 7 , 0xD76AA478); 
    d = ff(d, a, b, c, x[i+ 1], 12, 0xE8C7B756); 
    c = ff(c, d, a, b, x[i+ 2], 17, 0x242070DB); 
    b = ff(b, c, d, a, x[i+ 3], 22, 0xC1BDCEEE); 
    a = ff(a, b, c, d, x[i+ 4], 7 , 0xF57C0FAF); 
    d = ff(d, a, b, c, x[i+ 5], 12, 0x4787C62A); 
    c = ff(c, d, a, b, x[i+ 6], 17, 0xA8304613); 
    b = ff(b, c, d, a, x[i+ 7], 22, 0xFD469501); 
    a = ff(a, b, c, d, x[i+ 8], 7 , 0x698098D8); 
    d = ff(d, a, b, c, x[i+ 9], 12, 0x8B44F7AF); 
    c = ff(c, d, a, b, x[i+10], 17, 0xFFFF5BB1); 
    b = ff(b, c, d, a, x[i+11], 22, 0x895CD7BE); 
    a = ff(a, b, c, d, x[i+12], 7 , 0x6B901122); 
    d = ff(d, a, b, c, x[i+13], 12, 0xFD987193); 
    c = ff(c, d, a, b, x[i+14], 17, 0xA679438E); 
    b = ff(b, c, d, a, x[i+15], 22, 0x49B40821); a = gg(a, b, c, d, x[i+ 1], 5 , 0xF61E2562); 
    d = gg(d, a, b, c, x[i+ 6], 9 , 0xC040B340); 
    c = gg(c, d, a, b, x[i+11], 14, 0x265E5A51); 
    b = gg(b, c, d, a, x[i+ 0], 20, 0xE9B6C7AA); 
    a = gg(a, b, c, d, x[i+ 5], 5 , 0xD62F105D); 
    d = gg(d, a, b, c, x[i+10], 9 , 0x02441453); 
    c = gg(c, d, a, b, x[i+15], 14, 0xD8A1E681); 
    b = gg(b, c, d, a, x[i+ 4], 20, 0xE7D3FBC8); 
    a = gg(a, b, c, d, x[i+ 9], 5 , 0x21E1CDE6); 
    d = gg(d, a, b, c, x[i+14], 9 , 0xC33707D6); 
    c = gg(c, d, a, b, x[i+ 3], 14, 0xF4D50D87); 
    b = gg(b, c, d, a, x[i+ 8], 20, 0x455A14ED); 
    a = gg(a, b, c, d, x[i+13], 5 , 0xA9E3E905); 
    d = gg(d, a, b, c, x[i+ 2], 9 , 0xFCEFA3F8); 
    c = gg(c, d, a, b, x[i+ 7], 14, 0x676F02D9); 
    b = gg(b, c, d, a, x[i+12], 20, 0x8D2A4C8A); a = hh(a, b, c, d, x[i+ 5], 4 , 0xFFFA3942); 
    d = hh(d, a, b, c, x[i+ 8], 11, 0x8771F681); 
    c = hh(c, d, a, b, x[i+11], 16, 0x6D9D6122); 
    b = hh(b, c, d, a, x[i+14], 23, 0xFDE5380C); 
    a = hh(a, b, c, d, x[i+ 1], 4 , 0xA4BEEA44); 
    d = hh(d, a, b, c, x[i+ 4], 11, 0x4BDECFA9); 
    c = hh(c, d, a, b, x[i+ 7], 16, 0xF6BB4B60); 
    b = hh(b, c, d, a, x[i+10], 23, 0xBEBFBC70); 
    a = hh(a, b, c, d, x[i+13], 4 , 0x289B7EC6); 
    d = hh(d, a, b, c, x[i+ 0], 11, 0xEAA127FA); 
    c = hh(c, d, a, b, x[i+ 3], 16, 0xD4EF3085); 
    b = hh(b, c, d, a, x[i+ 6], 23, 0x04881D05); 
    a = hh(a, b, c, d, x[i+ 9], 4 , 0xD9D4D039); 
    d = hh(d, a, b, c, x[i+12], 11, 0xE6DB99E5); 
    c = hh(c, d, a, b, x[i+15], 16, 0x1FA27CF8); 
    b = hh(b, c, d, a, x[i+ 2], 23, 0xC4AC5665); a = ii(a, b, c, d, x[i+ 0], 6 , 0xF4292244); 
    d = ii(d, a, b, c, x[i+ 7], 10, 0x432AFF97); 
    c = ii(c, d, a, b, x[i+14], 15, 0xAB9423A7); 
    b = ii(b, c, d, a, x[i+ 5], 21, 0xFC93A039); 
    a = ii(a, b, c, d, x[i+12], 6 , 0x655B59C3); 
    d = ii(d, a, b, c, x[i+ 3], 10, 0x8F0CCC92); 
    c = ii(c, d, a, b, x[i+10], 15, 0xFFEFF47D); 
    b = ii(b, c, d, a, x[i+ 1], 21, 0x85845DD1); 
    a = ii(a, b, c, d, x[i+ 8], 6 , 0x6FA87E4F); 
    d = ii(d, a, b, c, x[i+15], 10, 0xFE2CE6E0); 
    c = ii(c, d, a, b, x[i+ 6], 15, 0xA3014314); 
    b = ii(b, c, d, a, x[i+13], 21, 0x4E0811A1); 
    a = ii(a, b, c, d, x[i+ 4], 6 , 0xF7537E82); 
    d = ii(d, a, b, c, x[i+11], 10, 0xBD3AF235); 
    c = ii(c, d, a, b, x[i+ 2], 15, 0x2AD7D2BB); 
    b = ii(b, c, d, a, x[i+ 9], 21, 0xEB86D391); a = add(a, olda); 
    b = add(b, oldb); 
    c = add(c, oldc); 
    d = add(d, oldd); 

    return rhex(a) + rhex(b) + rhex(c) + rhex(d); 
    } }
      

  5.   

    yuebenxian(我是谁)  大虾,网站我去过了,但那种算法符合我的需要阿?
      

  6.   

    yuebenxian(我是谁)  大虾,网站我去过了,但那种算法符合我的需要阿? 另外 scbb(星际Baby) captiveRobotCN(俘虏) 两位很辛苦,但md5是不可逆的,不符合我的要求阿
      

  7.   

    我正准备学MD5,没想到得到源代码
    向scbb(星际Baby、captiveRobotCN(俘虏)致谢
    我把我开发的BASE64开放出来,大家交流吧
    BASE64很简单,是可逆的加密算法,我开发他是为用于SMTP认证。
    /*
      Base64 字符表
      码值 字符      码值 字符      码值 字符      码值 字符
         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     (pad)    =
        15    P        32    g        49    x
        16    Q        33    h        50    y
    */public class Base64{
      public static char BASETABLE[]={'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','+','/','='};  public static String encode(String text){
        /*编码算法
          1.将数据按3个字节一组分成数块;
          2.每块将3个8位的数据转换成4个6位数据段;
            11111111 00000000 11111111  ----  111111 110000 000011 111111
          3.根据Base64字符表得到4个6位数据段对应的字符;
          4.如果最后一块只有两个字节,则添加两个0位,转换成对应Base64字符表的三个字符,并在结尾添一个'='字符;
            如果最后一块只有一个字节,则添加四个0位,转换成对应Base64字符表的两个字符,并在结尾添两个'='字符。
        */
        StringBuffer code=new StringBuffer();
        int textLength=text.length();
        int blockCount=(int)textLength/3;
        char[] textChars=new char[textLength];
        int ch, bits;
        text.getChars(0, textLength, textChars, 0);    for(int i=0;i<blockCount;i++){
          ch=(int)textChars[0+i*3];
          ch=ch>>>2;
          code.append(BASETABLE[ch]);
          bits=(int)textChars[0+i*3]-ch*4;
          ch=(int)textChars[1+i*3];
          ch=ch>>>4;
          code.append(BASETABLE[ch+bits*16]);
          bits=(int)textChars[1+i*3]-ch*16;
          ch=(int)textChars[2+i*3];
          ch=ch>>>6;
          code.append(BASETABLE[ch+bits*4]);
          bits=(int)textChars[2+i*3]-ch*64;
          code.append(BASETABLE[bits]);
        }
        if((textLength % 3)!=0)
          { ch=(int)textChars[blockCount*3];
            ch=ch>>>2;
            code.append(BASETABLE[ch]);
            bits=(int)textChars[blockCount*3]-ch*4;
            switch(textLength % 3){
              case 1: code.append(BASETABLE[bits*16]);
                      code.append(BASETABLE[64]);
                      code.append(BASETABLE[64]);
                      break;
              case 2: ch=(int)textChars[1+blockCount*3];
                      ch=ch>>>4;
                      code.append(BASETABLE[ch+bits*16]);
                      bits=(int)textChars[1+blockCount*3]-ch*16;
                      code.append(BASETABLE[bits*4]);
                      code.append(BASETABLE[64]);
                      break;
            }
          }    return code.toString();
      }  public static String decode(String code){
        /*解码算法
          1.将数据按4个字节一组分成数块;
          2.每块将4个字符去掉最高两位并转换成3个8位的数据段;
            注意:数据块中的字符取值不是ASCII集的值,而是Base64字符表中相对应的索引值!
            00 111111   00 110000   00 000011   00 111111 ---- 11111111 00000000 11111111
          3.根据ASCII字符集得到3个8位数据段对应的字符;
          4.如果最后一块只有两个'=',去掉两个'=',并去掉最低两位,转换成对应ASSCII字符集的两个字符;
            如果最后一块只有一个'=',去掉'=',并去掉最低四位,转换成对应ASSCII字符集的一个字符。
        */
        StringBuffer text=new StringBuffer();
        int codeLength=code.length();
        int blockCount=(int)codeLength/4;
        char[] codeChars=new char[codeLength];
        int ch, bits;
        code.getChars(0, codeLength, codeChars, 0);    for(int i=0;i<blockCount;i++){
          bits=indexOfBase64Table(codeChars[1+i*4])>>>4;
          ch=indexOfBase64Table(codeChars[0+i*4])*4+bits;
          text.append((char)ch);
          if(codeChars[2+i*4]!='='){
            ch=(indexOfBase64Table(codeChars[1+i*4])-bits*16)*16;
            bits=indexOfBase64Table(codeChars[2+i*4])>>>2;
            ch=ch+bits;
            text.append((char)ch);
            if(codeChars[3+i*4]!='='){
              ch=(indexOfBase64Table(codeChars[2+i*4])-bits*4)*64+indexOfBase64Table(codeChars[3+i*4]);
              text.append((char)ch);
            }
          }
        }    return text.toString();
      }  private static int indexOfBase64Table(char ch){
        for(int i=0;i<64;i++) if(ch==BASETABLE[i]) return i;
        return -1;
      }
    }
      

  8.   

    我这有IDEA算法:
    import java.util.*;/** IDEA encryption and decryption algorithm
     * @author tekie
     * usage:
     * .Set_k,.Creat_encrypt_sub_k,[.Creat_decrypt_sub_k,]
     * .Set_m,.Encrypt|.Decrypt,.Get_c,|{.Set_m,.Encrypt|.Decrypt,.Get_c}
     */
    class myidea{ /* 源数据 */
    private byte m_string[];
    /* 目标数据 */
    private byte c_string[];
    /* 密钥 */
    private byte k_string[];
    /* 数据块 1, 2, 3, 4 */
    private char X1,X2,X3,X4;
    /* 加密子密钥 */
    private char Z[];
    /* 解密子密钥 */
    private char Z_1[];
            /* */
    private char temp1,temp2,temp3,temp4,temp5;
    private char temp6,temp7,temp8,temp9,temp10;        /* 初始化 */
    myidea()
    {
    m_string=new byte[8];
    c_string=new byte[8];
    k_string=new byte[16];
    Z=new char[53];
    Z_1=new char[53];


    /* */
    private char inv(char x)
    {
    char t0, t1,q, y;
    if (x <= 1)
    return x; /* 0 and 1 are self-inverse */
    t1 = (char)(0x10001 / x); /* Since x >= 2, this fits into 16 bits */
    y = (char)(0x10001 % x);
    if (y == 1)
    return (char)(1-t1);
    t0 = 1;
    do
    { q = (char)(x / y);
    x = (char)(x % y);
    t0 +=(char)(q * t1);
    if (x == 1)
    return t0;
    q = (char)(y / x);
    y = (char)(y % x);
    t1 +=(char)(q * t0);
    } while (y != 1);
    return (char)(1-t1);
    }

    /* */
    private char multiply(char input1,char input2)
    {
    long p=input1*input2;
    if (p == 0)
    input2 = (char)(65537-input1-input2);
    else {
    input1 = (char)(p >> 16);
    input2 = (char)p;
    input1 = (char)(input2-input1);

    if (input2 < input1) input1 += 65537;
    }
    return input1;
    }

    /* */
    private void Separate_m_2_X()
    {
    //本函数的目的是从m string中得到X1,X2,X3,X4
    //get X1,X2,X3,X4 from m string
             char temp;

    X1=(char)m_string[0];
    X1<<=8;
    temp=(char)m_string[1];
    temp&=0xFF;
    X1|=temp;

    X2=(char)m_string[2];
    X2<<=8;
    temp=(char)m_string[3];
    temp&=0xFF;
    X2|=temp;

    X3=(char)m_string[4];
    X3<<=8;
    temp=(char)m_string[5];
    temp&=0xFF;
    X3|=temp;

    X4=(char)m_string[6];
    X4<<=8;
    temp=(char)m_string[7];
    temp&=0xFF;
    X4|=temp;
    }

    /** 设置密钥 
     * @param input_k_string input the 128bit key(16 byte)
     * @return No return value
     */
    void Set_k(byte[] input_k_string)
    {
    //本函数的目的是设置密钥
    for (int i=0;i<=15;i++) k_string[i]=input_k_string[i];
    }

            /** 加密用子密钥运算
             * @param No param
             * @return No return value
             */
    void Creat_encrypt_sub_k()
    {
    //本函数的目的是生成加密子密钥
    //creat encrypt sub key and store to Z[57]
    char temp;
    byte temp1,temp2,temp3;
    int i;
    int num;
    for (num=0;num <= 6;num++){
    Z[1+num*8]=(char)k_string[0]; Z[1+num*8]<<=8;
    temp=(char)k_string[1];temp=(char)(temp & 0x00FF);Z[1+num*8]|=temp;

    Z[2+num*8]=(char)k_string[2];Z[2+num*8]<<=8;
    temp=(char)k_string[3];temp=(char)(temp & 0x00FF);Z[2+num*8]|=temp;

    Z[3+num*8]=(char)k_string[4];Z[3+num*8]<<=8;
    temp=(char)k_string[5];temp=(char)(temp & 0x00FF);Z[3+num*8]|=temp;

    Z[4+num*8]=(char)k_string[6];Z[4+num*8]<<=8;
    temp=(char)k_string[7];temp=(char)(temp & 0x00FF);Z[4+num*8]|=temp;
    if (num!=6) {
    Z[5+num*8]=(char)k_string[8];Z[5+num*8]<<=8;
    temp=(char)k_string[9];temp=(char)(temp & 0x00FF);
    Z[5+num*8]|=temp;
    }
    if (num!=6){
    Z[6+num*8]=(char)k_string[10];Z[6+num*8]<<=8;
    temp=(char)k_string[11];temp=(char)(temp & 0x00FF);
    Z[6+num*8]|=temp;
    }
    if (num!=6){
    Z[7+num*8]=(char)k_string[12];Z[7+num*8]<<=8;
    temp=(char)k_string[13];temp=(char)(temp & 0x00FF);
    Z[7+num*8]|=temp;
    }
    if (num!=6){
    Z[8+num*8]=(char)k_string[14];Z[8+num*8]<<=8;
    temp=(char)k_string[15];temp=(char)(temp & 0x00FF);
    Z[8+num*8]|=temp;
    }

    //now,start to left move 25 bit
    //first left move 24 bit
    temp1=k_string[0];
    temp2=k_string[1];
    temp3=k_string[2];
    for (i=0;i<=12;i++) k_string[i]=k_string[i+3];
    k_string[13]=temp1;k_string[14]=temp2;k_string[15]=temp3;

    //then left move 1 bit,sum 25 bit
    byte store_bit[]=new byte[16];//store k_string's first bit.
    for (i=15;i >= 0;i--){
    //from high bit to low
    store_bit[i]=(byte)(k_string[i] >> 7);
    store_bit[i]&=0x01;
    k_string[i]<<=1;
    if (i!=15) k_string[i]+=store_bit[i+1];
    }
    k_string[15]+=store_bit[0];
    //complete to left move 25 bit 
    }//All encrypt sub key created
    }
      

  9.   

    /** 解密子密钥计算 
     * @param No param
     * @return No return value
     */
    void Creat_decrypt_sub_k()
    {
    //本函数的目的是生成解密子密钥
    Z_1[1]=inv(Z[49]);
    Z_1[2]=(char)(0-Z[50]);
    Z_1[3]=(char)(0-Z[51]);
    Z_1[4]=inv(Z[52]);
    Z_1[5]=(char)(Z[47]);
    Z_1[6]=Z[48];

    for (int i=1;i<=7;i++){
    Z_1[1+i*6]=inv(Z[49-i*6]);
    Z_1[2+i*6]=(char)(0-Z[51-i*6]);
    Z_1[3+i*6]=(char)(0-Z[50-i*6]);
    Z_1[4+i*6]=inv(Z[52-i*6]);
    Z_1[5+i*6]=Z[47-i*6];
    Z_1[6+i*6]=Z[48-i*6];
    }
    Z_1[49]=inv(Z[1]);
    Z_1[50]=(char)(0-Z[2]);
    Z_1[51]=(char)(0-Z[3]);
    Z_1[52]=inv(Z[4]);
    }

    /** 设置源数据
     * @param input_m_string input the source data to be processed
     * @return No return value
     */
    void Set_m(byte[] input_m_string)
    {
    //本函数的目的是设置源数据
    for (int i=0;i<=7;i++) m_string[i]=input_m_string[i];
    }

    /** 加密运算
     * @param No param
     * @return No return value
     */
    void Encrypt()
    {
    //本函数的目的是加密

    //把m分成X1,X2,X3,X4
    Separate_m_2_X();

    //下面做8圈叠代
    for (int num=0;num<=7;num++){
    temp1=multiply(Z[1+num*6],X1);//1
    temp2=(char)(X2+Z[2+num*6]);//2
    temp3=(char)(X3+Z[3+num*6]);//3
    temp4=multiply(Z[4+num*6],X4);//4
    temp5=(char)(temp1 ^ temp3);//5
    temp6=(char)(temp2 ^ temp4);//6
    temp7=multiply(Z[5+num*6],temp5);//7
    temp8=(char)(temp7+temp6);
    temp10=multiply(Z[6+num*6],temp8);
    temp9=(char)(temp7+temp10);

    X1=(char)(temp1 ^ temp10);
    if (num!=7){
    X2=(char)(temp3 ^ temp10);
    X3=(char)(temp2 ^ temp9);
    }
    else{
    X2=(char)(temp2 ^ temp9);
    X3=(char)(temp3 ^ temp10);
    }
    X4=(char)(temp4 ^ temp9);
    }//end of 8 times

    //输出变换
    X1=multiply(Z[49],X1);
    X2+=Z[50];
    X3+=Z[51];
    X4=multiply(Z[52],X4);

    //把X1,X2,X3,X4复制到c_string中。
    //now,creat c_string from X1..X4;
    c_string[1]=(byte)X1; c_string[0]=(byte)(X1>>8);
    c_string[3]=(byte)X2; c_string[2]=(byte)(X2>>8);
    c_string[5]=(byte)X3; c_string[4]=(byte)(X3>>8);
    c_string[7]=(byte)X4; c_string[6]=(byte)(X4>>8);

    //end of encryption
    }

    /** 解密运算
     * @param No param
     * @return No return value
     */
    void Decrypt()
    {//本函数的目的是解密

    //把m分成X1,X2,X3,X4
    Separate_m_2_X();

    //下面做8圈叠代
    for (int num=0;num<=7;num++){
    temp1=multiply(Z_1[1+num*6],X1);//1
    temp2=(char)(X2+Z_1[2+num*6]);//2
    temp3=(char)(X3+Z_1[3+num*6]);//3
    temp4=multiply(Z_1[4+num*6],X4);//4
    temp5=(char)(temp1 ^ temp3);//5
    temp6=(char)(temp2 ^ temp4);//6
    temp7=multiply(Z_1[5+num*6],temp5);//7
    temp8=(char)(temp7+temp6);
    temp10=multiply(Z_1[6+num*6],temp8);
    temp9=(char)(temp7+temp10);

    X1=(char)(temp1 ^ temp10);
    if (num!=7){
    X2=(char)(temp3 ^ temp10);
    X3=(char)(temp2 ^ temp9);
    }
    else{
    X2=(char)(temp2 ^ temp9);
    X3=(char)(temp3 ^ temp10);
    }
    X4=(char)(temp4 ^ temp9);
    }//end of 8 times

    //输出变换
    X1=multiply(Z_1[49],X1);
    X2+=Z_1[50];
    X3+=Z_1[51];
    X4=multiply(Z_1[52],X4);

    //把X1,X2,X3,X4复制到c_string中。
    //now,creat c_string from X1..X4;
    c_string[1]=(byte)X1; c_string[0]=(byte)(X1>>8);
    c_string[3]=(byte)X2; c_string[2]=(byte)(X2>>8);
    c_string[5]=(byte)X3; c_string[4]=(byte)(X3>>8);
    c_string[7]=(byte)X4; c_string[6]=(byte)(X4>>8);
    //end of decryption
    }

    /** 结果输出
     * @param output_c_string output the result
     * @return No return value
     */
    void Get_c(byte[] output_c_string)
    {
    //本函数的目的是获得目标数据
    for (int i=0;i<=7;i++) output_c_string[i]=c_string[i];
    }}/*test below*/
    public class ideatest{
    public static void main(String[] args){
    int i;
    myidea test=new myidea();
    byte[] m={1,2,3,4,5,6,7,8};
    byte[] k={9,8,7,6,5,4,3,2,1,0,1,2,3,4,5,6};
    byte[] c=new byte[8];
    test.Set_k(k);
    test.Creat_encrypt_sub_k();
    test.Creat_decrypt_sub_k();
    System.out.println("密钥:");
    for(i=0;i<=15;i++)
    System.out.print(k[i]);
    System.out.println("");

    test.Set_m(m);
    System.out.println("明文:");
    for(i=0;i<=7;i++)
    System.out.print(m[i]);
    System.out.println(""); test.Encrypt();
    test.Get_c(c);
    System.out.println("密文:");
    for(i=0;i<=7;i++)
    System.out.print((int)(c[i])+" ");
    System.out.println("");

    test.Set_m(c);
    test.Decrypt();
    test.Get_c(c);
    System.out.println("解密后明文:");
    for(i=0;i<=7;i++)
    System.out.print(c[i]);
    System.out.println("");
    System.out.println("hello!");
    }