c# 常用编码工具类,支持base64,md5,des,crc32

复制代码
using System;
using System.IO;
using System.Security;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.Text;
namespace YNEC.Services.Encrypt
{
  /**/
  /// <summary>
  /// CRC 效验
  /// 快速检测算法
  /// </summary>
  public class CRC32
  {
    protected ulong[] crc32Table;
    /**/
    /// <summary>
    /// 构造:初始化效验表
    /// </summary>
    public CRC32()
    {
    const ulong ulPolynomial = 0xEDB88320;
    ulong dwCrc;
    crc32Table = new ulong[256];
    int i, j;
    for (i = 0; i < 256; i++)
    {
      dwCrc = (ulong)i;
      for (j = 8; j > 0; j--)
      {
        if ((dwCrc & 1) == 1)
        dwCrc = (dwCrc >> 1) ^ ulPolynomial;
        else
        dwCrc >>= 1;
      }
      crc32Table[i] = dwCrc;
    }
    }
    /**/
    /// <summary>
    /// 字节数组效验
    /// </summary>
    /// <param name="buffer">ref 字节数组</param>
    /// <returns></returns>
    public ulong ByteCRC(ref byte[] buffer)
    {
    ulong ulCRC = 0xffffffff;
    ulong len;
    len = (ulong)buffer.Length;
    for (ulong buffptr = 0; buffptr < len; buffptr++)
    {
      ulong tabPtr = ulCRC & 0xFF;
      tabPtr = tabPtr ^ buffer[buffptr];
      ulCRC = ulCRC >> 8;
      ulCRC = ulCRC ^ crc32Table[tabPtr];
    }
    return ulCRC ^ 0xffffffff;
    }
    /**/
    /// <summary>
    /// 字符串效验
    /// </summary>
    /// <param name="sInputString">字符串</param>
    /// <returns></returns>
    public ulong StringCRC(string sInputString)
    {
    byte[] buffer = Encoding.Default.GetBytes(sInputString);
    return ByteCRC(ref buffer);
    }
    /**/
    /// <summary>
    /// 文件效验
    /// </summary>
    /// <param name="sInputFilename">输入文件</param>
    /// <returns></returns>
    public ulong FileCRC(string sInputFilename)
    {
    FileStream inFile = new System.IO.FileStream(sInputFilename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
    byte[] bInput = new byte[inFile.Length];
    inFile.Read(bInput, 0, bInput.Length);
    inFile.Close();
    return ByteCRC(ref bInput);
    }
  }
  /**/
  /// <summary>
  /// MD5 无逆向编码
  /// 获取唯一特征串,可用于密码加密
  /// (无法还原)
  /// </summary>
  public class MD5
  {
    public MD5()
    {
    }
    /**/
    /// <summary>
    /// 获取字符串的特征串
    /// </summary>
    /// <param name="sInputString">输入文本</param>
    /// <returns></returns>
    public string HashString(string sInputString)
    {
    System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
    string encoded = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(sInputString))).Replace("-", "");
    return encoded;
    }
    /**/
    /// <summary>
    /// 获取文件的特征串
    /// </summary>
    /// <param name="sInputFilename">输入文件</param>
    /// <returns></returns>
    public string HashFile(string sInputFilename)
    {
    System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
    FileStream inFile = new System.IO.FileStream(sInputFilename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
    byte[] bInput = new byte[inFile.Length];
    inFile.Read(bInput, 0, bInput.Length);
    inFile.Close();
    string encoded = BitConverter.ToString(md5.ComputeHash(bInput)).Replace("-", "");
    return encoded;
    }
  }
  /**/
  /// <summary>
  /// Base64 UUEncoded 编码
  /// 将二进制编码为ASCII文本,用于网络传输
  /// (可还原)
  /// </summary>
  public class BASE64
  {
    public BASE64()
    {
    }
    /**/
    /// <summary>
    /// 解码字符串
    /// </summary>
    /// <param name="sInputString">输入文本</param>
    /// <returns></returns>
    public string DecryptString(string sInputString)
    {
    char[] sInput = sInputString.ToCharArray();
    try
    {
      byte[] bOutput = System.Convert.FromBase64String(sInputString);
      return Encoding.Default.GetString(bOutput);
    }
    catch (System.ArgumentNullException)
    {
      //base 64 字符数组为null
      return "";
    }
    catch (System.FormatException)
    {
      //长度错误,无法整除4
      return "";
    }
    }
    /**/
    /// <summary>
    /// 编码字符串
    /// </summary>
    /// <param name="sInputString">输入文本</param>
    /// <returns></returns>
    public string EncryptString(string sInputString)
    {
    byte[] bInput = Encoding.Default.GetBytes(sInputString);
    try
    {
      return System.Convert.ToBase64String(bInput, 0, bInput.Length);
    }
    catch (System.ArgumentNullException)
    {
      //二进制数组为NULL.
      return "";
    }
    catch (System.ArgumentOutOfRangeException)
    {
      //长度不够
      return "";
    }
    }
    /**/
    /// <summary>
    /// 解码文件
    /// </summary>
    /// <param name="sInputFilename">输入文件</param>
    /// <param name="sOutputFilename">输出文件</param>
    public void DecryptFile(string sInputFilename, string sOutputFilename)
    {
    System.IO.StreamReader inFile;
    char[] base64CharArray;
    try
    {
      inFile = new System.IO.StreamReader(sInputFilename,
      System.Text.Encoding.ASCII);
      base64CharArray = new char[inFile.BaseStream.Length];
      inFile.Read(base64CharArray, 0, (int)inFile.BaseStream.Length);
      inFile.Close();
    }
    catch
    {//(System.Exception exp) {
      return;
    }
    // 转换Base64 UUEncoded为二进制输出
    byte[] binaryData;
    try
    {
      binaryData =
      System.Convert.FromBase64CharArray(base64CharArray,
      0,
      base64CharArray.Length);
    }
    catch (System.ArgumentNullException)
    {
      //base 64 字符数组为null
      return;
    }
    catch (System.FormatException)
    {
      //长度错误,无法整除4
      return;
    }
    // 写输出数据
    System.IO.FileStream outFile;
    try
    {
      outFile = new System.IO.FileStream(sOutputFilename,
      System.IO.FileMode.Create,
      System.IO.FileAccess.Write);
      outFile.Write(binaryData, 0, binaryData.Length);
      outFile.Close();
    }
    catch
    {
      // (System.Exception exp) {
      //流错误
    }
    }
    /**/
    /// <summary>
    /// 编码文件
    /// </summary>
    /// <param name="sInputFilename">输入文件</param>
    /// <param name="sOutputFilename">输出文件</param>
    public void EncryptFile(string sInputFilename, string sOutputFilename)
    {
    System.IO.FileStream inFile;
    byte[] binaryData;
    try
    {
      inFile = new System.IO.FileStream(sInputFilename,
      System.IO.FileMode.Open,
      System.IO.FileAccess.Read);
      binaryData = new Byte[inFile.Length];
      long bytesRead = inFile.Read(binaryData, 0,
      (int)inFile.Length);
      inFile.Close();
    }
    catch
    { //(System.Exception exp) {
      return;
    }
    // 转换二进制输入为Base64 UUEncoded输出
    // 每3个字节在源数据里作为4个字节
    long arrayLength = (long)((4.0d / 3.0d) * binaryData.Length);
    // 如果无法整除4
    if (arrayLength % 4 != 0)
    {
      arrayLength += 4 - arrayLength % 4;
    }
    char[] base64CharArray = new char[arrayLength];
    try
    {
      System.Convert.ToBase64CharArray(binaryData,
      0,
      binaryData.Length,
      base64CharArray,
      0);
    }
    catch (System.ArgumentNullException)
    {
      //二进制数组为NULL.
      return;
    }
    catch (System.ArgumentOutOfRangeException)
    {
      //长度不够
      return;
    }
    // 写UUEncoded数据到文件内
    System.IO.StreamWriter outFile;
    try
    {
      outFile = new System.IO.StreamWriter(sOutputFilename,
      false,
      System.Text.Encoding.ASCII);
      outFile.Write(base64CharArray);
      outFile.Close();
    }
    catch
    {// (System.Exception exp) {
      //文件流出错
    }
    }
  }
  /**/
  /// <summary>
  /// DES 加密
  /// 支持Key(钥匙)加密变化
  /// 支持还原
  ///
  /// 演示操作:
  ///  // 64位,8个字节
  ///  string sSecretKey;
  ///
  ///  // 获取Key
  ///  sSecretKey = GenerateKey();
  ///
  ///  // 托管
  ///  GCHandle gch = GCHandle.Alloc( sSecretKey,GCHandleType.Pinned );
  ///
  ///  // 加密文件
  ///  EncryptFile(@"C:\MyData.txt",
  ///  @"C:\Encrypted.txt",
  ///  sSecretKey);
  ///
  ///  // 解密文件
  ///  DecryptFile(@"C:\Encrypted.txt",
  ///  @"C:\Decrypted.txt",
  ///  sSecretKey);
  ///
  ///  // 释放托管内容
  ///  ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2);
  ///  gch.Free();
  /// </summary>
  public class DES
  {
    [DllImport("KERNEL32.DLL", EntryPoint = "RtlZeroMemory")]
    public static extern bool ZeroMemory(IntPtr Destination, int Length);
    public DES()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
    /**/
    /// <summary>
    /// 创建Key
    /// </summary>
    /// <returns></returns>
    public string GenerateKey()
    {
    // 创建一个DES 算法的实例。自动产生Key
    DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
    // 返回自动创建的Key 用于加密
    return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
    }
    /**/
    /// <summary>
    /// 加密字符串
    /// </summary>
    /// <param name="sInputString">输入字符</param>
    /// <param name="sKey">Key</param>
    /// <returns>加密结果</returns>
    public string EncryptString(string sInputString, string sKey)
    {
    byte[] data = Encoding.Default.GetBytes(sInputString);
    byte[] result;
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    result = desencrypt.TransformFinalBlock(data, 0, data.Length);
    string desString = "";
    for (int i = 0; i < result.Length; i++)
    {
      desString += result[i].ToString() + "-";
    }
    //return desString.TrimEnd("-");
    return BitConverter.ToString(result);
    }
    /**/
    /// <summary>
    /// 解密字符串
    /// </summary>
    /// <param name="sInputString">输入字符</param>
    /// <param name="sKey">Key</param>
    /// <returns>解密结果</returns>
    public string DecryptString(string sInputString, string sKey)
    {
    string[] sInput = sInputString.Split("-".ToCharArray());
    byte[] data = new byte[sInput.Length];
    byte[] result;
    for (int i = 0; i < sInput.Length; i++)
      data[i] = byte.Parse(sInput[i], System.Globalization.NumberStyles.HexNumber);
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    ICryptoTransform desencrypt = DES.CreateDecryptor();
    result = desencrypt.TransformFinalBlock(data, 0, data.Length);
    return Encoding.Default.GetString(result);
    }
    /**/
    /// <summary>
    /// 加密文件
    /// </summary>
    /// <param name="sInputFilename">输入文件</param>
    /// <param name="sOutputFilename">输出文件</param>
    /// <param name="sKey">Key</param>
    public void EncryptFile(string sInputFilename,
    string sOutputFilename,
    string sKey)
    {
    FileStream fsInput = new FileStream(sInputFilename,
      FileMode.Open,
      FileAccess.Read);
    FileStream fsEncrypted = new FileStream(sOutputFilename,
      FileMode.Create,
      FileAccess.Write);
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    ICryptoTransform desencrypt = DES.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsEncrypted,
      desencrypt,
      CryptoStreamMode.Write);
    byte[] bytearrayinput = new byte[fsInput.Length];
    fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
    cryptostream.Close();
    fsInput.Close();
    fsEncrypted.Close();
    }
    /**/
    /// <summary>
    /// 解密文件
    /// </summary>
    /// <param name="sInputFilename">输入文件</param>
    /// <param name="sOutputFilename">输出文件</param>
    /// <param name="sKey">Key</param>
    public void DecryptFile(string sInputFilename,
    string sOutputFilename,
    string sKey)
    {
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    FileStream fsread = new FileStream(sInputFilename,
      FileMode.Open,
      FileAccess.Read);
    ICryptoTransform desdecrypt = DES.CreateDecryptor();
    CryptoStream cryptostreamDecr = new CryptoStream(fsread,
      desdecrypt,
      CryptoStreamMode.Read);
    StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
    fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
    fsDecrypted.Flush();
    fsDecrypted.Close();
    }
  }
}
复制代码
posted @   ado-geek  阅读(608)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示