C#实现AES(Rijndael算法)加密解密

AES 


AES 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法

Rijndael(读作rain-dahl)是由美国国家标准与技术协会(NIST)所选的高级加密标准(AES)的候选算法。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。


Rijndael 算法首先是一个密钥分组加密的算法,通过置换(permutations )和替换(substitutions)迭代加密,进过多轮操作形成密文。


AES算是Rijndael算法的一种特殊实现,选的分组为128bit(16字节),密钥可以使用128、192 和 256bit三种,而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。加密过程中使用的密钥是由Rijndael密钥生成方案产生。


AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“状态(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。(Rijndael加密法因支持更大的区块,其矩阵行数可视情况增加)加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:
AddRoundKey — 矩阵中的每一个字节都与该次轮秘钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
SubBytes — 通过非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
ShiftRows — 将矩阵中的每个横列进行循环式移位。
MixColumns — 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每列的四个字节。


RijndaelManager代码实现

using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Security.Cryptography;  
using System.IO;  
  
namespace Csharp  
{  
    class AESHelper  
    {  
        ///   
        /// AES加密  
        ///   
        /// 被加密的明文  
        /// 密钥  
        /// 向量  
        /// 密文  
        public static String AESEncrypt(String Data, String Key, String Vector)  
        {  
            Byte[] plainBytes = Encoding.UTF8.GetBytes(Data);  
  
            Byte[] bKey = new Byte[32];  
            Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);  
            Byte[] bVector = new Byte[16];  
            Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);  
  
            Byte[] Cryptograph = null; // 加密后的密文  
  
            Rijndael Aes = Rijndael.Create();  
            try  
            {  
                // 开辟一块内存流  
                using (MemoryStream Memory = new MemoryStream())  
                {  
                    // 把内存流对象包装成加密流对象  
                    using (CryptoStream Encryptor = new CryptoStream(Memory,  
                     Aes.CreateEncryptor(bKey, bVector),  
                     CryptoStreamMode.Write))  
                    {  
                        // 明文数据写入加密流  
                        Encryptor.Write(plainBytes, 0, plainBytes.Length);  
                        Encryptor.FlushFinalBlock();  
  
                        Cryptograph = Memory.ToArray();  
                    }  
                }  
            }  
            catch  
            {  
                Cryptograph = null;  
            }  
  
            return Convert.ToBase64String(Cryptograph);  
        }  
  
        ///   
        /// AES解密  
        ///   
        /// 被解密的密文  
        /// 密钥  
        /// 向量  
        /// 明文  
        public static String AESDecrypt(String Data, String Key, String Vector)  
        {  
            Byte[] encryptedBytes = Convert.FromBase64String(Data);  
            Byte[] bKey = new Byte[32];  
            Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);  
            Byte[] bVector = new Byte[16];  
            Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);  
  
            Byte[] original = null; // 解密后的明文  
  
            Rijndael Aes = Rijndael.Create();  
            try  
            {  
                // 开辟一块内存流,存储密文  
                using (MemoryStream Memory = new MemoryStream(encryptedBytes))  
                {  
                    // 把内存流对象包装成加密流对象  
                    using (CryptoStream Decryptor = new CryptoStream(Memory,  
                    Aes.CreateDecryptor(bKey, bVector),  
                    CryptoStreamMode.Read))  
                    {  
                        // 明文存储区  
                        using (MemoryStream originalMemory = new MemoryStream())  
                        {  
                            Byte[] Buffer = new Byte[1024];  
                            Int32 readBytes = 0;  
                            while ((readBytes = Decryptor.Read(Buffer, 0, Buffer.Length)) > 0)  
                            {  
                                originalMemory.Write(Buffer, 0, readBytes);  
                            }  
  
                            original = originalMemory.ToArray();  
                        }  
                    }  
                }  
            }  
            catch  
            {  
                original = null;  
            }  
            return Encoding.UTF8.GetString(original);  
        }  
  
  
  
        ///   
        /// AES加密(无向量)  
        ///   
        /// 被加密的明文  
        /// 密钥  
        /// 密文  
        public static string AESEncrypt(String Data, String Key)  
        {  
            MemoryStream mStream = new MemoryStream();  
            RijndaelManaged aes = new RijndaelManaged();  
  
            byte[] plainBytes = Encoding.UTF8.GetBytes(Data);  
            Byte[] bKey = new Byte[32];  
            Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);  
  
            aes.Mode = CipherMode.ECB;  
            aes.Padding = PaddingMode.PKCS7;  
            aes.KeySize = 128;  
            //aes.Key = _key;  
            aes.Key = bKey;  
            //aes.IV = _iV;  
            CryptoStream cryptoStream = new CryptoStream(mStream, aes.CreateEncryptor(), CryptoStreamMode.Write);  
            try  
            {  
                cryptoStream.Write(plainBytes, 0, plainBytes.Length);  
                cryptoStream.FlushFinalBlock();  
                return Convert.ToBase64String(mStream.ToArray());  
            }  
            finally  
            {  
                cryptoStream.Close();  
                mStream.Close();  
                aes.Clear();  
            }  
        }  
  
  
        ///   
        /// AES解密(无向量)  
        ///   
        /// 被加密的明文  
        /// 密钥  
        /// 明文  
        public static string AESDecrypt(String Data, String Key)  
        {  
            Byte[] encryptedBytes = Convert.FromBase64String(Data);  
            Byte[] bKey = new Byte[32];  
            Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);  
              
            MemoryStream mStream = new MemoryStream(encryptedBytes);  
            //mStream.Write( encryptedBytes, 0, encryptedBytes.Length );  
            //mStream.Seek( 0, SeekOrigin.Begin );  
            RijndaelManaged aes = new RijndaelManaged();  
            aes.Mode = CipherMode.ECB;  
            aes.Padding = PaddingMode.PKCS7;  
            aes.KeySize = 128;  
            aes.Key = bKey;  
            //aes.IV = _iV;  
            CryptoStream cryptoStream = new CryptoStream(mStream, aes.CreateDecryptor(), CryptoStreamMode.Read);  
            try  
            {  
                byte[] tmp = new byte[encryptedBytes.Length + 32];  
                int len = cryptoStream.Read(tmp, 0, encryptedBytes.Length + 32);  
                byte[] ret = new byte[len];  
                Array.Copy(tmp, 0, ret, 0, len);  
                return Encoding.UTF8.GetString(ret);  
            }  
            finally  
            {  
                cryptoStream.Close();  
                mStream.Close();  
                aes.Clear();  
            }  
        }  
    }  
}  

AesManager代码实现

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

namespace Aes_Example
{
    class AesExample
    {
        public static void Main()
        {
            try
            {
                string original = "Here is some data to encrypt!";

                // Create a new instance of the AesManaged
                // class.  This generates a new key and initialization 
                // vector (IV).
                using (AesManaged myAes = new AesManaged())
                {
                    // Encrypt the string to an array of bytes.
                    byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV);

                    // Decrypt the bytes to a string.
                    string roundtrip = DecryptStringFromBytes_Aes(encrypted, myAes.Key, myAes.IV);

                    //Display the original data and the decrypted data.
                    Console.WriteLine("Original:   {0}", original);
                    Console.WriteLine("Round Trip: {0}", roundtrip);
                }

            }
            catch (Exception e)
            {
                Console.WriteLine("Error: {0}", e.Message);
            }
        }
        static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");
            byte[] encrypted;
            // Create an AesManaged object
            // with the specified key and IV.
            using (AesManaged aesAlg = new AesManaged())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create a decrytor to perform the stream transform.
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for encryption.
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {

                            //Write all data to the stream.
                            swEncrypt.Write(plainText);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                }
            }


            // Return the encrypted bytes from the memory stream.
            return encrypted;

        }

        static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (cipherText == null || cipherText.Length <= 0)
                throw new ArgumentNullException("cipherText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");

            // Declare the string used to hold
            // the decrypted text.
            string plaintext = null;

            // Create an AesManaged object
            // with the specified key and IV.
            using (AesManaged aesAlg = new AesManaged())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;

                // Create a decrytor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

                // Create the streams used for decryption.
                using (MemoryStream msDecrypt = new MemoryStream(cipherText))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {

                            // Read the decrypted bytes from the decrypting stream
                            // and place them in a string.
                            plaintext = srDecrypt.ReadToEnd();
                        }
                    }
                }

            }

            return plaintext;
        }
    }
}

你可能感兴趣的:(Unity)