散列哈希加密

  /// <summary>
  /// 散列哈希加密(MD5 SHA HMACSHA)
  /// </summary>
  public static class HashAlgorithmEncrypt
  {
    /// <summary>
    ///返回值类型
    /// </summary>
    public enum UpperLower
    {
      /// <summary>
      /// 大写
      /// </summary>
      Upper,
      /// <summary>
      /// 小写
      /// </summary>
      Lower
    }

    /// <summary>
    /// 位数
    /// </summary>
    public enum Bit
    {
      /// <summary>
      /// 16位
      /// </summary>
      bit16,
      /// <summary>
      /// 32位
      /// </summary>
      bit32
    }

    #region MD5

    /// <summary>
    /// MD5加密
    /// </summary>
    /// <param name="data">要加密的明文</param>
    /// <param name="dataEncoding">加载要加密的明文的编码方式</param>
    /// <param name="bit">MD5加密16位或32位</param>
    /// <param name="upperLower">密文值返回大小写</param>
    /// <returns></returns>
    public static string MD5Encrypt(string data, Encoding dataEncoding, Bit bit, UpperLower upperLower)
    {
      using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
      {
        byte[] dataBytes = md5.ComputeHash(dataEncoding.GetBytes(data));
        string encryptStr = (bit == Bit.bit16) ? BitConverter.ToString(dataBytes, 4, 8) : BitConverter.ToString(dataBytes);
        encryptStr = encryptStr.Replace("-", "");
        return upperLower == UpperLower.Upper ? encryptStr.ToUpper() : encryptStr.ToLower();
      }
    }

    #endregion

    #region SHA

    /// <summary>
    /// SHA1
    /// </summary>
    /// <param name="data">要加密的明文</param>
    /// <param name="dataEncoding">加载要加密的明文的编码方式</param>
    /// <param name="upperLower">密文值返回大小写</param>
    /// <returns></returns>
    public static string SHA1Encrypt(string data, Encoding dataEncoding, UpperLower upperLower)
    {
      StringBuilder sb = new StringBuilder();
      using (SHA1Managed sha1 = new SHA1Managed())
      {
        byte[] dataBytes = dataEncoding.GetBytes(data);
        byte[] encryptBytes = sha1.ComputeHash(dataBytes);
        for (int i = 0; i < encryptBytes.Length; i++)
        {
          sb.Append(upperLower == UpperLower.Upper ? encryptBytes[i].ToString("X2") : encryptBytes[i].ToString("x2"));
        }
        return sb.ToString();
      }
    }

    /// <summary>
    /// SHA256
    /// </summary>
    /// <param name="data">要加密的明文</param>
    /// <param name="dataEncoding">加载要加密的明文的编码方式</param>
    /// <param name="upperLower">密文值返回大小写</param>
    /// <returns></returns>
    public static string SHA256Encrypt(string data, Encoding dataEncoding, UpperLower upperLower)
    {
      StringBuilder sb = new StringBuilder();
      using (SHA256Managed sha256 = new SHA256Managed())
      {
        byte[] dataBytes = dataEncoding.GetBytes(data);
        byte[] encryptBytes = sha256.ComputeHash(dataBytes);
        for (int i = 0; i < encryptBytes.Length; i++)
        {
          sb.Append(upperLower == UpperLower.Upper ? encryptBytes[i].ToString("X2") : encryptBytes[i].ToString("x2"));
        }
        return sb.ToString();
      }
    }

    /// <summary>
    /// SHA384
    /// </summary>
    /// <param name="data">要加密的明文</param>
    /// <param name="dataEncoding">加载要加密的明文的编码方式</param>
    /// <param name="upperLower">密文值返回大小写</param>
    /// <returns></returns>
    public static string SHA384Encrypt(string data, Encoding dataEncoding, UpperLower upperLower)
    {
      StringBuilder sb = new StringBuilder();
      using (SHA384Managed sha384 = new SHA384Managed())
      {
        byte[] dataBytes = dataEncoding.GetBytes(data);
        byte[] encryptBytes = sha384.ComputeHash(dataBytes);
        for (int i = 0; i < encryptBytes.Length; i++)
        {
          sb.Append(upperLower == UpperLower.Upper ? encryptBytes[i].ToString("X2") : encryptBytes[i].ToString("x2"));
        }
        return sb.ToString();
      }
    }

    /// <summary>
    /// SHA512
    /// </summary>
    /// <param name="data">要加密的明文</param>
    /// <param name="dataEncoding">加载要加密的明文的编码方式</param>
    /// <param name="upperLower">密文值返回大小写</param>
    /// <returns></returns>
    public static string SHA512Encrypt(string data, Encoding dataEncoding, UpperLower upperLower)
    {
      StringBuilder sb = new StringBuilder();
      using (SHA512Managed sha512 = new SHA512Managed())
      {
        byte[] dataBytes = dataEncoding.GetBytes(data);
        byte[] encryptBytes = sha512.ComputeHash(dataBytes);
        for (int i = 0; i < encryptBytes.Length; i++)
        {
          sb.Append(upperLower == UpperLower.Upper ? encryptBytes[i].ToString("X2") : encryptBytes[i].ToString("x2"));
        }
        return sb.ToString();
      }
    }

    #endregion

    #region HMACSHA

    /// <summary>
    /// HMACMD5
    /// </summary>
    /// <param name="data">要加密的明文</param>
    /// <param name="key">秘钥</param>
    /// <param name="dataEncoding">加载要加密的明文的编码方式</param>
    /// <param name="upperLower">密文值返回大小写</param>
    /// <returns></returns>
    public static string HMACMD5Encrypt(string data, string key, Encoding dataEncoding, UpperLower upperLower)
    {
      StringBuilder sb = new StringBuilder();
      using (HMACMD5 hmacmd5 = new HMACMD5())
      {
        hmacmd5.Key = System.Text.Encoding.UTF8.GetBytes(key);
        byte[] dataBytes = dataEncoding.GetBytes(data);
        byte[] encryptBytes = hmacmd5.ComputeHash(dataBytes);
        for (int i = 0; i < encryptBytes.Length; i++)
        {
          sb.Append(upperLower == UpperLower.Upper ? encryptBytes[i].ToString("X2") : encryptBytes[i].ToString("x2"));
        }
        return sb.ToString();
      }
    }

    /// <summary>
    /// HMACSHA1
    /// </summary>
    /// <param name="data">要加密的明文</param>
    /// <param name="key">秘钥</param>
    /// <param name="dataEncoding">加载要加密的明文的编码方式</param>
    /// <param name="upperLower">密文值返回大小写</param>
    /// <returns></returns>
    public static string HMACSHA1Encrypt(string data, string key, Encoding dataEncoding, UpperLower upperLower)
    {
      StringBuilder sb = new StringBuilder();
      using (HMACSHA1 hmacsha1 = new HMACSHA1())
      {
        hmacsha1.Key = System.Text.Encoding.UTF8.GetBytes(key);
        byte[] dataBytes = dataEncoding.GetBytes(data);
        byte[] encryptBytes = hmacsha1.ComputeHash(dataBytes);
        for (int i = 0; i < encryptBytes.Length; i++)
        {
          sb.Append(upperLower == UpperLower.Upper ? encryptBytes[i].ToString("X2") : encryptBytes[i].ToString("x2"));
        }
        return sb.ToString();
      }
    }

    /// <summary>
    /// HMACSHA256
    /// </summary>
    /// <param name="data">要加密的明文</param>
    /// <param name="key">秘钥</param>
    /// <param name="dataEncoding">加载要加密的明文的编码方式</param>
    /// <param name="upperLower">密文值返回大小写</param>
    /// <returns></returns>
    public static string HMACSHA256Encrypt(string data, string key, Encoding dataEncoding, UpperLower upperLower)
    {
      StringBuilder sb = new StringBuilder();
      using (HMACSHA256 hmacsha256 = new HMACSHA256())
      {
        hmacsha256.Key = System.Text.Encoding.UTF8.GetBytes(key);
        byte[] dataBytes = dataEncoding.GetBytes(data);
        byte[] encryptBytes = hmacsha256.ComputeHash(dataBytes);
        for (int i = 0; i < encryptBytes.Length; i++)
        {
          sb.Append(upperLower == UpperLower.Upper ? encryptBytes[i].ToString("X2") : encryptBytes[i].ToString("x2"));
        }
        return sb.ToString();
      }
    }

    /// <summary>
    /// HMACSHA384(结果有问题)
    /// </summary>
    /// <param name="data">要加密的明文</param>
    /// <param name="key">秘钥</param>
    /// <param name="dataEncoding">加载要加密的明文的编码方式</param>
    /// <param name="upperLower">密文值返回大小写</param>
    /// <returns></returns>
    public static string HMACSHA384Encrypt(string data, string key, Encoding dataEncoding, UpperLower upperLower)
    {
      StringBuilder sb = new StringBuilder();
      using (HMACSHA384 hmacsha384 = new HMACSHA384())
      {
        hmacsha384.Key = System.Text.Encoding.UTF8.GetBytes(key);
        byte[] dataBytes = dataEncoding.GetBytes(data);
        byte[] encryptBytes = hmacsha384.ComputeHash(dataBytes);
        for (int i = 0; i < encryptBytes.Length; i++)
        {
          sb.Append(upperLower == UpperLower.Upper ? encryptBytes[i].ToString("X2") : encryptBytes[i].ToString("x2"));
        }
        return sb.ToString();
      }
    }

    /// <summary>
    /// HMACSHA512
    /// </summary>
    /// <param name="data">要加密的明文</param>
    /// <param name="key">秘钥</param>
    /// <param name="dataEncoding">加载要加密的明文的编码方式</param>
    /// <param name="upperLower">密文值返回大小写</param>
    /// <returns></returns>
    public static string HMACSHA512Encrypt(string data, string key, Encoding dataEncoding, UpperLower upperLower)
    {
      StringBuilder sb = new StringBuilder();
      using (HMACSHA512 hmacsha512 = new HMACSHA512())
      {
        hmacsha512.Key = System.Text.Encoding.UTF8.GetBytes(key);
        byte[] dataBytes = dataEncoding.GetBytes(data);
        byte[] encryptBytes = hmacsha512.ComputeHash(dataBytes);
        for (int i = 0; i < encryptBytes.Length; i++)
        {
          sb.Append(upperLower == UpperLower.Upper ? encryptBytes[i].ToString("X2") : encryptBytes[i].ToString("x2"));
        }
        return sb.ToString();
      }
    }

    #endregion

  }

 

转载于:https://www.cnblogs.com/tlmbem/p/10798865.html

加密哈希散列函数可以用多种算法实现,其中比较常用的有MD5、SHA-1、SHA-256等。下面以SHA-256为例,介绍如何用C语言实现加密哈希散列函数。 首先,我们需要用到一个SHA-256的库,比较常用的有openssl库和libgcrypt库。这里我们以openssl库为例,需要在代码中include openssl/sha.h头文件,并链接libssl库。具体实现如下: ```c #include <stdio.h> #include <string.h> #include <openssl/sha.h> int main() { char str[] = "hello world"; unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256(str, strlen(str), hash); int i; for(i = 0; i < SHA256_DIGEST_LENGTH; i++) { printf("%02x", hash[i]); } printf("\n"); return 0; } ``` 上面的代码中,我们将字符串"hello world"进行SHA-256哈希哈希结果存储在hash数组中,然后将hash数组中的每个字节以16进制形式输出。输出结果为: ``` b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 ``` 这就是字符串"hello world"的SHA-256哈希值。 需要注意的是,SHA-256哈希值的长度为32字节,因此我们定义了一个长度为32的unsigned char数组来存储哈希值。如果使用其他哈希算法,哈希值的长度可能不同,需要相应地调整数组的长度。 另外,由于SHA-256是一种加密哈希算法,其安全性比较高,但运算速度相对较慢。如果只需要实现加密哈希散列函数,可以考虑使用一些速度更快的算法,如MurmurHash、CityHash等。这些算法的实现比较简单,可以在网上找到相关的代码库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值