程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#基於大整數類的RSA算法實現(公鑰加密解密,私鑰加密解密)(5)

C#基於大整數類的RSA算法實現(公鑰加密解密,私鑰加密解密)(5)

編輯:關於C語言

注:分塊大小最大理論值是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次測試,沒有 誤差出現。下面是算法實現的類和在網上找到的大整數類。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved