下面是一个利用JAVA写的MD5加密程序,哪位高手帮我看看这几句是什么意思啊,好像是通过MD5的C源程序直接改过来的:
 private void md5Update(byte[] inbuf, int inputLen) {                int i, index, partLen;
                byte[] block = new byte[64];
                index = (int)(count[0] >;>;>; 3) & 0x3F;        >;>;>; 表示无符号右移,但为什么要和0x3F进行与运算啊
                // /* Update number of bits */
                if ((count[0] += (inputLen << 3)) < (inputLen << 3))       后面的这几句也不明白啊,还请高手帮忙看看
                        count[1]++;
                count[1] += (inputLen >;>;>; 29);                partLen = 64 - index;                // Transform as many times as possible.
                if (inputLen >;= partLen) {
                        md5Memcpy(buffer, inbuf, index, 0, partLen);
                        md5Transform(buffer);                        for (i = partLen; i + 63 < inputLen; i += 64) {                                md5Memcpy(block, inbuf, 0, i, 64);
                                md5Transform (block);
                        }
                        index = 0;                } else                        i = 0;                ///* Buffer remaining input */
                md5Memcpy(buffer, inbuf, index, i, inputLen - i);        }源代码如下:部分已经删除
public class MD5 {
        /* 下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define 实现的,
        这里把它们实现成为static final是表示了只读,切能在同一个进程空间内的多个
        Instance间共享*/
        static final int S11 = 7;
        static final int S12 = 12;
        static final int S13 = 17;
        static final int S14 = 22;        static final int S21 = 5;
        static final int S22 = 9;
        static final int S23 = 14;
        static final int S24 = 20;        static final int S31 = 4;
        static final int S32 = 11;
        static final int S33 = 16;
        static final int S34 = 23;        static final int S41 = 6;
        static final int S42 = 10;
        static final int S43 = 15;
        static final int S44 = 21;        static final byte[] PADDING = { -128, 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 };
        /* 下面的三个成员是MD5计算过程中用到的3个核心数据,在原始的C实现中
           被定义到MD5_CTX结构中
        
         */
        private long[] state = new long[4];  // state (ABCD)
        private long[] count = new long[2];  // number of bits, modulo 2^64 (lsb first)
        private byte[] buffer = new byte[64]; // input buffer
        
        /* digestHexStr是MD5的唯一一个公共成员,是最新一次计算结果的
          16进制ASCII表示.
        */
        public String digestHexStr;
        
        /* digest,是最新一次计算结果的2进制内部表示,表示128bit的MD5值.
        */
        private byte[] digest = new byte[16];
        
        /*
          getMD5ofStr是类MD5最主要的公共方法,入口参数是你想要进行MD5变换的字符串
          返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的.
        */
        public String getMD5ofStr(String inbuf) {
                md5Init();
                md5Update(inbuf.getBytes(), inbuf.length());
                md5Final();
                digestHexStr = "";
                for (int i = 0; i < 16; i++) {
                        digestHexStr += byteHEX(digest[i]);
                }
                return digestHexStr;        }
        // 这是MD5这个类的标准构造函数,JavaBean要求有一个public的并且没有参数的构造函数
        public MD5() {
                md5Init();                return;
        }
        
        /* md5Init是一个初始化函数,初始化核心变量,装入标准的幻数 */
        private void md5Init() {
                count[0] = 0L;
                count[1] = 0L;
                ///* Load magic initialization constants.                state[0] = 0x67452301L;
                state[1] = 0xefcdab89L;
                state[2] = 0x98badcfeL;
                state[3] = 0x10325476L;                return;
        }
                     
     
        /*
         md5Update是MD5的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个
         函数由getMD5ofStr调用,调用之前需要调用md5init,因此把它设计成private的
        */
        private void md5Update(byte[] inbuf, int inputLen) {                int i, index, partLen;
                byte[] block = new byte[64];
                index = (int)(count[0] >;>;>; 3) &amp; 0x3F;
                // /* Update number of bits */
                if ((count[0] += (inputLen << 3)) < (inputLen << 3))
                        count[1]++;
                count[1] += (inputLen >;>;>; 29);                partLen = 64 - index;                // Transform as many times as possible.
                if (inputLen >;= partLen) {
                        md5Memcpy(buffer, inbuf, index, 0, partLen);
                        md5Transform(buffer);                        for (i = partLen; i + 63 < inputLen; i += 64) {                                md5Memcpy(block, inbuf, 0, i, 64);
                                md5Transform (block);
                        }
                        index = 0;                } else                        i = 0;                ///* Buffer remaining input */
                md5Memcpy(buffer, inbuf, index, i, inputLen - i);        }
        
        /*
          md5Final整理和填写输出结果
        */
        private void md5Final () {
                byte[] bits = new byte[8];
                int index, padLen;                ///* Save number of bits */
                Encode (bits, count, 8);                ///* Pad out to 56 mod 64.
                index = (int)(count[0] >;>;>; 3) &amp; 0x3f;
                padLen = (index < 56) ? (56 - index) : (120 - index);
                md5Update (PADDING, padLen);                ///* Append length (before padding) */
                md5Update(bits, 8);                ///* Store state in digest */
                Encode (digest, state, 16);        }
         
        /* md5Memcpy是一个内部使用的byte数组的块拷贝函数,从input的inpos开始把len长度的
      字节拷贝到output的outpos位置开始 
        */        private void md5Memcpy (byte[] output, byte[] input,
                int outpos, int inpos, int len)
        {
                int i;                for (i = 0; i < len; i++)
                        output[outpos + i] = input[inpos + i];
        }
        
       
        public static void main(String args[]) {
                MD5 m = new MD5();
                if (Array.getLength(args) == 0) {   //如果没有参数,执行标准的Test Suite
                
                               System.out.println("MD5 Test suite:");
                        System.out.println("MD5(\"\"):"+m.getMD5ofStr(""));
                        System.out.println("MD5(\"a\"):"+m.getMD5ofStr("a"));
                        System.out.println("MD5(\"abc\"):"+m.getMD5ofStr("abc"));
                        System.out.println("MD5(\"message digest\"):"+m.getMD5ofStr("message digest"));
                        System.out.println("MD5(\"abcdefghijklmnopqrstuvwxyz\"):"+
                        m.getMD5ofStr("abcdefghijklmnopqrstuvwxyz"));
                        System.out.println("MD5(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\"):"+
                             m.getMD5ofStr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"));
                }
                else 
                              System.out.println("MD5(" + args[0] + ")=" + m.getMD5ofStr(args[0]));
                
         
        }}

解决方案 »

  1.   

    免了吧。MD5 怎么算的我也不会,直接调 Java 自带的不就可以了。
      

  2.   

     兄弟,我研究了好几天。你这个帖子没分,但是告诉你其中一个的答案吧:>;>;>; 表示无符号右移,但为什么要和0x3F进行与运算啊 原因:index = (int)(count[0] >>>3) & 0x3F;
    count[0] >>>3获得的是要变换的数据所占用的字节数;
    0x3F的二进制码为000...00111111;
    经过&操作,获得的是占用的字节数的最后六位的值,最后六位刚好是64字节,
    也就是说要获得最后不够64字节那部分的内容的长度!最后,还是多学学位运算,多充充电吧,呵呵!