• 用C#实现的对称加密算法


         以下是关于对称加密算法的C#实现代码,大家可以根据需要更改不同的算法,文中以Rijndael算法为例:using System;
    using System.IO;
    using System.Security.Cryptography;

    using System.Text;

    namespace DataCrypto
    {
     /// <summary>
     /// 对称加密算法类
     /// </summary>
     public class SymmetricMethod
     {
      
      private SymmetricAlgorithm mobjCryptoService;
      private string Key;
      /// <summary>
      /// 对称加密类的构造函数
      /// </summary>
      public SymmetricMethod()
      {
       mobjCryptoService = new RijndaelManaged();
       Key = "Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7";
      }
      /// <summary>
      /// 获得密钥
      /// </summary>
      /// <returns>密钥</returns>
      private byte[] GetLegalKey()
      {
       string sTemp = Key;
       mobjCryptoService.GenerateKey();
       byte[] bytTemp = mobjCryptoService.Key;
       int KeyLength = bytTemp.Length;
       if (sTemp.Length > KeyLength)
        sTemp = sTemp.Substring(0, KeyLength);
       else if (sTemp.Length < KeyLength)
        sTemp = sTemp.PadRight(KeyLength, ' ');
       return ASCIIEncoding.ASCII.GetBytes(sTemp);
      }
      /// <summary>
      /// 获得初始向量IV
      /// </summary>
      /// <returns>初试向量IV</returns>
      private byte[] GetLegalIV()
      {
       string sTemp = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk";
       mobjCryptoService.GenerateIV();
       byte[] bytTemp = mobjCryptoService.IV;
       int IVLength = bytTemp.Length;
       if (sTemp.Length > IVLength)
        sTemp = sTemp.Substring(0, IVLength);
       else if (sTemp.Length < IVLength)
        sTemp = sTemp.PadRight(IVLength, ' ');
       return ASCIIEncoding.ASCII.GetBytes(sTemp);
      }
      /// <summary>
      /// 加密方法
      /// </summary>
      /// <param name="Source">待加密的串</param>
      /// <returns>经过加密的串</returns>
      public string Encrypto(string Source)
      {
       byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
       MemoryStream ms = new MemoryStream();
       mobjCryptoService.Key = GetLegalKey();
       mobjCryptoService.IV = GetLegalIV();
       ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
       CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
       cs.Write(bytIn, 0, bytIn.Length);
       cs.FlushFinalBlock();
       ms.Close();
       byte[] bytOut = ms.ToArray();
       return Convert.ToBase64String(bytOut);
      }
      /// <summary>
      /// 解密方法
      /// </summary>
      /// <param name="Source">待解密的串</param>
      /// <returns>经过解密的串</returns>
      public string Decrypto(string Source)
      {
       byte[] bytIn = Convert.FromBase64String(Source);
       MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
       mobjCryptoService.Key = GetLegalKey();
       mobjCryptoService.IV = GetLegalIV();
       ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
       CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
       StreamReader sr = new StreamReader(cs);
       return sr.ReadToEnd();
      }
     }
    }

  • 相关阅读:
    class的大小
    派生表中第一个基类没有虚函数,派生类存在虚函数时的内存布局
    转: inline关键字使用
    三角形面积计算(海伦公式或叉积绝对值的一半)
    单继承时虚函数表解析
    C语言中的atan和atan2
    n皇后问题的递归和迭代版 leetcode N-Queens
    linux网络编程中INADDR_ANY的含义
    数据库有哪些设计技巧
    原来Github上也有这么多的JavaScript学习资源!
  • 原文地址:https://www.cnblogs.com/azhai/p/311120.html
Copyright © 2020-2023  润新知