RSA

同餘:給定一個正整數m,若是兩個整數a和b知足(a-b)可以被m整除,即 (a-b)/m 獲得一個整數,html

    那麼就稱整數a b對模m同餘,記作a ≡ b( mod n )算法

 

RSA算法的參數構成:dom

  1)選擇兩個大素數p、q;函數

  2)計算n,n = pq和n的歐拉定理的值,ψ(n) = (p-1)(q-1)測試

  3)隨機選擇公鑰e,e只須要知足1<e<ψ(n),而且e和ψ(n)互素,(e, ψ(n)) = 1優化

  4)計算私鑰d,知足ed ≡ 1( mod ψ(n))加密

公鑰(e,n),私鑰(d,n)htm

最基本的RSA算法,很容易受到選擇密文攻擊,因此一幫能夠採用最佳對稱加密填充(OAEP)來解決。blog

  這樣就切斷了攻擊者,直接利用密文來測試明文的途徑。ip

 

CRT,Chinese Remander Theorem是一種對模冪運算速度進行優化的算法。

在計算模冪的時候,能夠分爲兩步:

1)CRT  keysetup

  input    p(first prime  modulus  factors),q(second  prime  modulus  factors),d(私鑰 secret exponent)

  output dp,dq,qinv;

    流程:qinv = 1/q mod p;

       dp = d mod (p-1);

       dq = d mod (q-1);

2)CRT  Modular Exponent

  input   msg,  p,  q,  qinv,  dp,  dq

  output  c

    流程:mp = msg^p mod p;

       mq = msg^q mod q;

          i = mp^dp mod p;

          j = mq^dq mod q;

          j' = j mod p;

          k = (i - j') mod p;

          L = (k*qinv) mod p;

        s = L*q

        c = s+j

 

因爲公鑰e的通常範圍都比較小,openssl的默認值是3-64之間,因此加密運算和signature,通常是不用crt加速的。

這樣:公鑰通常指:(n,e)

   私鑰通常指:(n,d)  (p,q,dp,dq,qinv)

 

RSA的key_generation函數:包括1)選擇公鑰指數e,2)內部產生factors,p,q,n,3)計算私鑰指數d

  input包括:

    1) k,length of modulus n in bits,(k = 1024+256s)

    2) e的長度,2<=e<=2k-160 (e的長度爲零,表示內部本身randomize)

    3) hash function, random_seed,TRNG function

  output包括:

    1)公鑰(n, e)

    2)私鑰(n, d)以及(p,q,dp,dq,qinv)

公鑰e通常能夠使用固定值也能夠使用隨機值,

  固定值,通常包括2,3,17,217+1(65537)

  隨機值通常要求,e的最高位和最低位都爲1,而且,2<=e<2k-160 k爲modulus n的bits

 

RSA的應用能夠分爲加解密primitives和簽名驗籤primitives

  1) Encryption/Decryption primitives,

    RSAEP((n,e), m)

    輸入:   (n,e) RSA公鑰

        m    message,範圍在0 - n-1之間,不然報錯

    輸出:c    ciphertext,範圍在0 - n-1之間,

    步驟:1) 判斷m的範圍是否在0 - n-1之間,不然報錯

       2) c = memod n

       3) 輸出c

    RSADP(K,c)

    輸入:K--------(n, d)

           (p,q,dp,dq,qinv)

       c    ciphertext,在0 - n-1之間

    輸出:m    message,範圍在0 - n-1之間

    步驟:crt_exp或mod_exp算法

  2)Signature/Verifiaction primitives,

    RSASP1(K, m)

    輸入:  K---------一對密鑰(n,d)

         ---------CRT的密鑰序列(p,q,dp,dq,qinv)

         m   message介於0 - n-1之間

    輸出:  s   signature介於0 - n-1之間

    步驟:   1)判斷message的範圍在0 - n-1之間,

        2)進行crt_exp, mod_exp的計算。

    RSAVP1((n,e), s)

    輸入:   (n,e) RSA公鑰

        s signature介於0 - n-1之間

    輸出: m   message 基於0-n-1之間

    步驟:m = semodn

    在簽名驗籤中必須保證密鑰對是正確的。這是一個前提條件

 

在PKCS1的標準中:

encryption scheme能夠分爲RSAES-OAEP和RSAES-PKCS1-v1.5

  RSAES-OAEP的步驟:

    RSAES-OAEP-ENCRYPT

    

    1) 首先檢查原始字符串的長度是否超過sha運算的最大支持長度;

      檢查mLen的長度是否<= k -2hLen -2

    2) EME-OAEP encoding,產生EM(Encoding message)

      

      其中seed爲隨機數,lHash,不一樣的hash算法,初始值不一樣:

        

    3) RSA encryption primitive

    RSAES-OAEP-DECRYPT(K, C, L)步驟

     

    1)長度檢查,原始字符串的長度必須小於SHA運算的最大值;

          若是密文C不是modulus的比特數,輸出decryption error

          若是k < 2hLen + 2,輸出decryption error

    2) RSA decryption

    3) EME-OAEP decoding

      

  RSAES-PKCS1-V1_5-Encrypt((n,e) M)

      Encryption步驟:

        

        1) length check,mLen > k-11

        2) EME_PKCS1-v1_5 encoding,

        3) RSA encryption

      Decryption步驟:

        

        1) length check,若是k<11或者C不是k bit長度

        2) RSA decryption

        3) EME-PKCS1-v1_5 decoding

 

Signature和Verification的流程有:RSASSA-PSS和RSASSA-PKCS1-v1_5

      PSS:RSASSA-PSS-SIGN(K, M)

        

        步驟:    EMSA-PSS encoding

             RSA signature

        RSASSA-PSS-VERIFY ((n,e), M, S)

        

        步驟:   Length checking

            RSA verification

            EMSA-PSS decoding

  RSASSA-PKCS1-v1_5只是encoding和decoding的方式不一樣。

 

具體的encoding方式,見http://www.cnblogs.com/-9-8/p/7997965.html  

 

RSA-X9.31 1998中的Signature和Verification流程:

    

 

verification流程:

    

    

 

關於RSA的一個很好的網頁

https://www.di-mgt.com.au/rsa_alg.html

相關文章
相關標籤/搜索