예제 #1
0
파일: MD5.cs 프로젝트: Mephostopilis/clash
        public static byte[] GetHash(byte[] input)
        {
            if (null == input)
            {
                throw new System.ArgumentNullException("input", "Unable to calculate hash over null input data");
            }

            //Intitial values defined in RFC 1321
            ABCDStruct abcd = new ABCDStruct();

            abcd.A = 0x67452301;
            abcd.B = 0xefcdab89;
            abcd.C = 0x98badcfe;
            abcd.D = 0x10325476;

            //We pass in the input array by block, the final block of data must be handled specialy for padding & length embeding
            int startIndex = 0;

            while (startIndex <= input.Length - 64)
            {
                MD5Core.GetHashBlock(input, ref abcd, startIndex);
                startIndex += 64;
            }
            // The final data block.
            return(MD5Core.GetHashFinalBlock(input, startIndex, input.Length - startIndex, abcd, (Int64)input.Length * 8));
        }
예제 #2
0
        protected override void HashCore(byte[] array, int ibStart, int cbSize)
        {
            int startIndex       = ibStart;
            int totalArrayLength = _dataSize + cbSize;

            if (totalArrayLength >= 64)
            {
                Array.Copy(array, startIndex, _data, _dataSize, 64 - _dataSize);
                // Process message of 64 bytes (512 bits)
                MD5Core.GetHashBlock(_data, ref _abcd, 0);
                startIndex       += 64 - _dataSize;
                totalArrayLength -= 64;
                while (totalArrayLength >= 64)
                {
                    Array.Copy(array, startIndex, _data, 0, 64);
                    MD5Core.GetHashBlock(array, ref _abcd, startIndex);
                    totalArrayLength -= 64;
                    startIndex       += 64;
                }
                _dataSize = totalArrayLength;
                Array.Copy(array, startIndex, _data, 0, totalArrayLength);
            }
            else
            {
                Array.Copy(array, startIndex, _data, _dataSize, cbSize);
                _dataSize = totalArrayLength;
            }
            _totalLength += cbSize;
        }
예제 #3
0
 /// <summary>
 /// 获取指定字节流的MD5值(HEX编码)
 /// </summary>
 /// <param name="data"></param>
 /// <returns></returns>
 public static byte[] get_md5_bytes(byte[] data)
 {
     byte[] bytes_md5_out = MD5Core.GetHash(data);
     return(bytes_md5_out);
 }
예제 #4
0
 /// <summary>
 /// 获取字符串的MD5值(字节流)
 /// </summary>
 /// <param name="str">输入的字符串</param>
 /// <returns></returns>
 public static byte[] get_md5_bytes(string str)
 {
     byte[] bytes_md5_out = MD5Core.GetHash(str);
     return(bytes_md5_out);
 }
예제 #5
0
 /// <summary>
 /// 获取指定字节流的MD5值(HEX编码)
 /// </summary>
 /// <param name="data"></param>
 /// <returns></returns>
 public static string get_md5_string(byte[] data)
 {
     byte[] bytes_md5_out = MD5Core.GetHash(data);
     return(ByteHelper.Bytes2HexString(bytes_md5_out));
 }
예제 #6
0
 protected override byte[] HashFinal()
 {
     base.HashValue = MD5Core.GetHashFinalBlock(_data, 0, _dataSize, _abcd, _totalLength * 8);
     return(base.HashValue);
 }