C# 計算字符串的哈希值(MD5、SHA)

http://my.oschina.net/Tsybius2014/blog/294249?p=1


一、關於本文

本文中是一個類庫,包括下面幾個函數:

1)計算32位MD5碼(大小寫):Hash_MD5_32

2)計算16位MD5碼(大小寫):Hash_MD5_16

3)計算32位2重MD5碼(大小寫):Hash_2_MD5_32

4)計算16位2重MD5碼(大小寫):Hash_2_MD5_16

5)計算SHA-1碼(大小寫):Hash_SHA_1

6)計算SHA-256碼(大小寫):Hash_SHA_256

7)計算SHA-384碼(大小寫):Hash_SHA_384

8)計算SHA-512碼(大小寫):Hash_SHA_512

編譯後被打包成文件HashTools.dll,其他程序可以在添加引用後對這些函數進行調用

二、類庫中各函數代碼

0)類庫結構

1
2
3
4
5
6
7
8
9
10
11
12
13
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace HashTools
{
    public class HashHelper
    {
        //各個函數
    }
}

1)計算32位MD5碼(大小寫):Hash_MD5_32

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/// <summary>
/// 計算32位MD5碼
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大寫,false:英文小寫</param>
/// <returns></returns>
public static string Hash_MD5_32(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.MD5CryptoServiceProvider MD5CSP
            new System.Security.Cryptography.MD5CryptoServiceProvider();
 
        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = MD5CSP.ComputeHash(bytValue);
        MD5CSP.Clear();
 
        //根據計算得到的Hash碼翻譯爲MD5碼
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }
 
        //根據大小寫規則決定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

2)計算16位MD5碼(大小寫):Hash_MD5_16

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <summary>
/// 計算16位MD5碼
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大寫,false:英文小寫</param>
/// <returns></returns>
public static string Hash_MD5_16(string word, bool toUpper = true)
{
    try
    {
        string sHash = Hash_MD5_32(word).Substring(8, 16);
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

3)計算32位2重MD5碼(大小寫):Hash_2_MD5_32

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/// <summary>
/// 計算32位2重MD5碼
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大寫,false:英文小寫</param>
/// <returns></returns>
public static string Hash_2_MD5_32(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.MD5CryptoServiceProvider MD5CSP
            new System.Security.Cryptography.MD5CryptoServiceProvider();
 
        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = MD5CSP.ComputeHash(bytValue);
 
        //根據計算得到的Hash碼翻譯爲MD5碼
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }
 
        bytValue = System.Text.Encoding.UTF8.GetBytes(sHash);
        bytHash = MD5CSP.ComputeHash(bytValue);
        MD5CSP.Clear();
        sHash = "";
 
        //根據計算得到的Hash碼翻譯爲MD5碼
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }
 
        //根據大小寫規則決定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

4)計算16位2重MD5碼(大小寫):Hash_2_MD5_16

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/// <summary>
/// 計算16位2重MD5碼
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大寫,false:英文小寫</param>
/// <returns></returns>
public static string Hash_2_MD5_16(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.MD5CryptoServiceProvider MD5CSP
                new System.Security.Cryptography.MD5CryptoServiceProvider();
 
        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = MD5CSP.ComputeHash(bytValue);
 
        //根據計算得到的Hash碼翻譯爲MD5碼
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }
 
        sHash = sHash.Substring(8, 16);
 
        bytValue = System.Text.Encoding.UTF8.GetBytes(sHash);
        bytHash = MD5CSP.ComputeHash(bytValue);
        MD5CSP.Clear();
        sHash = "";
 
        //根據計算得到的Hash碼翻譯爲MD5碼
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }
 
        sHash = sHash.Substring(8, 16);
 
        //根據大小寫規則決定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

5)計算SHA-1碼(大小寫):Hash_SHA_1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/// <summary>
/// 計算SHA-1碼
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大寫,false:英文小寫</param>
/// <returns></returns>
public static string Hash_SHA_1(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.SHA1CryptoServiceProvider SHA1CSP
            new System.Security.Cryptography.SHA1CryptoServiceProvider();
 
        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = SHA1CSP.ComputeHash(bytValue);
        SHA1CSP.Clear();
 
        //根據計算得到的Hash碼翻譯爲SHA-1碼
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }
 
        //根據大小寫規則決定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

6)計算SHA-256碼(大小寫):Hash_SHA_256

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/// <summary>
/// 計算SHA-256碼
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大寫,false:英文小寫</param>
/// <returns></returns>
public static string Hash_SHA_256(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.SHA256CryptoServiceProvider SHA256CSP
            new System.Security.Cryptography.SHA256CryptoServiceProvider();
 
        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = SHA256CSP.ComputeHash(bytValue);
        SHA256CSP.Clear();
 
        //根據計算得到的Hash碼翻譯爲SHA-1碼
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }
 
        //根據大小寫規則決定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

7)計算SHA-384碼(大小寫):Hash_SHA_384

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/// <summary>
/// 計算SHA-384碼
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大寫,false:英文小寫</param>
/// <returns></returns>
public static string Hash_SHA_384(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.SHA384CryptoServiceProvider SHA384CSP
            new System.Security.Cryptography.SHA384CryptoServiceProvider();
 
        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = SHA384CSP.ComputeHash(bytValue);
        SHA384CSP.Clear();
 
        //根據計算得到的Hash碼翻譯爲SHA-1碼
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }
 
        //根據大小寫規則決定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

8)計算SHA-512碼(大小寫):Hash_SHA_512

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/// <summary>
/// 計算SHA-512碼
/// </summary>
/// <param name="word">字符串</param>
/// <param name="toUpper">返回哈希值格式 true:英文大寫,false:英文小寫</param>
/// <returns></returns>
public static string Hash_SHA_512(string word, bool toUpper = true)
{
    try
    {
        System.Security.Cryptography.SHA512CryptoServiceProvider SHA512CSP
            new System.Security.Cryptography.SHA512CryptoServiceProvider();
 
        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(word);
        byte[] bytHash = SHA512CSP.ComputeHash(bytValue);
        SHA512CSP.Clear();
 
        //根據計算得到的Hash碼翻譯爲SHA-1碼
        string sHash = "", sTemp = "";
        for (int counter = 0; counter < bytHash.Count(); counter++)
        {
            long i = bytHash[counter] / 16;
            if (i > 9)
            {
                sTemp = ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp = ((char)(i + 0x30)).ToString();
            }
            i = bytHash[counter] % 16;
            if (i > 9)
            {
                sTemp += ((char)(i - 10 + 0x41)).ToString();
            }
            else
            {
                sTemp += ((char)(i + 0x30)).ToString();
            }
            sHash += sTemp;
        }
 
        //根據大小寫規則決定返回的字符串
        return toUpper ? sHash : sHash.ToLower();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

三、函數調用
建立項目ComputeHash,添加對HashTools.dll庫的引用。並添加代碼:

1
using HashTools;

然後在Main函數中添加下列代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
static void Main(string[] args)
{
    Console.WriteLine("MD5 of \"abc\"");
 
    Console.WriteLine("MD5_32(Upper): {0}"
        HashHelper.Hash_MD5_32("abc"));
    Console.WriteLine("MD5_32(Lower): {0}",
        HashHelper.Hash_MD5_32("abc"false));
 
    Console.WriteLine("MD5_16(Upper): {0}",
        HashHelper.Hash_MD5_16("abc"));
    Console.WriteLine("MD5_16(Lower): {0}",
        HashHelper.Hash_MD5_16("abc"false));
 
    Console.WriteLine("2_MD5_32(Upper): {0}"
        HashHelper.Hash_2_MD5_32("abc"));
    Console.WriteLine("2_MD5_32(Lower): {0}"
        HashHelper.Hash_2_MD5_32("abc"false));
 
    Console.WriteLine("2_MD5_32(Upper): {0}"
        HashHelper.Hash_2_MD5_16("abc"));
    Console.WriteLine("2_MD5_32(Lower): {0}"
        HashHelper.Hash_2_MD5_16("abc"false));
 
    Console.WriteLine("SHA of \"abc\"");
 
    Console.WriteLine("SHA-1(Upper): {0}"
        HashHelper.Hash_SHA_1("abc"));
    Console.WriteLine("SHA-1(Lower): {0}"
        HashHelper.Hash_SHA_1("abc"false));
 
    Console.WriteLine("SHA-256(Upper): {0}",
        HashHelper.Hash_SHA_256("abc"));
    Console.WriteLine("SHA-256(Lower): {0}",
        HashHelper.Hash_SHA_256("abc"false));
 
    Console.WriteLine("SHA-384(Upper): {0}",
        HashHelper.Hash_SHA_384("abc"));
    Console.WriteLine("SHA-384(Lower): {0}",
        HashHelper.Hash_SHA_384("abc"false));
 
    Console.WriteLine("SHA-512(Upper): {0}"
        HashHelper.Hash_SHA_512("abc"));
    Console.WriteLine("SHA-512(Lower): {0}"
        HashHelper.Hash_SHA_512("abc"false));
 
    Console.ReadLine();
}
運行結果如下:

END
發佈了3 篇原創文章 · 獲贊 11 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章