標準 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;
}
// 加密流程:取得私鑰 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 實作細節。理解模冪運算、分塊處理、金鑰編碼轉換,有助於深入掌握非對稱加密核心機制。