`

常用的编码工具类,支持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();
    }

  }
}
分享到:
评论

相关推荐

    Java加密与解密的艺术

    可以攻玉1094.1 加固你的系统1094.2 加密组件Bouncy Castle 1114.3 辅助工具Commons Codec 1204.4 小结121第二部分实践篇第5章电子邮件传输算法—Base64 1345.1 Base64算法的由来1345.2 Base64算法的定义1345.3 Base...

    Java加密与解密的艺术配书源代码

    可以攻玉109 4.1 加固你的系统109 4.2 加密组件Bouncy Castle 111 4.3 辅助工具Commons Codec 120 4.4 小结121 第二部分实践篇 第5章电子邮件传输算法—Base64 134 5.1 Base64算法的由来134 5.2 Base64算法的定义134...

    790个易模块打包下载-2

    ODBC方式填充树型框.ec PGBEAPICopy.ec powerdll.ec PrintData.ec ProcessInfo-1.ec ...MD5取数据摘要.EC ...CRC32.EC cs.ec Cur.ec des.ec DES加密模块 1.0.ec disk.ec DisplaySettings.ec DLL注入.ec...

    790个易模块-3

    ODBC方式填充树型框.ec PGBEAPICopy.ec powerdll.ec PrintData.ec ProcessInfo-1.ec ...MD5取数据摘要.EC ...CRC32.EC cs.ec Cur.ec des.ec DES加密模块 1.0.ec disk.ec DisplaySettings.ec DLL注入.ec...

    790个易模块打包

    ODBC方式填充树型框.ec PGBEAPICopy.ec powerdll.ec PrintData.ec ProcessInfo-1.ec ...MD5取数据摘要.EC ...CRC32.EC cs.ec Cur.ec des.ec DES加密模块 1.0.ec disk.ec DisplaySettings.ec DLL注入.ec...

    asp.net知识库

    常用编码工具类,支持base64,md5,des,crc32 也谈谈技术面试 在C#里把ArrayList转换为Array 或 把Array转换为ArrayList C# 2.0 在.NET 2.0中,让你的组件也可以绑定 .NET20 一种简单的窗口控件UI状态控制方法 翻译MSDN...

    1345个易语言模块

    CRC32.EC cs.ec Cur.ec debugprocess.ec des.ec DES 加密模块 1.0.ec DES加解密模块des.ec DirectX8VB组件调用模块.ec disk.ec DisplaySettings.ec DIY 热键框模块.ec DLL.ec DLL注入模块.ec DOS命令模块.ec dqf1996...

    1350多个精品易语言模块

    CRC32.EC cs.ec Cur.ec debugprocess.ec des.ec DES 加密模块 1.0.ec DES加解密模块des.ec DirectX8VB组件调用模块.ec disk.ec DisplaySettings.ec DIY 热键框模块.ec DLL.ec DLL注入模块.ec DOS命令模块.ec dqf1996...

    vc++ 应用源码包_5

    MD5算法 MediaPlayer 视频播放的实现。 MFC 对话框 MP3 内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER ...

    vc++ 开发实例源码包

    MD5算法 如题。 MediaPlayer 视频播放的实现。 MFC 对话框 MP3 内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_...

    vc++ 应用源码包_1

    MD5算法 MediaPlayer 视频播放的实现。 MFC 对话框 MP3 内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER ...

    vc++ 应用源码包_2

    MD5算法 MediaPlayer 视频播放的实现。 MFC 对话框 MP3 内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER ...

    vc++ 应用源码包_6

    MD5算法 MediaPlayer 视频播放的实现。 MFC 对话框 MP3 内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER ...

    vc++ 应用源码包_3

    MD5算法 MediaPlayer 视频播放的实现。 MFC 对话框 MP3 内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER ...

Global site tag (gtag.js) - Google Analytics