StackDoc

StackDoc

當前位置: 主頁 > 編程語言 > .NET >

非對稱加密及數字簽名RSA算法的實現(公鑰加密->私鑰解密、私鑰加密->公鑰解密)

時間:2011-11-15 19:24來源:Internet 作者:Internet 點擊:
RSA算法是第一個既能用於數據加密也能用於數字簽名的算法。它易於理解和操作,也很流行。它的安全性是基於大整數素因子分解的困難性,而大整數因子分解問題是數學上的著名難題,至今沒有有效的方法予以解决,因此

RSA算法是第一個既能用於數據加密也能用於數字簽名的算法。它易於理解和操作,也很流行。它的安全性是基於大整數素因子分解的困難性,而大整數因子分解問題是數學上的著名難題,至今沒有有效的方法予以解决,因此可以確保RSA算法的安全性。


  RSA算法實現主要分为三部分:包括公鑰和私鑰的產生,非對稱加密和解密,數字簽名和驗證,下面將逐個介紹RSA算法的工作原理及我的實現方法。

    1.公鑰和私鑰的產生

    隨意選擇兩個大素數p、q,p不等於q,計算n = p * q。
    隨機選擇一個整數e,滿足e和( p – 1 ) * ( q – 1 )互質。(注:e很容易選擇,如3, 17, 65537等都可以。.NET Framework中e默認選擇的就是65537)
利用Euclid算法計算解密密鑰d,滿足
      e * d ≡ 1 ( mod ( p - 1 ) * ( q - 1 ) )
    其中n和d也要互質。

    其中e和n就是公鑰,d和n就是私鑰。P、q銷毀。

 

    在.NET Framework的RSA算法中,e對應RSAParameters.Exponent;d對應RSAParameters.D;n對應RSAParameters.ModulusExponent。.NET Framework中的RSA算法默認使用1024位長的密鑰。公鑰和私鑰是利用.NET Framework的RSACryptoServiceProvider生成公鑰xml文件和私鑰xml文件來實現的。生成公鑰和私鑰xml文件的程序。



公鑰和私鑰將從生成的公鑰xml文件和私鑰xml文件中導入。



2.非對稱加密和解密
    私鑰加密m(二進制表示)時,首先把m分成長s的數據塊 m1, m2 ... mi,其中 2^s <= n, s 盡可能的大。執行如下計算:
        ci = mi ^ d (mod n)
    公鑰解密c(二進制表示)時,也需要將c分成長s的數據塊c1, c2 ... ci,執行如下計算:
        mi = ci ^ e (mod n)

    在某些情況下,也會使用公鑰加密->私鑰解密。原理和私鑰加密->公鑰解密一样。下面是私鑰計算和公鑰計算的算法。其中利用到了Chew Keong TAN的BigInteger類。.NET Framework 4中提供的BigInteger.ModPow方法好像有問題。


下面是私鑰加密->公鑰解密的實現:


下面是公鑰加密->私鑰解密的實現:


3.數字簽名和驗證
    私鑰簽名數據m時,先對m進行hash計算,得到計算結果h。然後將h使用私鑰加密,得到加密後的密文s即为簽名。
    公鑰驗證簽名s時,先將m進行hash計算,得到計算結果h。然後使用公鑰解密s得到結果h’。如果h==h’即驗證成功,否則驗證失敗。

    在某些情況下,也會使用公鑰簽名->私鑰驗證。原理和私鑰簽名->公鑰驗證一样。

    下面是私鑰簽名->公鑰驗證的實現。


下面是公鑰簽名->私鑰驗證的實現:





From:CSDN
頂一下
(0)
0%
踩一下
(0)
0%
------分隔線----------------------------
發表評論
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
評價:
表情:
驗證碼:點擊我更換圖片
欄目列表
推薦內容