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

C# 程式設計總結(八):數位簽名原理與 RSA 實作

     編輯:關於C#

前言

數位簽名結合雜湊演算法與非對稱加密,實現身分驗證、資料完整性、防抵賴等核心安全功能。本文解析其工作流程、主要作用,並提供基於 RSA + SHA1 的 C# 完整實作程式碼。

核心概念與流程

數位簽名:對明文先用雜湊演算法產生摘要,再用私鑰加密摘要得到簽名。驗證時用公鑰解密簽名得摘要,並比對重新計算的摘要。

電子簽名用途示意圖 數位簽名流程圖

詳細步驟(以安全郵件為例)

  1. 發件人生成密鑰對(私鑰、公鑰)。
  2. 撰寫郵件內容。
  3. 用安全摘要演算法(如 SHA1)計算郵件摘要。
  4. 用私鑰加密摘要,產生數位簽名。
  5. 將簽名附於郵件後。
  6. 發送郵件(可選擇是否加密郵件本體)。
  7. 收件人用發件人公鑰解密簽名,得到摘要 A。
  8. 收件人用相同演算法計算收到郵件的摘要 B。
  9. 比對 A 與 B,相同則證明內容未被竄改且確為發件人所簽。
  10. 透過憑證機構(CA)驗證公鑰真實性,防止中間人攻擊。

主要作用

  • 防冒充:私鑰僅簽名者持有,他人無法偽造。
  • 身分鑑別:接收方用發送方公鑰驗證簽名。
  • 防竄改:明文與簽名綁定,任何修改會導致驗證失敗。
  • 防抵賴:簽名不可否認,簽名者必須對內容負責。

應用場景

網路銀行、電子商務、電子政務、網路通訊、數位憑證等。

C# 實作:RSA 數位簽名與驗證

/// <summary> 數位簽名 </summary>
/// <param name="plaintext">原文</param>
/// <param name="privateKey">私鑰 (XML 格式)</param>
/// <returns>Base64 編碼的簽名</returns>
public static string HashAndSignString(string plaintext, string privateKey) {
    UnicodeEncoding ByteConverter = new UnicodeEncoding();
    byte[] dataToEncrypt = ByteConverter.GetBytes(plaintext);
    using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider()) {
        RSAalg.FromXmlString(privateKey);
        // 使用 SHA1 雜湊並簽名
        byte[] encryptedData = RSAalg.SignData(dataToEncrypt, new SHA1CryptoServiceProvider());
        return Convert.ToBase64String(encryptedData);
    }
}

/// <summary> 驗證簽名 </summary>
public static bool VerifySigned(string plaintext, string signedData, string publicKey) {
    using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider()) {
        RSAalg.FromXmlString(publicKey);
        UnicodeEncoding ByteConverter = new UnicodeEncoding();
        byte[] dataToVerify = ByteConverter.GetBytes(plaintext);
        byte[] signedBytes = Convert.FromBase64String(signedData);
        return RSAalg.VerifyData(dataToVerify, new SHA1CryptoServiceProvider(), signedBytes);
    }
}

測試範例

public static void TestSign() {
    string originalData = "文章不錯,這是我的簽名:奧巴馬!";
    Console.WriteLine("原文:{0}", originalData);
    // 假設 Encrypter.CreateRSAKey() 回傳公私鑰對
    var keyPair = Encrypter.CreateRSAKey();
    string privateKey = keyPair.Value;
    string publicKey = keyPair.Key;

    // 簽名
    string signedData = Encrypter.HashAndSignString(originalData, privateKey);
    Console.WriteLine("數位簽名:{0}", signedData);

    // 驗證
    bool verify = Encrypter.VerifySigned(originalData, signedData, publicKey);
    Console.WriteLine("驗證結果:{0}", verify);
}

完整原始碼下載:EncriptSample.zip

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