C# 常用加密方法一 AES 與 DES


對稱性加密算法

DES (Data Encryption Standard 數據加密算法) 與 AES (Advanced Encryption Standard 高級加密標准),都是一種對稱加密算法,既加密和解密使用同一個密鑰。

 

塊加密算法

AES 與 DES 同樣都是一種塊加密算法,會把明文按等長的塊然后分別進行加密。不同之處在於DES 的密鑰長度為 56 位加 8 位奇偶校驗位(每組的第8位作為奇偶校驗位),而AES 的密鑰長度為 128,192或256位(在 C# 中為 256 位)。

由於 DES 的密鑰長度過,DES 被認為是不安全的,已被 AES 所取代。

 

塊加密算法模式

在 C# 中,塊加密算法支持 5 種模式,分別為ECB、CBC、CFB、OFB、CTS。其中在CBC、CFB、OFB模式下需要用到加密向量:IV (Initialization Vector),它是為了保證對同一明文加密時不會產生相同的密文。而ECB、CBC模式會將長度不足的源數據填充至密鑰的整數倍,其余三種模式則保持長度不變,這主要是加密時的異或操作導致的。

 

ECB (Electronic Codebook 電碼本)

ECB 相對比較簡單,原理是將數據切割后,對每一塊單獨進行加密,不需要開頭所說的 IV(加密向量)。

這樣做的優點是可以並行處理,速度可以非常快;缺點也很明顯,在源數據跟密鑰不變的情況下,加密后的數據都是一樣的。

未加密時 ECB 加密

 

CBC (Cipher Block Chaining 密碼分組鏈接)

CBC 不同於 ECB 的是,它會將第一塊與 IV 異或之后再進行加密,之后再以前一塊的加密數據作為 IV,再對后一塊進行加密;而解密時可以直接利用前一塊的密文,因此可以並行執行。

CBC 的優點是安全性比較好,不過缺點是加密的速度會比較慢。而且由於加密時的串行性,若之前的源明文發生改變,那往后密文也會全部改變;而解密時,密文的改變只會導致對應塊解密后的明文發生變化,以及下一塊的對應位改變(解密的數據需要與上一塊密文異或)。

將加密數據的某一位改變后的結果:

明文:Some information about aes encryption method.
解密:x?Z????Od??1^? about a*s encryption method.

 

CFB (Cipher Feedback 密碼反饋)

在 CFB 模式中,是對向量進行加密,再與明文進行異或操作,密文再作為向量參與下一個加密。所謂反饋,就是指前一個密文作為下一次加密的輸入,再進行加密。

CFB 在解密時,也是用的加密器,因此解密過程與 CBC 的加密過程是一樣的。

 

OFB (Output Feedback 輸出反饋)

類似於 CFB 模式,先對向量加密,加密結果與明文進行異或,同時作為下一個加密的向量;其解密過程則與加密過程

 

CTR (Counter 整數計數器)

CTR 模式通過加密一個連續的“計數器”來生成密鑰塊,計數器可以用任何方法來生成。由於這種特性,CTR 的加密可以並行執行。

 

C# 代碼:

private void AesTest()
        {
            string key = @"MyAesKeyMyAesKeyMyAesKeyMyAesKey";
            byte[] keyByte = Encoding.ASCII.GetBytes(key);
            byte[] iv = new byte[16];
            byte[] encrypted;
            string message;
            using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
            {
                aes.Mode = CipherMode.CBC;
                aes.Key = keyByte;
                aes.IV = iv;
                ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(original);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                }

                ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
                using (MemoryStream msDecrypt = new MemoryStream(encrypted))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {
                            message = srDecrypt.ReadToEnd();
                        }
                    }
                }
            }
        }
View Code

DES 與 AES 的用法基本相同,只是密碼與向量的長度不一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM