.NET 內建完整加密 API (`System.Security.Cryptography`),無需手寫演算法。本文提供 DES 對稱加密/解密的標準實作範本 (教學用,**現代請用 AES**)。
private static readonly byte[] DefaultIV = { 0xEF, 0xAB, 0x56, 0x78, 0x90, 0x34, 0xCD, 0x12 };
public static string EncryptDes(string plainText, string key)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(key.Substring(0, 8)); // DES 金鑰固定 8 bytes
byte[] rgbIV = DefaultIV;
byte[] input = Encoding.UTF8.GetBytes(plainText);
using (var des = new DESCryptoServiceProvider())
using (var ms = new MemoryStream())
using (var cs = new CryptoStream(ms, des.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write))
{
cs.Write(input, 0, input.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
}
catch { return plainText; } // 失敗回傳原文 (生產環境請拋出/記錄例外)
}
public static string DecryptDes(string cipherText, string key)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(key.Substring(0, 8));
byte[] rgbIV = DefaultIV;
byte[] input = Convert.FromBase64String(cipherText);
using (var des = new DESCryptoServiceProvider())
using (var ms = new MemoryStream())
using (var cs = new CryptoStream(ms, des.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write))
{
cs.Write(input, 0, input.Length);
cs.FlushFinalBlock();
return Encoding.UTF8.GetString(ms.ToArray());
}
}
catch { return cipherText; }
}
| 參數 | 說明 | 注意事項 |
|---|---|---|
| Key (金鑰) | 8 bytes (64-bit,含 8 位 parity bit,實質 56-bit) | 不足 8 字元取前 8,超過截斷;建議用 PBKDF2 從密碼導出 |
| IV (初始化向量) | 8 bytes | CBC 模式必須;每次加密應隨機產生並隨密文傳輸 (範例為簡化固定) |
| Mode | CBC (預設) | ECB 不安全,勿使用 |
| Padding | PKCS7 (預設) | 自動填充至區塊倍數 |
| 輸出格式 | Base64 字串 | 安全傳輸於文字協定 (JSON/XML/URL) |
public static string EncryptAes(string plain, string password)
{
using (var aes = Aes.Create())
{
aes.KeySize = 256;
aes.GenerateIV();
var key = new Rfc2898DeriveBytes(password, aes.IV, 100000, HashAlgorithmName.SHA256).GetBytes(32);
aes.Key = key;
using (var ms = new MemoryStream())
{
ms.Write(aes.IV, 0, aes.IV.Length); // 將 IV 寫在密文最前
using (var cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
using (var sw = new StreamWriter(cs)) sw.Write(plain);
return Convert.ToBase64String(ms.ToArray());
}
}
}
下一篇將介紹 SHA1 雜湊與 RSA 非對稱加密標準實作。