注:分塊大小最大理論值是128位。但是考慮 到實際使用中可能會有位溢出的情況,所以此處使用120
將biginteger對 象轉為byte數組時,原本采用的是BigIneger類提供的GetBytes()方法,但是 實際使用中發現,此方法取得的byte數組有一定的幾率會出現偏差。所以改成使 用ToHexString()方法取得16進制字符串再轉成byte數組。
為了解密時 byte數組塊長度固定,補位操作必須執行。
解密
/// <summary>
/// 解密字符數組
/// </summary>
/// <param name="dataBytes">待解密字符 數組</param>
/// <param name="KeyNum">密鑰大素數 </param>
/// <param name="nNum">大整數 N</param>
/// <returns>解密結果</returns>
private string DecryptBytes(byte[] dataBytes, BigInteger KeyNum, BigInteger nNum)
{
int len = dataBytes.Length;
int len1 = 0;
int blockLen = 0;
if (len % 128 == 0)
{
len1 = len / 128;
}
else
{
len1 = len / 128 + 1;
}
List<byte> tempbytes = new List<byte>();
for (int i = 0; i < len1; i++)
{
if (len >= 128)
{
blockLen = 128;
}
else
{
blockLen = 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);
byte[] testbyte= bIEnText.getBytes ();
string str = Encoding.UTF8.GetString (testbyte);
tempbytes.AddRange(testbyte);
len -= blockLen;
}
return System.Text.Encoding.UTF8.GetString (tempbytes.ToArray());
}
基本算法就是這樣,經過10000次測試,沒有 誤差出現。下面是算法實現的類和在網上找到的大整數類。