1. 程式人生 > >RSA公鑰祕鑰演算法

RSA公鑰祕鑰演算法

RSA公鑰金鑰演算法總結

RSA演算法既能用於資料加密也能用於數字簽名,它是素數的典型應用。

RSA是什麼?

計算機的加密技術分為對稱加密和非對稱加密兩類。在對稱加密中,資訊的加解密使用同一祕鑰key,其可簡化加解密的過程,較為簡單,但不足之處在於由於加解密使用同一個key,資訊傳送雙方都要接觸這個key,金鑰key更容易洩露。在公開金鑰加密即非對稱加密中,金鑰分為公鑰PK(傳送方通過PK對資料加密,然後傳送給接收方,PK可公開),私鑰SK(SK解密方儲存,接收方通過SK對密文解密,SK不公開)。RSA公鑰密碼體制是最具代表性的非對稱加密方式。

RSA演算法原理

RSA定理:若P和Q是兩個相異質數,另有正整數D和E,其中E的值與
(P-1)(Q-1)的值互質,並使得DE%(P-1)(Q-1)=1,有正整數M,且M<PQ,設:
C=ME

%PQ,B=CD%PQ,則有M=B。

  • 生成公鑰和金鑰
    • 隨意選擇兩個大的素數P和Q,且P不等於Q
    • 令N=PQ
    • 令T=(P-1)(Q-1)
    • 選擇一個整數E,作為一個金鑰,使E與T互質(即E與T的最大公約數為1),且E必須小於T
    • 由公式DE%T=1,計算得到D的值,作為另一金鑰
    • 將(N,E)作為公鑰,(N,D)作為私鑰,當然也可互換。
  • 用公鑰加密資訊
    傳送方收到公鑰(N,E)後,通過公鑰對資料進行加密,操作如下:
    • 明文:M
    • 加密:ME%N=C
    • 密文:C
  • 用私鑰解密資訊
    接收方收到密文C後,通過私鑰(N,D)進行解密,得到明文M,操作如下:
    • 密文:C
    • 解密:CD%N=M
    • 明文:M

RSA演算法模擬

為了計算方便,選取較小素數

  • 生成公鑰和金鑰
    • 取P=11,Q=13
    • 令N=PQ=11*13=143
    • 令T=(P-1)(Q-1)=10*12=120
    • 取E=7
    • 由公式DE%T=1,D*7%120=1得:D=103
    • (143,103)作為公鑰,將(143,7)作為私鑰。
  • 用公鑰加密資訊
    • 明文:取M=2
    • 加密:ME%N=C,2103%143=63
    • 密文:C=63
  • 用私鑰解密資訊
    • 密文:C=63
    • 解密:CD%N=M,637%143=2
    • 明文:M=2

RSA的應用:數字簽名

數字簽名是實現安全的核心技術之一,它的實現基礎就是RSA加密技術,它是RSA的典型應用。
以往的書信或檔案是通過親筆簽名或印章證明其真實性的,但在計算機網路中,要解決報文的驗證問題,就要使用數字簽名,其必須保證以下幾點:

  • 接受者能夠核實傳送者對報文的簽名
  • 傳送者事後不能抵賴對報文的簽名
  • 接受者不能偽造對報文的簽名
    在現有的多種實現數字簽名的方法中,採用公開祕鑰演算法比常規演算法更容易實現。
    採用RSA實現數字簽名的過程:
    傳送者A用其私鑰SKA對報文M進行運算,將結果DSKA(M)傳送給接受者B。
    接受者B用已知的A的公鑰得出EPKA(DSKA(M))=M。
    因為除了A沒人有A的私鑰SKA,所以除了A沒有人能產生密文DSKA(M),這樣,報文M就被簽名了。用私鑰加密的報文發給對方,對方只能用持有的公鑰解密,這樣就實現了核實傳送者對報文的報文的簽名。
    如果傳送者A要抵賴曾經發送過報文M給使用者B,則使用者B可將M和DSKA(M)出示給第三方監管機構,第三方很容易用公鑰PKA去證實A確實傳送報文M給使用者B。反之,若使用者B將M偽造為M,則使用者B就不能在第三方面前出示DSKA(M),這樣就證明了使用者B偽造了對報文M的簽名。由此,可看出,實現數字簽名的同時也實現了對報文來源的鑑別。

RSA演算法的缺點

再強的加密演算法,也有被破解的一天。RSA演算法是被研究得最廣泛的公鑰演算法,從提出到現在經歷了各種攻擊,被普遍認為是目前最優秀的公鑰方案之一。
RSA的缺點主要有兩點:

  • 產生金鑰很麻煩,由於素數產生技術的限制,難以做到一次一密。
  • 分組長度太大,為保證安全性,N至少要600bit二進位制位以上,運算代價高,速度慢。RSA演算法的安全性依賴於大數分解,對於一個大數N,沒有有效的方法能夠將其分解,從而在已知(N,D)的情況下,無法獲得E,同樣在已知(N,E)的情況下無法求得D。目前,SET協議中要求CA採用2048bit二進位制位長的金鑰,其他實體使用1024位元的金鑰。現在小於1024位元的N已被證明是不安全的,因此不應使用小於1024位元的RSA,最好使用2048位的N。