本帖最后由 zycgps 于 2014-05-25 18:11:38 编辑

解决方案 »

  1.   

    [code=csharp][code=csharp]using System;
    namespace Edu.GateWay
    {
    public class HmacMD5
    {
    private const uint a = 7u;
    private const uint b = 12u;
    private const uint c = 17u;
    private const uint d = 22u;
    private const uint e = 5u;
    private const uint f = 9u;
    private const uint g = 14u;
    private const uint h = 20u;
    private const uint i = 4u;
    private const uint j = 11u;
    private const uint k = 16u;
    private const uint l = 23u;
    private const uint m = 6u;
    private const uint n = 10u;
    private const uint o = 15u;
    private const uint p = 21u;
    private uint[] q;
    private uint[] r;
    private byte[] s;
    private byte[] t;
    private static byte[] u;
    public HmacMD5()
    {
    this.q = new uint[2];
    this.r = new uint[4];
    this.s = new byte[64];
    this.t = new byte[16];
    this.init();
    }
    public void init()
    {
    if (true)
    {
    }
    this.q[0] = 0u;
    this.q[1] = 0u;
    this.r[0] = 1732584193u;
    this.r[1] = 4023233417u;
    this.r[2] = 2562383102u;
    this.r[3] = 271733878u;
    }
    public void update(byte[] data, uint length)
    {
    switch (0)
    {
    case 0:
    IL_0E:
    while (true)
    {
    uint num = length;
    uint num2 = this.q[0] >> 3 & 63u;
    uint num3 = length << 3;
    uint num4 = 0u;
    bool flag = length > 0u;
    int num5 = 6;
    while (true)
    {
    uint arg_2D5_0;
    uint num7;
    switch (num5)
    {
    case 0:
    goto IL_B4;
    case 1:
    if (!flag)
    {
    num5 = 13;
    continue;
    }
    goto IL_1F8;
    case 2:
    goto IL_FD;
    case 3:
    num5 = 15;
    continue;
    case 4:
    {
    uint num6 = 64u - num2;
    num5 = 9;
    continue;
    }
    case 5:
    if (!flag)
    {
    if (true)
    {
    }
    num5 = 16;
    continue;
    }
    Buffer.BlockCopy(data, (int)num4, this.s, 0, 64);
    this.a(this.s);
    num4 += 64u;
    num -= 64u;
    num5 = 2;
    continue;
    case 6:
    if (!flag)
    {
    num5 = 11;
    continue;
    }
    this.q[0] += num3;
    this.q[1] += length >> 29;
    flag = (this.q[0] >= num3);
    num5 = 1;
    continue;
    case 7:
    arg_2D5_0 = 64u - num2;
    goto IL_2D5;
    case 8:
    return;
    case 9:
    if (num2 + length <= 64u)
    {
    num5 = 3;
    continue;
    }
    num5 = 7;
    continue;
    case 10:
    goto IL_1F8;
    case 11:
    num5 = 20;
    continue;
    case 12:
    Buffer.BlockCopy(data, (int)num4, this.s, 0, (int)num);
    num5 = 22;
    continue;
    case 13:
    this.q[1] += 1u;
    num5 = 10;
    continue;
    case 14:
    if (!flag)
    {
    num5 = 18;
    continue;
    }
    this.a(this.s);
    num4 += num7;
    num -= num7;
    num5 = 0;
    continue;
    case 15:
    arg_2D5_0 = length;
    goto IL_2D5;
    case 16:
    flag = (num <= 0u);
    num5 = 19;
    continue;
    case 17:
    if (!flag)
    {
    num5 = 4;
    continue;
    }
    goto IL_B4;
    case 18:
    num5 = 8;
    continue;
    case 19:
    if (!flag)
    {
    num5 = 12;
    continue;
    }
    return;
    case 20:
    return;
    case 21:
    goto IL_FD;
    case 22:
    return;
    }
    break;
    IL_B4:
    num5 = 21;
    continue;
    IL_FD:
    flag = (num >= 64u);
    num5 = 5;
    continue;
    IL_1F8:
    flag = (num2 <= 0u);
    num5 = 17;
    continue;
    IL_2D5:
    num7 = arg_2D5_0;
    Buffer.BlockCopy(data, 0, this.s, (int)num2, (int)num7);
    flag = (num2 + num7 >= 64u);
    num5 = 14;
    }
    }
    return;
    }
    goto IL_0E;
    }
    public byte[] finalize()
    {
    switch (0)
    {
    case 0:
    {
    IL_0E:
    byte[] result;
    while (true)
    {
    byte[] data = new byte[8];
    this.a(ref data, this.q, 8u);
    uint num = this.q[0] >> 3 & 63u;
    int num2 = 1;
    while (true)
    {
    uint arg_9B_0;
    bool flag;
    int num3;
    switch (num2)
    {
    case 0:
    goto IL_108;
    case 1:
    if (num >= 56u)
    {
    num2 = 5;
    continue;
    }
    num2 = 8;
    continue;
    case 2:
    return result;
    case 3:
    goto IL_108;
    case 4:
    result = this.t;
    num2 = 2;
    continue;
    case 5:
    num2 = 6;
    continue;
    case 6:
    arg_9B_0 = 120u - num;
    goto IL_9B;
    case 7:
    if (!flag)
    {
    num2 = 4;
    continue;
    }
    this.s[num3] = 0;
    num3++;
    num2 = 0;
    continue;
    case 8:
    arg_9B_0 = 56u - num;
    goto IL_9B;
    }
    break;
    IL_9B:
    uint length = arg_9B_0;
    this.update(HmacMD5.u, length);
    this.update(data, 8u);
    this.a(ref this.t, this.r, 16u);
    num3 = 0;
    num2 = 3;
    continue;
    IL_108:
    flag = (num3 < 64);
    if (true)
    {
    }
    num2 = 7;
    }
    }
    return result;
    }
    }
    goto IL_0E;
    }
    public string md5String()
    {
    switch (0)
    {
    case 0:
    {
    IL_0E:
    string result;
    while (true)
    {
    string text = "";
    int num = 0;
    int num2 = 0;
    while (true)
    {
    bool flag;
    switch (num2)
    {
    case 0:
    goto IL_4C;
    case 1:
    goto IL_4C;
    case 2:
    if (!flag)
    {
    num2 = 4;
    continue;
    }
    text += this.t[num].ToString("x2");
    num++;
    if (true)
    {
    }
    num2 = 1;
    continue;
    case 3:
    return result;
    case 4:
    result = text;
    num2 = 3;
    continue;
    }
    break;
    IL_4C:
    flag = (num < this.t.Length);
    num2 = 2;
    }
    }
    return result;
    }
    }
    goto IL_0E;
    }
      

  2.   

    private void a(byte[] A_0)
    {
    switch (0)
    {
    case 0:
    IL_0E:
    while (true)
    {
    uint num = this.r[0];
    uint num2 = this.r[1];
    uint num3 = this.r[2];
    uint num4 = this.r[3];
    uint[] array = new uint[16];
    this.a(ref array, A_0, 64u);
    this.d(ref num, num2, num3, num4, array[0], 7u, 3614090360u);
    this.d(ref num4, num, num2, num3, array[1], 12u, 3905402710u);
    this.d(ref num3, num4, num, num2, array[2], 17u, 606105819u);
    this.d(ref num2, num3, num4, num, array[3], 22u, 3250441966u);
    this.d(ref num, num2, num3, num4, array[4], 7u, 4118548399u);
    this.d(ref num4, num, num2, num3, array[5], 12u, 1200080426u);
    this.d(ref num3, num4, num, num2, array[6], 17u, 2821735955u);
    this.d(ref num2, num3, num4, num, array[7], 22u, 4249261313u);
    this.d(ref num, num2, num3, num4, array[8], 7u, 1770035416u);
    this.d(ref num4, num, num2, num3, array[9], 12u, 2336552879u);
    this.d(ref num3, num4, num, num2, array[10], 17u, 4294925233u);
    this.d(ref num2, num3, num4, num, array[11], 22u, 2304563134u);
    this.d(ref num, num2, num3, num4, array[12], 7u, 1804603682u);
    this.d(ref num4, num, num2, num3, array[13], 12u, 4254626195u);
    this.d(ref num3, num4, num, num2, array[14], 17u, 2792965006u);
    this.d(ref num2, num3, num4, num, array[15], 22u, 1236535329u);
    this.c(ref num, num2, num3, num4, array[1], 5u, 4129170786u);
    this.c(ref num4, num, num2, num3, array[6], 9u, 3225465664u);
    this.c(ref num3, num4, num, num2, array[11], 14u, 643717713u);
    this.c(ref num2, num3, num4, num, array[0], 20u, 3921069994u);
    this.c(ref num, num2, num3, num4, array[5], 5u, 3593408605u);
    this.c(ref num4, num, num2, num3, array[10], 9u, 38016083u);
    this.c(ref num3, num4, num, num2, array[15], 14u, 3634488961u);
    this.c(ref num2, num3, num4, num, array[4], 20u, 3889429448u);
    this.c(ref num, num2, num3, num4, array[9], 5u, 568446438u);
    this.c(ref num4, num, num2, num3, array[14], 9u, 3275163606u);
    this.c(ref num3, num4, num, num2, array[3], 14u, 4107603335u);
    this.c(ref num2, num3, num4, num, array[8], 20u, 1163531501u);
    this.c(ref num, num2, num3, num4, array[13], 5u, 2850285829u);
    this.c(ref num4, num, num2, num3, array[2], 9u, 4243563512u);
    this.c(ref num3, num4, num, num2, array[7], 14u, 1735328473u);
    this.c(ref num2, num3, num4, num, array[12], 20u, 2368359562u);
    this.b(ref num, num2, num3, num4, array[5], 4u, 4294588738u);
    this.b(ref num4, num, num2, num3, array[8], 11u, 2272392833u);
    this.b(ref num3, num4, num, num2, array[11], 16u, 1839030562u);
    this.b(ref num2, num3, num4, num, array[14], 23u, 4259657740u);
    this.b(ref num, num2, num3, num4, array[1], 4u, 2763975236u);
    this.b(ref num4, num, num2, num3, array[4], 11u, 1272893353u);
    this.b(ref num3, num4, num, num2, array[7], 16u, 4139469664u);
    this.b(ref num2, num3, num4, num, array[10], 23u, 3200236656u);
    this.b(ref num, num2, num3, num4, array[13], 4u, 681279174u);
    this.b(ref num4, num, num2, num3, array[0], 11u, 3936430074u);
    this.b(ref num3, num4, num, num2, array[3], 16u, 3572445317u);
    this.b(ref num2, num3, num4, num, array[6], 23u, 76029189u);
    this.b(ref num, num2, num3, num4, array[9], 4u, 3654602809u);
    this.b(ref num4, num, num2, num3, array[12], 11u, 3873151461u);
    this.b(ref num3, num4, num, num2, array[15], 16u, 530742520u);
    this.b(ref num2, num3, num4, num, array[2], 23u, 3299628645u);
    this.a(ref num, num2, num3, num4, array[0], 6u, 4096336452u);
    this.a(ref num4, num, num2, num3, array[7], 10u, 1126891415u);
    this.a(ref num3, num4, num, num2, array[14], 15u, 2878612391u);
    this.a(ref num2, num3, num4, num, array[5], 21u, 4237533241u);
    this.a(ref num, num2, num3, num4, array[12], 6u, 1700485571u);
    this.a(ref num4, num, num2, num3, array[3], 10u, 2399980690u);
    this.a(ref num3, num4, num, num2, array[10], 15u, 4293915773u);
    this.a(ref num2, num3, num4, num, array[1], 21u, 2240044497u);
    this.a(ref num, num2, num3, num4, array[8], 6u, 1873313359u);
    this.a(ref num4, num, num2, num3, array[15], 10u, 4264355552u);
    this.a(ref num3, num4, num, num2, array[6], 15u, 2734768916u);
    this.a(ref num2, num3, num4, num, array[13], 21u, 1309151649u);
    this.a(ref num, num2, num3, num4, array[4], 6u, 4149444226u);
    this.a(ref num4, num, num2, num3, array[11], 10u, 3174756917u);
    this.a(ref num3, num4, num, num2, array[2], 15u, 718787259u);
    this.a(ref num2, num3, num4, num, array[9], 21u, 3951481745u);
    this.r[0] += num;
    this.r[1] += num2;
    this.r[2] += num3;
    this.r[3] += num4;
    int num5 = 0;
    int num6 = 1;
    while (true)
    {
    bool flag;
    switch (num6)
    {
    case 0:
    goto IL_6C6;
    case 1:
    goto IL_6A2;
    case 2:
    goto IL_6A2;
    case 3:
    if (!flag)
    {
    num6 = 0;
    continue;
    }
    array[num5] = 0u;
    num5++;
    num6 = 2;
    continue;
    }
    break;
    IL_6A2:
    flag = (num5 < 16);
    num6 = 3;
    }
    }
    IL_6C6:
    if (true)
    {
    }
    return;
    }
    goto IL_0E;
    }
    private void a(ref byte[] A_0, uint[] A_1, uint A_2)
    {
    while (true)
    {
    bool flag = !BitConverter.IsLittleEndian;
    int num = 1;
    while (true)
    {
    uint num3;
    switch (num)
    {
    case 0:
    num = 7;
    continue;
    case 1:
    {
    if (!flag)
    {
    num = 11;
    continue;
    }
    uint num2 = 0u;
    num3 = 0u;
    if (true)
    {
    }
    num = 3;
    continue;
    }
    case 2:
    goto IL_195;
    case 3:
    goto IL_164;
    case 4:
    goto IL_195;
    case 5:
    {
    if (!flag)
    {
    num = 10;
    continue;
    }
    uint num2;
    A_0[(int)((UIntPtr)num3)] = (byte)(A_1[(int)((UIntPtr)num2)] & 255u);
    A_0[(int)((UIntPtr)(num3 + 1u))] = (byte)(A_1[(int)((UIntPtr)num2)] >> 8 & 255u);
    A_0[(int)((UIntPtr)(num3 + 2u))] = (byte)(A_1[(int)((UIntPtr)num2)] >> 16 & 255u);
    A_0[(int)((UIntPtr)(num3 + 3u))] = (byte)(A_1[(int)((UIntPtr)num2)] >> 24 & 255u);
    num2 += 1u;
    num3 += 4u;
    num = 2;
    continue;
    }
      

  3.   

    case 6:
    return;
    case 7:
    return;
    case 8:
    goto IL_164;
    case 9:
    {
    if (!flag)
    {
    num = 0;
    continue;
    }
    uint num2;
    A_0[(int)((UIntPtr)(num3 + 3u))] = (byte)(A_1[(int)((UIntPtr)num2)] & 255u);
    A_0[(int)((UIntPtr)(num3 + 2u))] = (byte)(A_1[(int)((UIntPtr)num2)] >> 8 & 255u);
    A_0[(int)((UIntPtr)(num3 + 1u))] = (byte)(A_1[(int)((UIntPtr)num2)] >> 16 & 255u);
    A_0[(int)((UIntPtr)num3)] = (byte)(A_1[(int)((UIntPtr)num2)] >> 24 & 255u);
    num2 += 1u;
    num3 += 4u;
    num = 8;
    continue;
    }
    case 10:
    num = 6;
    continue;
    case 11:
    {
    uint num2 = 0u;
    num3 = 0u;
    num = 4;
    continue;
    }
    }
    break;
    IL_164:
    flag = (num3 < A_2);
    num = 9;
    continue;
    IL_195:
    flag = (num3 < A_2);
    num = 5;
    }
    }
    }
    private void a(ref uint[] A_0, byte[] A_1, uint A_2)
    {
    while (true)
    {
    bool flag = !BitConverter.IsLittleEndian;
    int num = 5;
    while (true)
    {
    uint num3;
    switch (num)
    {
    case 0:
    num = 4;
    continue;
    case 1:
    {
    if (!flag)
    {
    num = 9;
    continue;
    }
    uint num2;
    A_0[(int)((UIntPtr)num2)] = (uint)((int)A_1[(int)((UIntPtr)num3)] | (int)A_1[(int)((UIntPtr)(num3 + 1u))] << 8 | (int)A_1[(int)((UIntPtr)(num3 + 2u))] << 16 | (int)A_1[(int)((UIntPtr)(num3 + 3u))] << 24);
    num2 += 1u;
    num3 += 4u;
    num = 3;
    continue;
    }
    case 2:
    {
    uint num2 = 0u;
    num3 = 0u;
    num = 8;
    continue;
    }
    case 3:
    goto IL_13B;
    case 4:
    return;
    case 5:
    {
    if (!flag)
    {
    num = 2;
    continue;
    }
    uint num2 = 0u;
    num3 = 0u;
    num = 7;
    continue;
    }
    case 6:
    if (true)
    {
    }
    goto IL_10A;
    case 7:
    goto IL_10A;
    case 8:
    goto IL_13B;
    case 9:
    num = 10;
    continue;
    case 10:
    return;
    case 11:
    {
    if (!flag)
    {
    num = 0;
    continue;
    }
    uint num2;
    A_0[(int)((UIntPtr)num2)] = (uint)((int)A_1[(int)((UIntPtr)(num3 + 3u))] | (int)A_1[(int)((UIntPtr)(num3 + 2u))] << 8 | (int)A_1[(int)((UIntPtr)(num3 + 1u))] << 16 | (int)A_1[(int)((UIntPtr)num3)] << 24);
    num2 += 1u;
    num3 += 4u;
    num = 6;
    continue;
    }
    }
    break;
    IL_10A:
    flag = (num3 < A_2);
    num = 11;
    continue;
    IL_13B:
    flag = (num3 < A_2);
    num = 1;
    }
    }
    }
    private uint a(uint A_0, uint A_1)
    {
    uint result = A_0 << (int)A_1 | A_0 >> (int)(32u - A_1);
    if (true)
    {
    }
    return result;
    }
    private uint d(uint A_0, uint A_1, uint A_2)
    {
    if (true)
    {
    }
    return (A_0 & A_1) | (~A_0 & A_2);
    }
    private uint c(uint A_0, uint A_1, uint A_2)
    {
    uint result = (A_0 & A_2) | (A_1 & ~A_2);
    if (true)
    {
    }
    return result;
    }
    private uint b(uint A_0, uint A_1, uint A_2)
    {
    return A_0 ^ A_1 ^ A_2;
    }
    private uint a(uint A_0, uint A_1, uint A_2)
    {
    if (true)
    {
    }
    return A_1 ^ (A_0 | ~A_2);
    }
    private void d(ref uint A_0, uint A_1, uint A_2, uint A_3, uint A_4, uint A_5, uint A_6)
    {
    if (true)
    {
    }
    A_0 += this.d(A_1, A_2, A_3) + A_4 + A_6;
    A_0 = this.a(A_0, A_5) + A_1;
    }
    private void c(ref uint A_0, uint A_1, uint A_2, uint A_3, uint A_4, uint A_5, uint A_6)
    {
    if (true)
    {
    }
    A_0 += this.c(A_1, A_2, A_3) + A_4 + A_6;
    A_0 = this.a(A_0, A_5) + A_1;
    }
    private void b(ref uint A_0, uint A_1, uint A_2, uint A_3, uint A_4, uint A_5, uint A_6)
    {
    if (true)
    {
    }
    A_0 += this.b(A_1, A_2, A_3) + A_4 + A_6;
    A_0 = this.a(A_0, A_5) + A_1;
    }
    private void a(ref uint A_0, uint A_1, uint A_2, uint A_3, uint A_4, uint A_5, uint A_6)
    {
    if (true)
    {
    }
    A_0 += this.a(A_1, A_2, A_3) + A_4 + A_6;
    A_0 = this.a(A_0, A_5) + A_1;
    }
    static HmacMD5()
    {
    // Note: this type is ed as 'beforefieldinit'.
    byte[] array = new byte[64];
    array[0] = 128;
    HmacMD5.u = array;
    }
    }
    }