时间:2021-05-20
本文实例讲述了C#计算字符串哈希值(MD5、SHA)的方法。分享给大家供大家参考。具体如下:
一、关于本文
本文中是一个类库,包括下面几个函数:
① 计算32位MD5码(大小写):Hash_MD5_32
② 计算16位MD5码(大小写):Hash_MD5_16
③ 计算32位2重MD5码(大小写):Hash_2_MD5_32
④ 计算16位2重MD5码(大小写):Hash_2_MD5_16
⑤ 计算SHA-1码(大小写):Hash_SHA_1
⑥ 计算SHA-256码(大小写):Hash_SHA_256
⑦ 计算SHA-384码(大小写):Hash_SHA_384
⑧ 计算SHA-512码(大小写):Hash_SHA_512
编译后被打包成文件HashTools.dll,其他程序可以在添加引用后对这些函数进行调用
二、类库中各函数代码
1. 类库结构
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace HashTools{ public class HashHelper { //各个函数 }}2. 计算32位MD5码(大小写):Hash_MD5_32
/// <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); }}3. 计算16位MD5码(大小写):Hash_MD5_16
/// <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); }}4. 计算32位2重MD5码(大小写):Hash_2_MD5_32
/// <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); }}5. 计算16位2重MD5码(大小写):Hash_2_MD5_16
/// <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); }}6. 计算SHA-1码(大小写):Hash_SHA_1
/// <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); }}7. 计算SHA-256码(大小写):Hash_SHA_256
/// <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); }}8. 计算SHA-384码(大小写):Hash_SHA_384
/// <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); }}9. 计算SHA-512码(大小写):Hash_SHA_512
/// <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库的引用。并添加代码:
复制代码 代码如下:using HashTools;
然后在Main函数中添加下列代码:
运行结果如下:
希望本文所述对大家的C#程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
复制代码代码如下://计算字符串的MD5值publicstringGetMD5(stringsDataIn){MD5CryptoServiceProviderm
本文实例讲述了C#实现将32位MD5摘要串转换为128位二进制字符串的方法。分享给大家供大家参考,具体如下:将32为MD5摘要串转换为128位二进制字符串://
本文实例讲述了C#实现给定字符串生成MD5哈希的方法。分享给大家供大家参考。具体分析如下:这里首先需要下面的命名空间的引用:复制代码代码如下:System.Se
起因最近遇到一个问题,把某个字符串计算MD5,之后把该字符串加密与MD5一起上传到服务端,服务端解密后重新计算md5发现与上传的MD5不一致,而出问题的字符串中
python之hashlib模块:主要提供字符加密功能,python3中将md5和sha模块整合到了hashlib模块,支持md5,sha1,sha224,sh