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

C# 標準加密演算法實作範例 (二) - SHA1 雜湊與 RSA 非對稱加密

     編輯:關於C語言

承上篇 DES 對稱加密,本文介紹 SHA1 雜湊 (單向) 與 RSA 非對稱加密的標準實作。

SHA1 雜湊演算法

  • 用途:資料完整性驗證、數位簽名基礎、密碼雜湊 (現建議改用 SHA256/BCrypt/Argon2)。
  • 特性:輸入任意長度 → 固定 160-bit (20 bytes) 輸出;不可逆;極難找到碰撞 (雖已理論破解,實務仍廣泛用於非安全關鍵場景)。

標準實作


public static string Sha1Hash(string input)
{
    using (var sha1 = SHA1.Create()) // 或 new SHA1CryptoServiceProvider()
    {
        byte[] data = Encoding.UTF8.GetBytes(input);
        byte[] hash = sha1.ComputeHash(data);
        return BitConverter.ToString(hash).Replace("-", "").ToLower(); // 40 字元十六進位
    }
}

RSA 非對稱加密

  • 原理:公開鑰加密、私鑰解密 (或私鑰簽名、公開鑰驗證)。安全性建立在大整數分解困難度上。
  • 金鑰長度:現代建議 ≥ 2048-bit (3072/4096 更佳)。1024-bit 已不安全。
  • 適用場景:金鑰交換、數位簽名、小資料加密 (如 AES 金鑰加密)。**不適用於大量資料加密** (效能差、長度限制)。

標準實作 (MSDN 範例精簡版)


public class RsaCrypto
{
    private readonly RSA _rsa;

    public RsaCrypto(int keySize = 2048)
    {
        _rsa = RSA.Create(keySize);
    }

    // 匯出公開鑰 (供他方加密)
    public RSAParameters ExportPublicKey() => _rsa.ExportParameters(false);

    // 匯入公開鑰 (加密用)
    public void ImportPublicKey(RSAParameters pubKey) => _rsa.ImportParameters(pubKey);

    // 加密 (公開鑰)
    public byte[] Encrypt(byte[] data, RSAEncryptionPadding padding = RSAEncryptionPadding.OaepSHA256)
        => _rsa.Encrypt(data, padding);

    // 解密 (私鑰)
    public byte[] Decrypt(byte[] cipher, RSAEncryptionPadding padding = RSAEncryptionPadding.OaepSHA256)
        => _rsa.Decrypt(cipher, padding);

    // 簽名 (私鑰)
    public byte[] Sign(byte[] data, HashAlgorithmName hash = HashAlgorithmName.SHA256, RSASignaturePadding padding = RSASignaturePadding.Pkcs1)
        => _rsa.SignData(data, hash, padding);

    // 驗證 (公開鑰)
    public bool Verify(byte[] data, byte[] signature, HashAlgorithmName hash = HashAlgorithmName.SHA256, RSASignaturePadding padding = RSASignaturePadding.Pkcs1)
        => _rsa.VerifyData(data, signature, hash, padding);
}

混合加密實戰模式 (Hybrid Encryption)

實務中 **RSA 僅加密對稱金鑰**,大量資料用 AES:

  1. 產生隨機 AES-256 金鑰 + IV。
  2. 用 AES 加密資料 (高效、無長度限制)。
  3. 用對方 RSA 公開鑰加密 AES 金鑰。
  4. 傳輸:`RSA_Encrypted_AES_Key` + `IV` + `AES_Encrypted_Data`。
  5. 接收方用 RSA 私鑰解出 AES 金鑰,再解密資料。

這正是 TLS/HTTPS、PGP、S/MIME、Signal 等協定的核心模式。

安全性提醒

  • **SHA1 已淘汰** 用於數位簽名/憑證,請改用 SHA256/SHA384/SHA512。
  • **RSA Padding 必須用 OAEP** (加密) / PSS (簽名),PKCS#1 v1.5 存在攻擊面。
  • **金鑰管理** 是加密系統成敗關鍵:輪換、儲存 (HSM/Key Vault)、撤銷、審計。
  • **不要自行實作加密演算法**,永遠使用經審計的標準庫 (`System.Security.Cryptography`、BouncyCastle、libsodium)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved