對稱性加密算法
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(); } } } } }
DES 與 AES 的用法基本相同,只是密碼與向量的長度不一樣。