• DES,RC2,Rijndael, TripleDes,RSA, MD5, SHA1通用的安全密码类


    using System;
    using System.IO;
    using System.Text;
    using System.Security.Cryptography;
    using System.Web.Security;

    //工程需要引用system.web.dll

    /**//*
     * 通用的安全密码类
     *
     * 本类库支持DES,RC2,Rijndael, TripleDes,RSA, MD5, SHA1等六种加密格式
     *
     * 注意:MD5, SHA1加密是不可逆的,所以不支持他们的解密;
     *
     * 支持生成Key/公钥,Iv/私钥及简单的随机字符;
     *
     * SmartJavaer
     *
     * SmartJavaer@163.com
     *
     * 2006/10/26
     *
     */

    namespace ManagePassword
    {
     //枚举加密格式
     #region 枚举加密格式
       
     /**//// <summary>
     /// 枚举加密的格式
     ///
     /// 对称加密:DES,RC2,RIJNDAEL,TripleDes
     /// 非对称加密:DSA,RSA
     /// 哈西加密:MD5,SHA1
     ///
     /// </summary>
     public enum CryptogramFormat { Des = 1, Rc2, Rijndael, TripleDes,RSA,MD5, SHA1 }
       
     #endregion

     //通用密码类
     #region 通用密码类
       
     /**//// <summary>
     /// 一个通用的加密类
     /// 支持DES,RC2,Rijndael, TripleDes,RSA, MD5, SHA1等六种加密格式
     /// 注意:MD5, SHA1加密是不可逆的,所以不支持他们的解密;
     /// 支持生成Key/公钥,Iv/私钥及简单的随机字符;
     /// </summary>
     public class Cryptogram
     {
      private Cryptogram() { }

      //加密,解密内部处理
          #region 加密,解密内部处理
          /**//// <summary>
          /// 生成Des,Rc2,Rijndael,TripleDes的处理对象
          /// </summary>
          /// <param name="encryptionFormat">加密格式</param>
          /// <param name="key">Key</param>
          /// <param name="iv">IV</param>
          /// <returns>返回处理对象,若返回null,则表示生成失败;</returns>
          private static SymmetricAlgorithm GetCSP(CryptogramFormat encryptionFormat,string key,string iv)
          {
           SymmetricAlgorithm mCSP;
               
           switch (encryptionFormat)
           {
            case CryptogramFormat.Des:
            {
             mCSP = new DESCryptoServiceProvider();
             break;
            }
            case CryptogramFormat.TripleDes:
            {
             mCSP = new TripleDESCryptoServiceProvider();
             break;
            }
            case CryptogramFormat.Rc2:
            {
             mCSP = new RC2CryptoServiceProvider();
             break;
            }
            case CryptogramFormat.Rijndael:
            {
             mCSP = new RijndaelManaged();
             break;
            }
            default:
             mCSP = null;
             break;
           }

           if (mCSP == null)
            return null;

           if(key.Length==0)
            // if(String.IsNullOrEmpty(key))
           {
            //mCSP.GenerateKey();
            return null;
           }
           else
           {
            try
            {
             mCSP.Key = Convert.FromBase64String(key);
            }
            catch
            {
             //mCSP.GenerateKey();
             return null;
            }
           }

           if (iv.Length==0)
            //if (String.IsNullOrEmpty(iv))
           {
            //mCSP.GenerateIV();
            return null;
           }
           else
           {
            try
            {
             mCSP.IV = Convert.FromBase64String(iv);
            }
            catch
            {
             //mCSP.GenerateIV();
             return null;
            }
           }
           return mCSP;
          }

      /**//// <summary>
      /// Des,Rc2,Rijndael,TripleDes加密
      /// </summary>
      /// <param name="encryptionFormat">加密格式</param>
      /// <param name="srcString">欲加密的字符串</param>
      /// <param name="key">Key</param>
      /// <param name="iv">IV</param>
      /// <returns>返回加密后的字符串,若返回null,则表示加密失败;</returns>
      private static string CSPEncode(CryptogramFormat encryptionFormat, string srcString, string key, string iv)
      {
       SymmetricAlgorithm mCSP;
       ICryptoTransform ct;
       MemoryStream ms;
       CryptoStream cs;
       byte[] byt;

       mCSP = GetCSP(encryptionFormat, key, iv);
       if (mCSP == null)
        return null;
       try
       {
        ct = mCSP.CreateEncryptor(mCSP.Key, mCSP.IV);

        byt = Convert.FromBase64String(srcString);
        ms = new MemoryStream();
        cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
        cs.Write(byt, 0, byt.Length);
        cs.FlushFinalBlock();

        cs.Close();
        return Convert.ToBase64String(ms.ToArray());
       }
       catch
       {
        return null;
       }
      }

      /**//// <summary>
      /// Des,Rc2,Rijndael,TripleDes解密
      /// </summary>
      /// <param name="encryptionFormat"></param>
      /// <param name="srcString"></param>
      /// <param name="key"></param>
      /// <param name="iv"></param>
      /// <returns></returns>
      private static string CSPDecode(CryptogramFormat encryptionFormat, string srcString, string key, string iv)
      {
       SymmetricAlgorithm mCSP;
       ICryptoTransform ct;
       MemoryStream ms;
       CryptoStream cs;
       byte[] byt;
       mCSP = GetCSP(encryptionFormat, key, iv);
       if (mCSP == null)
        return null;
       try
       {
        ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
        byt = Convert.FromBase64String(srcString);

        ms = new MemoryStream();
        cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
        cs.Write(byt, 0, byt.Length);
        cs.FlushFinalBlock();
        cs.Close();

        return Convert.ToBase64String(ms.ToArray());
       }
       catch
       {
        return null;
       }
      }
     
      /**//// <summary>
      /// RSA加密
      /// </summary>
      /// <param name="encryptionFormat"></param>
      /// <param name="srcString"></param>
      /// <param name="key"></param>
      /// <param name="iv"></param>
      /// <returns></returns>
      private static string RSAEncode(CryptogramFormat encryptionFormat, string srcString, string key, string iv)
      {
       RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider();
       byte[] toEncryptData = null;
       byte[] encryptedData = null;

       try
       {
        rsa1.FromXmlString(key);
       }
       catch
       {
        return null;
       }

       try
       {
        rsa1.FromXmlString(iv);
       }
       catch
       {
        return null;
       }

       toEncryptData = Convert.FromBase64String(srcString);
       encryptedData = rsa1.Encrypt(toEncryptData, false);//加密后的数据
       return Convert.ToBase64String(encryptedData);
      }

      /**//// <summary>
      /// RSA解密
      /// </summary>
      /// <param name="encryptionFormat"></param>
      /// <param name="srcString"></param>
      /// <param name="key"></param>
      /// <param name="iv"></param>
      /// <returns></returns>
      private static string RSADecode(CryptogramFormat encryptionFormat, string srcString, string key, string iv)
      {
       RSACryptoServiceProvider rsaD = new RSACryptoServiceProvider();
       byte[] encryptedData = null ;
       byte[] decryptedData = null ;

       try
       {
        rsaD.FromXmlString(key);
       }
       catch
       {
        return null;
       }

       try
       {
        rsaD.FromXmlString(iv);
       }
       catch
       {
        return null;
       }

       encryptedData = Convert.FromBase64String(srcString);
       decryptedData = rsaD.Decrypt(encryptedData, false);//解密后的数据
       return Convert.ToBase64String(decryptedData);
      }

      /**//// <summary>
      /// 生成对称加密格式的Key和IV
      /// </summary>
      /// <param name="encryptionFormat">加密格式</param>
      /// <param name="key"></param>
      /// <param name="iv"></param>
      private static void KeyAndIV(CryptogramFormat encryptionFormat, ref string key, ref string iv)
      {
       SymmetricAlgorithm mCSP;

       switch (encryptionFormat)
       {
        case CryptogramFormat.Des:
        {
         mCSP = new DESCryptoServiceProvider();
         break;
        }
        case CryptogramFormat.TripleDes:
        {
         mCSP = new TripleDESCryptoServiceProvider();
         break;
        }
        case CryptogramFormat.Rc2:
        {
         mCSP = new RC2CryptoServiceProvider();
         break;
        }
        case CryptogramFormat.Rijndael:
        {
         mCSP = new RijndaelManaged();
         break;
        }
        default:
         mCSP = null;
         break;
       }

       mCSP.GenerateKey();
       mCSP.GenerateIV();
       key = Convert.ToBase64String(mCSP.Key);
       iv = Convert.ToBase64String(mCSP.IV);
      }

      #endregion

      //公共加密解密方法

       #region 公共加密解密方法

       /**//// <summary>
       /// 加密方法
       /// </summary>
       /// <param name="encryptionFormat">加密格式</param>
       /// <param name="srcString">欲加密字符串</param>
       /// <returns>返回加密后的字符串;若返回null,表示失败</returns>
       public static string Encrypt(CryptogramFormat encryptionFormat, string srcString)
       {
        try
        {
         switch (encryptionFormat)
         {
          case CryptogramFormat.MD5:
           return FormsAuthentication.HashPasswordForStoringInConfigFile(srcString, "MD5");

          case CryptogramFormat.SHA1:
           return FormsAuthentication.HashPasswordForStoringInConfigFile(srcString, "SHA1");

          case CryptogramFormat.Des:
          case CryptogramFormat.Rc2:
          case CryptogramFormat.Rijndael:
          case CryptogramFormat.TripleDes:
          case CryptogramFormat.RSA:
           return "缺少参数";
          default:
          {
           return "不支持该格式的加密";
          }
         }
        }
        catch (Exception e)
        {
         return "加密异常:" + e.Message;
        }
       }

      /**//// <summary>
      /// 加密方法
      /// </summary>
      /// <param name="encryptionFormat">加密格式</param>
      /// <param name="srcString">欲加密字符串</param>
      /// <param name="key">指定加密的Key</param>
      /// <param name="iv">指定加密的IV</param>
      /// <returns>返回加密后的字符串;若返回null,表示失败</returns>
      public static string Encrypt(CryptogramFormat encryptionFormat, string srcString,string key,string iv)
      {
       try
       {
        switch (encryptionFormat)
        {
         case CryptogramFormat.MD5:
          return FormsAuthentication.HashPasswordForStoringInConfigFile(srcString, "MD5");

         case CryptogramFormat.SHA1:
          return FormsAuthentication.HashPasswordForStoringInConfigFile(srcString, "SHA1");

         case CryptogramFormat.Des:
         case CryptogramFormat.Rc2:
         case CryptogramFormat.Rijndael:
         case CryptogramFormat.TripleDes:
          return CSPEncode(encryptionFormat, srcString, key, iv);

          //case CryptogramFormat.DSA:
          //    return DSAEncode(encryptionFormat, srcString, key, iv);

         case CryptogramFormat.RSA:
          return RSAEncode(encryptionFormat, srcString, key, iv);
         default:
         {
          return null;
         }
        }
       }
       catch (Exception e)
       {
        return "加密异常:" + e.Message;
       }
      }

      /**//// <summary>
      /// 解密方法
      /// </summary>
      /// <param name="encryptionFormat">加密格式</param>
      /// <param name="srcString">欲解密字符串</param>
      /// <param name="key">指定解密的Key</param>
      /// <param name="iv">指定解密的IV</param>
      /// <returns>返回解密后的字符串;若返回null,表示失败</returns>
      public static string Decrypt(CryptogramFormat encryptionFormat, string srcString, string key, string iv)
      {
       try
       {
        switch (encryptionFormat)
        {
         case CryptogramFormat.Des:
         case CryptogramFormat.Rc2:
         case CryptogramFormat.Rijndael:
         case CryptogramFormat.TripleDes:
          return CSPDecode(encryptionFormat, srcString, key, iv);
         case CryptogramFormat.RSA:
          return RSADecode(encryptionFormat, srcString, key, iv);
         default:
         {
          return "不支持该种解密";
         }
        }
       }
       catch(Exception e)
       {
        return "解密异常:"+e.Message;
       }
      }

      /**//// <summary>
      /// 生成Key和IV
      /// </summary>
      /// <param name="encryptionFormat">加密格式</param>
      /// <param name="key">Key</param>
      /// <param name="iv">Iv</param>
      /// <returns>返回是否成功生成Key和IV</returns>
      public static bool GenerateKeyAndIV(CryptogramFormat encryptionFormat, ref string key, ref string iv)
      {
       try
       {
        switch (encryptionFormat)
        {
         case CryptogramFormat.MD5:
         case CryptogramFormat.SHA1:
          key = "不支持";
          iv = "不支持";
          break;
         case CryptogramFormat.Des:
         case CryptogramFormat.Rc2:
         case CryptogramFormat.Rijndael:
         case CryptogramFormat.TripleDes:
          KeyAndIV(encryptionFormat,ref key,ref iv);
          break;
         case CryptogramFormat.RSA:
          RSACryptoServiceProvider rsaD = new RSACryptoServiceProvider();
          key = rsaD.ToXmlString(false);
          iv = rsaD.ToXmlString(true);
          break;
         default:
         {
          return false;
         }
        }
       }
       catch
       {
        return false;
       }
       return true;
      }
           
      #endregion

      //生成随机密码
       #region 生成随机密码
       /**//// <summary>
       /// 生成随机密码
       /// </summary>
       /// <returns></returns>
       public static string GenerateString()
       {
        return GenerateString(8);
       }

      /**//// <summary>
      /// 生成随机密码
      /// </summary>
      /// <param name="keylength"></param>
      /// <returns></returns>
      public static string GenerateString(int keylength)
      {
       try
       {
        if (keylength <= 1)
         return "SmartJavaer";

        byte[] buff = new Byte[keylength/2];
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
        rng.GetBytes(buff);
        //return Convert.ToBase64String(buff);
        StringBuilder sb = new StringBuilder(keylength);
        int i;
        for (i = 0; i < buff.Length; i++)
        {
         sb.Append(String.Format("{0:X2}", buff[i]));
        }
        return sb.ToString();
       }
       catch
       {
        return "SmartJavaer";
       }
      }
      #endregion

     }
      
     #endregion

    }
     

  • 相关阅读:
    [Objective-C语言教程]决策结构(10)
    [Objective-C语言教程]循环语句(9)
    [Objective-C语言教程]关系运算符(8)
    [Objective-C语言教程]常量(7)
    [Objective-C语言教程]变量(6)
    [Objective-C语言教程]数据类型(5)
    转 Apache Ant 实现自动化部署
    转 智能化运维最佳实践-自动化
    ANT 操控 ORACLE数据库实践
    转: Ant 脚本的结构化设计
  • 原文地址:https://www.cnblogs.com/xqf222/p/3306754.html
Copyright © 2020-2023  润新知