代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SoftwareProtect
{
class MD5Hash
{
private static List<byte> inputList;
private static int curI = 0;
private static int F(int x, int y, int z)
{
return (x & y) | ((~x) & z);
}
private static int G(int x, int y, int z)
{
return (x & z) | ((~z) & y);
}
private static int H(int x, int y, int z)
{
return (x ^ y ^ z);
}
private static int I(int x, int y, int z)
{
return y ^ (x | (~z));
}
private static int T(int i)
{
return Convert.ToInt32(Math.Pow(2, 16) * Math.Abs(Math.Sin(i)));
}
private static int Mj(int i, int j)
{
byte[] x = new byte[4];
x[0] = inputList[i * 16 * 4 + j * 4];
x[1] = inputList[i * 16 * 4 + j * 4 + 1];
x[2] = inputList[i * 16 * 4 + j * 4 + 2];
x[3] = inputList[i * 16 * 4 + j * 4 + 3];
return BitConverter.ToInt32(x, 0);
}

private static int FF(int a, int b, int c, int d, int mj, int s, int i)
{
return b + ((a + F(b, c, d) + Mj(curI,mj) + T(i))) << s;
}
private static int GG(int a, int b, int c, int d, int mj, int s, int i)
{
return b + ((a + G(b, c, d) + Mj(curI, mj) + T(i))) << s;
}
private static int HH(int a, int b, int c, int d, int mj, int s, int i)
{
return b + ((a + H(b, c, d) + Mj(curI, mj) + T(i))) << s;
}
private static int II(int a, int b, int c, int d, int mj, int s, int i)
{
return b + ((a + I(b, c, d) + Mj(curI, mj) + T(i))) << s;
}
private static int str2int(string str)
{
int r = 0;
byte[] bytes = System.Text.Encoding.Default.GetBytes(str);
foreach (byte b in bytes)
{
r = r + Convert.ToInt32(b);
}
return r;
}
private static int[] f1(int A, int B, int C, int D)
{
A = FF(A, B, C, D, 0, 7, 1);
D = FF(D, A, B, C, 1, 12, 2);
C = FF(C, D, A, B, 2, 17, 3);
D = FF(B, C, D, A, 3, 22, 4);
A = FF(A, B, C, D, 4, 7, 5);
D = FF(D, A, B, C, 5, 12, 6);
C = FF(C, D, A, B, 6, 17, 7);
D = FF(B, C, D, A, 7, 22, 8);
return new int[4] { A, B, C, D };
}
private static int[] g1(int A, int B, int C, int D)
{
A = GG(A, B, C, D, 1, 5, 17);
D = GG(D, A, B, C, 6, 9, 18);
C = GG(C, D, A, B, 11, 14, 19);
D = GG(B, C, D, A, 0, 20, 20);
A = GG(A, B, C, D, 5, 5, 21);
D = GG(D, A, B, C, 10, 9, 22);
C = GG(C, D, A, B, 15, 14, 23);
D = GG(B, C, D, A, 4, 20, 24);
return new int[4] { A, B, C, D };
}
private static int[] h1(int A, int B, int C, int D)
{
A = HH(A, B, C, D, 5, 4, 33);
D = HH(D, A, B, C, 8, 11, 34);
C = HH(C, D, A, B, 11, 16, 35);
D = HH(B, C, D, A, 3, 22, 4);
A = HH(A, B, C, D, 4, 7, 5);
D = HH(D, A, B, C, 5, 12, 6);
C = HH(C, D, A, B, 6, 17, 7);
D = HH(B, C, D, A, 7, 22, 8);
return new int[4] { A, B, C, D };
}
private static int[] i1(int A, int B, int C, int D)
{
A = II(A, B, C, D, 0, 7, 1);
D = II(D, A, B, C, 1, 12, 2);
C = II(C, D, A, B, 2, 17, 3);
D = II(B, C, D, A, 3, 22, 4);
A = II(A, B, C, D, 4, 7, 5);
D = II(D, A, B, C, 5, 12, 6);
C = II(C, D, A, B, 6, 17, 7);
D = II(B, C, D, A, 7, 22, 8);
return new int[4] { A, B, C, D };
}

public static byte[] ToBytes(int v)
{

var len = 4;
/*for (var i = 0; i < 4; i++)
{
if (v >> 8 * i < 255)
{
len = i + 1;
break;
}
}*/
var bs = new byte[len];

for (var j = 0; j < bs.Length; j++)
{
bs[j] = (byte)(v >> (bs.Length - j - 1) * 8);

}
return bs;
}

public static string ToHexString(byte[] bytes)
{
string hexString = string.Empty;

if (bytes != null)
{

StringBuilder strB = new StringBuilder();

for (int i = 0; i < bytes.Length; i++)
{
strB.Append(bytes[i].ToString("X2"));
}

hexString = strB.ToString();

} return hexString;

}

public static string getFetures(string input, string md5)
{
byte[] inputByte = System.Text.Encoding.Default.GetBytes(input);
inputList = new List<byte>(inputByte);
int len = inputByte.Length;
int yu = len % 64;


for (int i = 0; i < 56 - yu; i++)
{
if (i == 0)
inputList.Add((byte)(1));
else
inputList.Add((byte)(0));
}

Int64 len64 = Convert.ToInt64(len);

inputList.Add((byte)(len64 >> 56));

inputList.Add((byte)(len64 >> 48));
inputList.Add((byte)(len64 >> 40));
inputList.Add((byte)(len64 >> 32));
inputList.Add((byte)(len64 >> 24));
inputList.Add((byte)(len64 >> 16));
inputList.Add((byte)(len64 >> 8));
inputList.Add((byte)len64);
int N = inputList.Count;
int A, B, C, D;
int[] gr1, gr2, gr3, gr4;
string rr = "";

if (N == 64)
{
curI = 0;
A = str2int(md5.Substring(0, 8));
B = str2int(md5.Substring(8, 8));
C = str2int(md5.Substring(16, 8));
D = str2int(md5.Substring(24, 8));

gr1 = f1(A, B, C, D);
gr2 = g1(gr1[0], gr1[1], gr1[2], gr1[3]);
gr3 = h1(gr2[0], gr2[1], gr2[2], gr2[3]);
gr4 = i1(gr3[0], gr3[1], gr3[2], gr3[3]);

rr = ToHexString(ToBytes(gr4[0]))+ ToHexString(ToBytes(gr4[1])) + ToHexString(ToBytes(gr4[2])) + ToHexString(ToBytes(gr4[3]));

string by = null;
for (int o = 0; o < ToBytes(gr4[2]).Length; o++)
{

by += ToBytes(gr4[2])[o];
}
MessageBox.Show("by=" + by, "1");
}
else
{
for (int i = 0; i < N / (16*4) - 1; i++)
{
curI = i;
A = str2int(md5.Substring(0, 8));
B = str2int(md5.Substring(8, 8));
C = str2int(md5.Substring(16, 8));
D = str2int(md5.Substring(24, 8));

gr1 = f1(A, B, C, D);
gr2 = g1(gr1[0], gr1[1], gr1[2], gr1[3]);
gr3 = h1(gr2[0], gr2[1], gr2[2], gr2[3]);
gr4 = i1(gr3[0], gr3[1], gr3[2], gr3[3]);

rr = ToHexString(ToBytes(gr4[0])) + ToHexString(ToBytes(gr4[1])) + ToHexString(ToBytes(gr4[2])) + ToHexString(ToBytes(gr4[3]));
}
}

//if (string.Compare(rr, MD5Util.rHandler(rr)) == 0)
//{
// return MD5Util.rHandler(rr);
// }
// else
// { Environment.Exit(0); }

return MD5Util.rHandler(rr);
}
}
}

 

public static string rHandler(string s)
{
if (s.Length < 32)
{
s = s + getR(32 - s.Length, true, false, true, false);
}
else if (s.Length > 32)
{
s = s.Substring(0, 32);
}
return s;
}

posted on 2017-06-08 23:42  20135314朱恒志  阅读(153)  评论(0编辑  收藏  举报