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

C# RSA 私鑰加密公鑰解密實作:BigInteger 大整數運算

     編輯:關於C語言

前言

標準 RSA 為公鑰加密、私鑰解密。特定場景(如授權碼生成、數位簽章驗證)需**私鑰加密、公鑰解密**。本文展示基於 BigInteger 的完整實作,含字串分塊、Base64 編碼/解碼、模冪運算。

核心加密/解密方法


// 私鑰加密:使用 d, n
private string EncryptString(string source, BigInteger d, BigInteger n)
{
    int len = source.Length;
    int blocks = (len + 255) / 256; // 每塊 256 字元 (可調整)
    string result = "";

    for (int i = 0; i < blocks; i++)
    {
        int blockLen = Math.Min(256, len);
        string block = source.Substring(i * 256, blockLen);
        var biText = new BigInteger(block, 16); // 假設來源為十六進位字串
        var biEnc = biText.modPow(d, n);        // c = m^d mod n
        result += Encoding.Default.GetString(biEnc.getBytes());
        len -= blockLen;
    }
    return result;
}

// 公鑰解密:使用 e, n
private string DecryptString(string source, BigInteger e, BigInteger n)
{
    int len = source.Length;
    int blocks = (len + 255) / 256;
    string result = "";

    for (int i = 0; i < blocks; i++)
    {
        int blockLen = Math.Min(256, len);
        string block = source.Substring(i * 256, blockLen);
        var biText = new BigInteger(block, 16);
        var biDec = biText.modPow(e, n);        // m = c^e mod n
        result += Encoding.Default.GetString(biDec.getBytes());
        len -= blockLen;
    }
    return result;
}

與 RSACryptoServiceProvider 整合


// 加密流程:取得私鑰 D、Modulus
private string EncryptProcess(string source, string dBase64, string nBase64)
{
    var biD = new BigInteger(Convert.FromBase64String(dBase64));
    var biN = new BigInteger(Convert.FromBase64String(nBase64));
    return EncryptString(source, biD, biN);
}

// 解密流程:取得公鑰 Exponent、Modulus
private string DecryptProcess(string source, string eBase64, string nBase64)
{
    var biE = new BigInteger(Convert.FromBase64String(eBase64));
    var biN = new BigInteger(Convert.FromBase64String(nBase64));
    return DecryptString(source, biE, biN);
}

關鍵技術細節

項目說明
BigInteger 來源文中引用 HugeInteger 或 .NET 4.0+ 內建 System.Numerics.BigInteger
分塊大小256 字元 (對應 2048 bits 金鑰),需小於模數 n 的位元組長度
編碼假設原始碼假設輸入為十六進位字串,實務建議統一使用 Base64 或位元組陣列
填充模式**未實作 PKCS#1/OAEP 填充**,僅供教學;生產環境**必須**使用標準填充防止攻擊
效能純 managed 大整數運算較慢,大量資料建議改用對稱加密 (AES) + RSA 加密金鑰

安全性警示

  • 教學用途:此實作**缺乏標準填充**,**不可**用於生產環境敏感資料。
  • 私鑰加密風險:任何人持有公鑰即可解密,僅提供「來源驗證」而非機密性。
  • 推薦做法:使用 RSACryptoServiceProvider 或 RSA (NET Core) 內建 SignData/VerifyData 實現數位簽章。

結語

本文展示 RSA 反向操作的數學原理與 BigInteger 實作細節。理解模冪運算、分塊處理、金鑰編碼轉換,有助於深入掌握非對稱加密核心機制。

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