zoukankan      html  css  js  c++  java
  • 對稱加解密[收]

    C#
    -----------------------------------------------
    //名称空间  
    using  System;  
    using  System.Security.Cryptography;  
    using  System.IO;  
    using  System.Text;  

    //方法  
    //加密方法  
    public    string  Encrypt(string  pToEncrypt,  string  sKey)  
    {  
               DESCryptoServiceProvider  des  =  new  DESCryptoServiceProvider();  
               //把字符串放到byte数组中  
                     //原来使用的UTF8编码,我改成Unicode编码了,不行  
               byte[]  inputByteArray  =  Encoding.Default.GetBytes(pToEncrypt);  
               //byte[]  inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt);  

               //建立加密对象的密钥和偏移量  
               //原文使用ASCIIEncoding.ASCII方法的GetBytes方法  
               //使得输入密码必须输入英文文本  
               des.Key  =  ASCIIEncoding.ASCII.GetBytes(sKey);  
               des.IV  =  ASCIIEncoding.ASCII.GetBytes(sKey);  
               MemoryStream  ms  =  new  MemoryStream();  
               CryptoStream  cs  =  new  CryptoStream(ms,  des.CreateEncryptor(),CryptoStreamMode.Write);  
               //Write  the  byte  array  into  the  crypto  stream  
               //(It  will  end  up  in  the  memory  stream)  
               cs.Write(inputByteArray,  0,  inputByteArray.Length);  
               cs.FlushFinalBlock();  
               //Get  the  data  back  from  the  memory  stream,  and  into  a  string  
               StringBuilder  ret  =  new  StringBuilder();  
               foreach(byte  b  in  ms.ToArray())  
                           {  
                           //Format  as  hex  
                           ret.AppendFormat("{0:X2}",  b);  
                           }  
               ret.ToString();  
               return  ret.ToString();  
    }  

    //解密方法  
    public    string  Decrypt(string  pToDecrypt,  string  sKey)  
    {  
               DESCryptoServiceProvider  des  =  new  DESCryptoServiceProvider();  

               //Put  the  input  string  into  the  byte  array  
               byte[]  inputByteArray  =  new  byte[pToDecrypt.Length  /  2];  
               for(int  x  =  0;  x  <  pToDecrypt.Length  /  2;  x++)  
               {  
                         int  i  =  (Convert.ToInt32(pToDecrypt.Substring(x  *  2,  2),  16));  
                   inputByteArray[x]  =  (byte)i;  
               }  

               //建立加密对象的密钥和偏移量,此值重要,不能修改  
               des.Key  =  ASCIIEncoding.ASCII.GetBytes(sKey);  
               des.IV  =  ASCIIEncoding.ASCII.GetBytes(sKey);  
               MemoryStream  ms  =  new  MemoryStream();  
               CryptoStream  cs  =  new  CryptoStream(ms,  des.CreateDecryptor(),CryptoStreamMode.Write);  
               //Flush  the  data  through  the  crypto  stream  into  the  memory  stream  
               cs.Write(inputByteArray,  0,  inputByteArray.Length);  
               cs.FlushFinalBlock();  

               //Get  the  decrypted  data  back  from  the  memory  stream  
               //建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象  
               StringBuilder  ret  =  new  StringBuilder();  
                 
               return  System.Text.Encoding.Default.GetString(ms.ToArray());  
    }  
    -------------------------------------------------------
    vb.Net :
    -------------------------------------------------------
    Imports System.Web.Security
    Imports System.Security
    Imports System.Security.Cryptography
    Imports System.Text

    Public Shared Function Encrypt(ByVal pToEncrypt As String, ByVal sKey As String) As String
         Dim des As New DESCryptoServiceProvider()
         Dim inputByteArray() As Byte
         inputByteArray = Encoding.Default.GetBytes(pToEncrypt)
         '建立加密对象的密钥和偏移量
         '原文使用ASCIIEncoding.ASCII方法的GetBytes方法
         '使得输入密码必须输入英文文本
         des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
         des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
         '写二进制数组到加密流
         '(把内存流中的内容全部写入)
         Dim ms As New System.IO.MemoryStream()
         Dim cs As New CryptoStream(ms, des.CreateEncryptor, CryptoStreamMode.Write)
         '写二进制数组到加密流
         '(把内存流中的内容全部写入)
         cs.Write(inputByteArray, 0, inputByteArray.Length)
         cs.FlushFinalBlock()

         '建立输出字符串     
         Dim ret As New StringBuilder()
         Dim b As Byte
         For Each b In ms.ToArray()
             ret.AppendFormat("{0:X2}", b)
         Next

         Return ret.ToString()
    End Function

            '解密方法
    Public Shared Function Decrypt(ByVal pToDecrypt As String, ByVal sKey As String) As String
         Dim des As New DESCryptoServiceProvider()
         '把字符串放入byte数组
         Dim len As Integer
         len = pToDecrypt.Length / 2 - 1
         Dim inputByteArray(len) As Byte
         Dim x, i As Integer
         For x = 0 To len
             i = Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16)
             inputByteArray(x) = CType(i, Byte)
         Next
         '建立加密对象的密钥和偏移量,此值重要,不能修改
         des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)
         des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)
         Dim ms As New System.IO.MemoryStream()
         Dim cs As New CryptoStream(ms, des.CreateDecryptor, CryptoStreamMode.Write)
         cs.Write(inputByteArray, 0, inputByteArray.Length)
         cs.FlushFinalBlock()
         Return Encoding.Default.GetString(ms.ToArray)

    End Function
    ------------------------------------------------
    备注:
    1. sKey输入密码的时候,必须使用英文字符,区分大小写,且字符数量是8个,不能多也不能少,否则出错。
    2. 本人asp.net1.1,vs.net2003,windows2003 server环境下C#和vb.net分别调试成功!

    第二種:
    using System;
    using System.IO;
    using System.Security.Cryptography;
    using System.Text;
    namespace webrptdata
    {
     /// <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();
      }
     }
    }
  • 相关阅读:
    【typecho】解决使用分隔符 <!--more-->标签后首页文字下面出现一段空白
    真没想到,疫情让我实现了远程办公的夙愿
    程序员周末应该干的8件事
    在Delphi中如何控制其它应用程序窗口
    Delphi 如何操作外部程序的控件(如按钮,文本框,单选按钮等)
    delphi 向其他程序发送模拟按键
    Delphi中如何控制其他程序窗体上的窗口控件
    用Delphi“遥控”按钮
    双系统启动菜单的修改方法
    PureBasic 读取文件中一行的两个数据例子
  • 原文地址:https://www.cnblogs.com/wangxiaohuo/p/566044.html
Copyright © 2011-2022 走看看