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

C# 實現 RSA 私鑰加密公鑰解密:基於 BigInteger 的完整方案

     編輯:關於C#

RSA 非對稱加密原理回顧

  • 選兩大素數 p, q,n = p*q
  • 選 e 與 φ(n)=(p-1)(q-1) 互質(常用 65537)
  • 計算 d 使 e*d ≡ 1 (mod φ(n))
  • 公鑰 (e, n),私鑰 (d, n)
  • 加密:c = m^e mod n;解密:m = c^d mod n

數學上公私鑰操作對稱,但 .NET RSACryptoServiceProvider 僅支持公鑰加密/私鑰解密,私鑰導出包含所有參數,無法直接用於私鑰加密場景(如軟件註冊碼簽名)。

解決方案:自定義 BigInteger 實現裸 RSA 運算

利用高性能 BigInteger 類(下載地址),配合 RSACryptoServiceProvider 生成素數對,實現雙向操作。

核心加密解密實現


// 私鑰加密(簽名)
private string EncryptString(string source, BigInteger d, BigInteger n)
{
    int blockSize = 128; // 每塊 128 字節
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < source.Length; i += blockSize)
    {
        int len = Math.Min(blockSize, source.Length - i);
        byte[] block = Encoding.Default.GetBytes(source.Substring(i, len));
        BigInteger bi = new BigInteger(block);
        BigInteger enc = bi.modPow(d, n); // c = m^d mod n
        sb.Append(enc.ToHexString());
    }
    return sb.ToString();
}

// 公鑰解密(驗證)
private string DecryptString(string hexSource, BigInteger e, BigInteger n)
{
    int blockSize = 256; // 十六進制字符長度
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < hexSource.Length; i += blockSize)
    {
        int len = Math.Min(blockSize, hexSource.Length - i);
        BigInteger bi = new BigInteger(hexSource.Substring(i, len), 16);
        BigInteger dec = bi.modPow(e, n); // m = c^e mod n
        sb.Append(Encoding.Default.GetString(dec.getBytes()));
    }
    return sb.ToString();
}

密鑰處理流程


// 使用 RSACryptoServiceProvider 生成密鑰對
var rsa = new RSACryptoServiceProvider();
string modulus = Convert.ToBase64String(rsa.ExportParameters(false).Modulus); // 公鑰 n
string exponent = Convert.ToBase64String(rsa.ExportParameters(false).Exponent); // 公鑰 e
string d = Convert.ToBase64String(rsa.ExportParameters(true).D); // 私鑰 d

// 加密流程
string encrypted = EncryptProcess(plainText, d, modulus);

// 解密流程
string decrypted = DecryptProcess(encrypted, exponent, modulus);

private string EncryptProcess(string src, string d, string n)
{
    return EncryptString(src, new BigInteger(Convert.FromBase64String(d)), new BigInteger(Convert.FromBase64String(n)));
}

private string DecryptProcess(string src, string e, string n)
{
    return DecryptString(src, new BigInteger(Convert.FromBase64String(e)), new BigInteger(Convert.FromBase64String(n)));
}

應用場景:軟件註冊機制

  1. 開發者持有私鑰 (d, n),對註冊信息(機器碼+到期時間)簽名
  2. 用戶端內置公鑰 (e, n),驗證簽名合法性
  3. 簽名不可偽造,無需網絡驗證即可離線授權

注意事項

  • 填充模式:示例為教學用途,生產環境必須使用 OAEP/PKCS#1 v1.5 填充
  • 密鑰長度:建議 2048 位以上
  • 性能:大數模冪運算較慢,不適合大數據加密,僅用於簽名/密鑰交換
  • 安全性:私鑰必須嚴格保護,防止反編譯提取

總結

通過 BigInteger 繞過 .NET 內置限制,實現 RSA 私鑰加密/公鑰解密,滿足軟件授權、數字簽名等實際需求。核心在於理解 RSA 數學對稱性,並正確處理編碼、分塊、大數運算細節。

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