zoukankan      html  css  js  c++  java
  • 基于.NET的加密/解密算法

    提供一个基于.NET SymmetricAlgorithm 类的、带私钥的加密/解密算法的包装类。使用方法:
    SymmCrypto de = new SymmCrypto(SymmCrypto.SymmProvEnum.DES);
    Response.Write(x.Decrypting(de.Encrypting("ok","yyy"),"yyy"));

    类的实现C#编码

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

    namespace eMeng
    {
      /// <summary>
      /// SymmCrypto 的摘要说明。
      /// SymmCrypto类实现.NET框架下的加密和解密服务。
      /// 原作者: Frank Fang : fangfrank@hotmail.com
      /// </summary>
      public class SymmCrypto
      {
          public enum SymmProvEnum : int
          {
            DES, RC2, Rijndael
          }

        private SymmetricAlgorithm mobjCryptoService;

        /// <remarks>
        /// 使用.Net SymmetricAlgorithm 类的构造器.
        /// </remarks>
        public SymmCrypto(SymmProvEnum NetSelected)
        {
          switch (NetSelected)
          {
            case SymmProvEnum.DES:
              mobjCryptoService = new DESCryptoServiceProvider();
              break;
            case SymmProvEnum.RC2:
              mobjCryptoService = new RC2CryptoServiceProvider();
              break;
            case SymmProvEnum.Rijndael:
              mobjCryptoService = new RijndaelManaged();
              break;
          }
        }

        /// <remarks>
        /// 使用自定义SymmetricAlgorithm类的构造器.
        /// </remarks>
        public SymmCrypto(SymmetricAlgorithm ServiceProvider)
        {
          mobjCryptoService = ServiceProvider;
        }

        /// <remarks>
        /// Depending on the legal key size limitations of 
        /// a specific CryptoService provider and length of 
        /// the private key provided, padding the secret key 
        /// with space character to meet the legal size of the algorithm.
        /// </remarks>
        private byte[] GetLegalKey(string Key)
        {
          string sTemp;
          if (mobjCryptoService.LegalKeySizes.Length > 0)
          {
            int lessSize = 0, moreSize = mobjCryptoService.LegalKeySizes[0].MinSize;
            // key sizes are in bits
            while (Key.Length * 8 > moreSize)
            {
              lessSize = moreSize;
              moreSize += mobjCryptoService.LegalKeySizes[0].SkipSize;
            }
            sTemp = Key.PadRight(moreSize / 8, ' ');
          }
          else
            sTemp = Key;

          // convert the secret key to byte array
          return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }

        public string Encrypting(string Source, string Key)
        {
          byte[] bytIn = System.Text.ASCIIEncoding.ASCII.GetBytes(Source);
          // create a MemoryStream so that the process can be done without I/O files
          System.IO.MemoryStream ms = new System.IO.MemoryStream();

          byte[] bytKey = GetLegalKey(Key);

          // set the private key
          mobjCryptoService.Key = bytKey;
          mobjCryptoService.IV = bytKey;

          // create an Encryptor from the Provider Service instance
          ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();

          // create Crypto Stream that transforms a stream using the encryption
          CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);

          // write out encrypted content into MemoryStream
          cs.Write(bytIn, 0, bytIn.Length);
          cs.FlushFinalBlock();
                
          // get the output and trim the '\0' bytes
          byte[] bytOut = ms.GetBuffer();
          int i = 0;
          for (i = 0; i < bytOut.Length; i++)
            if (bytOut[i] == 0)
              break;
                        
          // convert into Base64 so that the result can be used in xml
          return System.Convert.ToBase64String(bytOut, 0, i);
        }

        public string Decrypting(string Source, string Key)
        {
          // convert from Base64 to binary
          byte[] bytIn = System.Convert.FromBase64String(Source);
          // create a MemoryStream with the input
          System.IO.MemoryStream ms = new System.IO.MemoryStream(bytIn, 0, bytIn.Length);

          byte[] bytKey = GetLegalKey(Key);

          // set the private key
          mobjCryptoService.Key = bytKey;
          mobjCryptoService.IV = bytKey;

          // create a Decryptor from the Provider Service instance
          ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
     
          // create Crypto Stream that transforms a stream using the decryption
          CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);

          // read out the result from the Crypto Stream
          System.IO.StreamReader sr = new System.IO.StreamReader( cs );
          return sr.ReadToEnd();
        }
      }
    }
  • 相关阅读:
    led呼吸灯
    定时器中断
    npgsql
    中断
    PAT (Advanced Level) 1128~1131:1128N皇后 1129 模拟推荐系统(set<Node>优化) 1130 中缀表达式
    PAT (Advanced Level) 1132~1135:1132 模拟 1133模拟(易超时!) 1134图 1135红黑树
    PAT (Advanced Level) 1136~1139:1136模拟 1137模拟 1138 前序中序求后序 1139模拟
    PAT (Advanced Level) 1140~1143:1140模拟 1141模拟 1142暴力 1143 BST+LCA
    PAT (Advanced Level) 1144~1147:1145Hash二次探查 1146拓扑排序 1147堆
    python实现http接口测试
  • 原文地址:https://www.cnblogs.com/wangergo/p/256255.html
Copyright © 2011-2022 走看看