C#计算字符串哈希值(MD5、SHA)的方法小结

本文实例讲述了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函数中添加下列代码:

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();
}

运行结果如下:

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • C#实现的MD5加密功能与用法示例

    本文实例讲述了C#实现的MD5加密功能与用法.分享给大家供大家参考,具体如下: 1.创建MD5Str.cs加密处理类 public class MD5Str { /// <summary> /// 字符串MD5加密 /// </summary> /// <param name="Text">要加密的字符串</param> /// <returns>密文</returns> public static string

  • C#实现给定字符串生成MD5哈希的方法

    本文实例讲述了C#实现给定字符串生成MD5哈希的方法.分享给大家供大家参考.具体分析如下: 这里首先需要下面的命名空间的引用: 复制代码 代码如下: System.Security.Cryptography; System.Web.Security; 主要代码如下: /// <summary> /// method to generate a MD5 hash of a string /// </summary> /// <param name="strToHash

  • C#实现将32位MD5摘要串转换为128位二进制字符串的方法

    本文实例讲述了C#实现将32位MD5摘要串转换为128位二进制字符串的方法.分享给大家供大家参考,具体如下: 将32为MD5摘要串转换为128位二进制字符串: /// <summary> /// 将字符串转成二进制 /// </summary> /// <param name="s">源字符串</param> /// <returns>二进制串</returns> internal static string Co

  • 浅谈C#中Md5和Sha1两种加密方式

    1.新建控制台应用程序 2.新建类 EncryptHelper.cs public static class EncryptHelper { /// <summary> /// 基于Md5的自定义加密字符串方法:输入一个字符串,返回一个由32个字符组成的十六进制的哈希散列(字符串). /// </summary> /// <param name="str">要加密的字符串</param> /// <returns>加密后的十六

  • c# 实现MD5,SHA1,SHA256,SHA512等常用加密算法源代码

    复制代码 代码如下: using System; using System.IO; using System.Data; using System.Text; using System.Diagnostics; using System.Security; using System.Security.Cryptography; /**//* * .Net框架由于拥有CLR提供的丰富库支持,只需很少的代码即可实现先前使用C等旧式语言很难实现的加密算法.本类实现一些常用机密算法,供参考.其中MD5算

  • c#多种加解密示例(md5加密解密)

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Globalization;using System.IO;using System.Security.Cryptography;using System.Text; /// <summary>/// 加解密/// </summary>public static class CryptHelper{    #region RSA加密 /// &

  • C#计算文件MD5校验的方法

    本文实例讲述了C#计算文件MD5校验的方法.分享给大家供大家参考.具体分析如下: C#计算文件的MD5校验,从互联网上下载一个文件,可以使用下面的代码对文件进行MD5校验,看看生成的MD5编码是否和网站提供的一致,如果不一致则表示文件被修改过了,要慎重. protected string GetMD5HashFromFile(string fileName) { FileStream file = new FileStream(fileName,FileMode.Open); MD5 md5 =

  • C#实现的字符串转MD5码函数实例

    本文实例讲述了C#实现的字符串转MD5码函数.分享给大家供大家参考,具体如下: /* 测试环境:WinXP SP3.Visual Studio 2008 SP1.Visual Studio 2010 SP1 更新日期:2014-04-23 */ public string CalculateMD5Hash(string input) { MD5 md5 = System.Security.Cryptography.MD5.Create(); byte[] inputBytes = System.

  • C#生成MD5的函数代码

    复制代码 代码如下: public static string GetMD5(string sDataIn)        {            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();            byte[] bytValue, bytHash;            bytValue = System.Text.Encoding.UTF8.GetBytes(sDataIn);         

  • C#获取文件MD5值的实现示例

    前言 MD5是一种常见的加密方式,相对比较稳定,同时也是校验文件的一种方式,本文给大家介绍了利用C#获取文件MD5值的方法,直接使用即可,可用于对比文件是否相同.下面话不多说,来看示例代码吧 示例代码如下: /// <summary> /// 获取文件MD5值 /// </summary> /// <param name="fileName">文件绝对路径</param> /// <returns>MD5值</retur

随机推荐