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