首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 標準加密演算法實作範例 (一) - DES 對稱加密/解密

     編輯:關於C語言

.NET 內建完整加密 API (`System.Security.Cryptography`),無需手寫演算法。本文提供 DES 對稱加密/解密的標準實作範本 (教學用,**現代請用 AES**)。

DES 加密實作


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 bytesCBC 模式必須;每次加密應隨機產生並隨密文傳輸 (範例為簡化固定)
ModeCBC (預設)ECB 不安全,勿使用
PaddingPKCS7 (預設)自動填充至區塊倍數
輸出格式Base64 字串安全傳輸於文字協定 (JSON/XML/URL)

⚠️ 現代安全性警示

  • DES 已被淘汰:56-bit 有效金鑰長度可在數小時內被暴力破解 (1997 年即有專用機器破解)。
  • 3DES (TripleDES) 亦不建議新系統使用:雖有效 112/168-bit,但區塊大小 64-bit 遭遇 Sweet32 攻擊,NIST 規定 2023 年後禁用。
  • 請直接使用 AES:`Aes.Create()` → 128/192/256-bit 金鑰、128-bit 區塊、硬體加速 (AES-NI)、無已知實用攻擊。

AES 現代替代範本


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 非對稱加密標準實作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved