常見對稱加密算法及優缺點
1. DES(Data Encryption Standard)
- 優點:是最早被廣泛應用的加密算法,算法公開,實現簡單,效率較高。
- 缺點:密鑰長度較短(56 位),在現代計算能力下,安全性較低,容易被暴力破解。
2. 3DES(Triple DES)
- 優點:在 DES 的基礎上進行了改進,通過多次使用 DES 算法,增加了密鑰長度,提高了安全性。
- 缺點:由于多次使用 DES 算法,加密和解密速度相對較慢。
3. AES(Advanced Encryption Standard)
- 優點:是目前應用最廣泛的對稱加密算法,密鑰長度可選(128 位、192 位、256 位),安全性高,加密和解密速度快。
- 缺點:相對來說,算法復雜度較高,實現難度較大。
示例代碼
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;class SymmetricEncryption
{// DES 加密public static string DESEncrypt(string plainText, string key){using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()){byte[] inputBytes = Encoding.UTF8.GetBytes(plainText);byte[] keyBytes = Encoding.UTF8.GetBytes(key);byte[] encryptedBytes;using (MemoryStream ms = new MemoryStream()){using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(keyBytes, keyBytes), CryptoStreamMode.Write)){cs.Write(inputBytes, 0, inputBytes.Length);cs.FlushFinalBlock();encryptedBytes = ms.ToArray();}}return Convert.ToBase64String(encryptedBytes);}}// DES 解密public static string DESDecrypt(string cipherText, string key){using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()){byte[] inputBytes = Convert.FromBase64String(cipherText);byte[] keyBytes = Encoding.UTF8.GetBytes(key);byte[] decryptedBytes;using (MemoryStream ms = new MemoryStream()){using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(keyBytes, keyBytes), CryptoStreamMode.Write)){cs.Write(inputBytes, 0, inputBytes.Length);cs.FlushFinalBlock();decryptedBytes = ms.ToArray();}}return Encoding.UTF8.GetString(decryptedBytes);}}// 3DES 加密public static string TripleDESEncrypt(string plainText, string key){using (TripleDESCryptoServiceProvider tripleDes = new TripleDESCryptoServiceProvider()){byte[] inputBytes = Encoding.UTF8.GetBytes(plainText);byte[] keyBytes = Encoding.UTF8.GetBytes(key);byte[] encryptedBytes;using (MemoryStream ms = new MemoryStream()){using (CryptoStream cs = new CryptoStream(ms, tripleDes.CreateEncryptor(keyBytes, keyBytes), CryptoStreamMode.Write)){cs.Write(inputBytes, 0, inputBytes.Length);cs.FlushFinalBlock();encryptedBytes = ms.ToArray();}}return Convert.ToBase64String(encryptedBytes);}}// 3DES 解密public static string TripleDESDecrypt(string cipherText, string key){using (TripleDESCryptoServiceProvider tripleDes = new TripleDESCryptoServiceProvider()){byte[] inputBytes = Convert.FromBase64String(cipherText);byte[] keyBytes = Encoding.UTF8.GetBytes(key);byte[] decryptedBytes;using (MemoryStream ms = new MemoryStream()){using (CryptoStream cs = new CryptoStream(ms, tripleDes.CreateDecryptor(keyBytes, keyBytes), CryptoStreamMode.Write)){cs.Write(inputBytes, 0, inputBytes.Length);cs.FlushFinalBlock();decryptedBytes = ms.ToArray();}}return Encoding.UTF8.GetString(decryptedBytes);}}// AES 加密public static string AESEncrypt(string plainText, string key){using (Aes aesAlg = Aes.Create()){byte[] inputBytes = Encoding.UTF8.GetBytes(plainText);byte[] keyBytes = Encoding.UTF8.GetBytes(key);aesAlg.Key = keyBytes;aesAlg.GenerateIV();byte[] encryptedBytes;using (MemoryStream ms = new MemoryStream()){using (CryptoStream cs = new CryptoStream(ms, aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV), CryptoStreamMode.Write)){cs.Write(inputBytes, 0, inputBytes.Length);cs.FlushFinalBlock();encryptedBytes = ms.ToArray();}byte[] combinedBytes = new byte[aesAlg.IV.Length + encryptedBytes.Length];Array.Copy(aesAlg.IV, 0, combinedBytes, 0, aesAlg.IV.Length);Array.Copy(encryptedBytes, 0, combinedBytes, aesAlg.IV.Length, encryptedBytes.Length);return Convert.ToBase64String(combinedBytes);}}}// AES 解密public static string AESDecrypt(string cipherText, string key){byte[] combinedBytes = Convert.FromBase64String(cipherText);byte[] iv = new byte[16];byte[] encryptedBytes = new byte[combinedBytes.Length - iv.Length];Array.Copy(combinedBytes, 0, iv, 0, iv.Length);Array.Copy(combinedBytes, iv.Length, encryptedBytes, 0, encryptedBytes.Length);using (Aes aesAlg = Aes.Create()){byte[] keyBytes = Encoding.UTF8.GetBytes(key);aesAlg.Key = keyBytes;aesAlg.IV = iv;byte[] decryptedBytes;using (MemoryStream ms = new MemoryStream()){using (CryptoStream cs = new CryptoStream(ms, aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV), CryptoStreamMode.Write)){cs.Write(encryptedBytes, 0, encryptedBytes.Length);cs.FlushFinalBlock();decryptedBytes = ms.ToArray();}}return Encoding.UTF8.GetString(decryptedBytes);}}static void Main(){string plainText = "Hello, World!";string desKey = "abcdefgh"; // DES 密鑰長度必須為 8 字節string tripleDesKey = "abcdefghijklmnopqrstuvwx"; // 3DES 密鑰長度必須為 24 字節string aesKey = "abcdefghijklmnop"; // AES 密鑰長度可以為 16、24 或 32 字節// DES 加密和解密string desCipherText = DESEncrypt(plainText, desKey);string desDecryptedText = DESDecrypt(desCipherText, desKey);Console.WriteLine($"DES 加密結果: {desCipherText}");Console.WriteLine($"DES 解密結果: {desDecryptedText}");// 3DES 加密和解密string tripleDesCipherText = TripleDESEncrypt(plainText, tripleDesKey);string tripleDesDecryptedText = TripleDESDecrypt(tripleDesCipherText, tripleDesKey);Console.WriteLine($"3DES 加密結果: {tripleDesCipherText}");Console.WriteLine($"3DES 解密結果: {tripleDesDecryptedText}");// AES 加密和解密string aesCipherText = AESEncrypt(plainText, aesKey);string aesDecryptedText = AESDecrypt(aesCipherText, aesKey);Console.WriteLine($"AES 加密結果: {aesCipherText}");Console.WriteLine($"AES 解密結果: {aesDecryptedText}");}
}