p, q,n = p*qe 與 φ(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 類(下載地址),配合 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)));
}
(d, n),對註冊信息(機器碼+到期時間)簽名(e, n),驗證簽名合法性通過 BigInteger 繞過 .NET 內置限制,實現 RSA 私鑰加密/公鑰解密,滿足軟件授權、數字簽名等實際需求。核心在於理解 RSA 數學對稱性,並正確處理編碼、分塊、大數運算細節。