1. 程式人生 > >C#實現AES加解密

C#實現AES加解密

1.關於.NET下的對稱加密演算法。
    .NET Framework類庫提供了對稱加密、雜湊函式、非對稱加密、數字簽名等現有的主流加密演算法。.NET中預設實現了4種對稱加密演算法:DES、TripleDES、RC2、Rijndeal。其中前3種都比較老了哦。而第四種Rijndeal的全稱就是:高階加密標準(Advanced Encryption Standard,AES)也就是我們說的AES,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。 
2.C#實現AES的加解密
    順便提一下,有些人搞不懂為什麼加密後資料會變長,這是因為對稱加密演算法是分組加密,也就是按照預先設定好的塊大小進行加密。加密時,首先將明文進行分塊,對於最後一塊,如果少於塊的大小,是需要進行填充的。因此有不同的填充模式。還有有的時候,解密資料時報錯:資料長度不符合要求時,也多半是由於程式中加密出了錯,因為加密後的密文應該是塊大小的整數倍的。.NET中的密碼演算法可以進行很多配置,還可以進行擴充套件。如採用不同的連結模式,填充模式、塊大小,金鑰長度等。需要詳細瞭解的話可以先看一下對稱加密的基礎知識,再參考下MSDN。下面是用C#實現的AES加解密演算法:AES金鑰預設長度是128位的。程式碼如下:
using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;


namespace GraduationDesign
{    
class AESEncryption 
    {        
        //預設金鑰向量 
        private static byte[] _key1 = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56,  0x78, 0x90, 0xAB, 0xCD, 0xEF }; 


        /// <summary>
        /// AES加密演算法
        /// </summary>
        /// <param name="plainText">明文字串</param>
        /// <param name="strKey">金鑰</param>
        /// <returns>返回加密後的密文位元組陣列</returns>
        public static byte[] AESEncrypt(string plainText , string strKey )
{
//分組加密演算法
SymmetricAlgorithm des = Rijndael .Create () ;
byte[] inputByteArray =Encoding .UTF8  .GetBytes (plainText ) ;//得到需要加密的位元組陣列
                            //設定金鑰及金鑰向量
des.Key =Encoding.UTF8.GetBytes (strKey );
des.IV = _key1 ;
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
byte[] cipherBytes = ms .ToArray () ;//得到加密後的位元組陣列
cs.Close();
ms.Close();
return cipherBytes ;
        }
        
        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="cipherText">密文位元組陣列</param>
        /// <param name="strKey">金鑰</param>
        /// <returns>返回解密後的字串</returns>
        public static byte[] AESDecrypt(byte[] cipherText , string strKey )
        {        
        SymmetricAlgorithm des = Rijndael .Create () ;                      
        des.Key =Encoding.UTF8.GetBytes (strKey );
des.IV = _key1 ;
        byte[] decryptBytes = new byte[cipherText .Length ] ;        
        MemoryStream ms = new MemoryStream(cipherText ) ;
        CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor (), CryptoStreamMode.Read );
        cs.Read (decryptBytes , 0, decryptBytes.Length);        
        cs.Close();
        ms.Close();        
        return decryptBytes ;
   }
}
class Program
    {
        static void Main(string[] args)
        {              
            string text = "AES加密演算法測試資料"; //明文
            string keys="dongbinhuiasxiny";//金鑰,128位            
            byte[] encryptBytes = AESEncryption.AESEncrypt (text, keys ); 
            //將加密後的密文轉換為Base64編碼,以便顯示,可以檢視下結果
            Console.WriteLine ("明文:"+text );
            Console.WriteLine ("密文:"+Convert.ToBase64String (encryptBytes ));
            //解密
            byte[] decryptBytes = AESEncryption.AESDecrypt (encryptBytes, keys);
            //將解密後的結果轉換為字串,也可以將該步驟封裝在解密演算法中
            string result = Encoding.UTF8.GetString(decryptBytes);            
            Console.WriteLine("解密結果:"+result); 
            Console.Read(); 
}
}