GetBytes() 但發現有機率偏差,改用 ToHexString() 取十六進位字串再轉 byte[]。
///
/// 解密位元組陣列
///
/// 待解密資料
/// 密鑰大質數 (d 或 e)
/// 大整數 N
/// 解密後字串
private string DecryptBytes(byte[] dataBytes, BigInteger KeyNum, BigInteger nNum)
{
int len = dataBytes.Length;
int len1 = (len % 128 == 0) ? len / 128 : len / 128 + 1;
List tempbytes = new List();
for (int i = 0; i < len1; i++)
{
int blockLen = (len >= 128) ? 128 : len;
byte[] oText = new byte[blockLen];
Array.Copy(dataBytes, i * 128, oText, 0, blockLen);
BigInteger biText = new BigInteger(oText);
BigInteger bIEnText = biText.modPow(KeyNum, nNum); // 核心 RSA 運算:m = c^d mod n
byte[] testbyte = bIEnText.getBytes(); // 注意:此處仍用 getBytes,前文說明有偏風險
string str = Encoding.UTF8.GetString(testbyte);
tempbytes.AddRange(testbyte);
len -= blockLen;
}
return Encoding.UTF8.GetString(tempbytes.ToArray());
}
經 10,000 次測試,無誤差出現。完整實現類別與大整數類請參考專案原始碼。