第十五個知識點:RSA-OAEP和ECIES的密鑰生成,加密和解密


第十五個知識點:RSA-OAEP和ECIES的密鑰生成,加密和解密

1.RSA-OAEP

RSA-OAEP是RSA加密方案和OAEP填充方案的同時使用.現實世界中它們同時使用.(這里介紹的只是"textbook rsa-oaep")

1.1 RSA[1]

RSA是一種最早的公鑰加密場景.它基於RSA問題的困難性(之前的博客說過).這里重新復習一下RSA的原理.

密鑰生成:

  • 生成兩個大素數\(p,q\)同時計算模數\(N=pq\).
  • 選擇一個隨機的數\(e \in Z_N .\)S.T.\(gcd( \phi(N),e)=1\),其中\(gcd\)是最大公約數.
  • 因為\(\phi(N)\)\(e\)是互質的\((gcd( \phi (N),e=1)\).我們能用XGCD尋找e的乘法逆元d,\(\phi (N):d=e^{-1} mod \space \phi(N)\).
  • 我們把(N,e)當做公鑰,同時把(p,q,d)當做私鑰.

加密:

  • 把信息解釋成一個整數\(m \in Z_N\).
  • 計算\(c=m^e \space mod \space N\).
  • 輸出c作為密文

解密

  • 在計算密文之前,我們先計算幾個固定的值,\(d \mod p-1,q^{-1} \mod p,d \mod q-1,p^{-1} \mod q\).
  • 然后計算\(m = ((c^{d \mod p-1})q(q^{-1} \mod p)+(c^{d \mod q-1} \mod q)p(p^{-1} \mod q))\)
  • 輸出m

注意這里用了CRT的方法計算m.使用CRT可以提升計算性能.

1.2 OAEP[2]

OAEP全稱為Optimal Asymmetric Encryption Padding.這是一種非對稱加密填充場景.它給確定性的算法帶來了隨機性.當使用RSA的時候,結合的場景被證明是IND-CCA安全的(實際上並不是,可以找本書好好看看OAEP,OAEP+,SSL,TLS,它們之間的攻擊防御還是挺有意思的,這里描述的只是一個簡化的方案).

  • \(f\)是k-bit單向函數,\(f:\{0,1\}^k \rightarrow \{0,1\}^k\)
  • m是n-bit消息
  • \(G,H\)是兩個偽隨機函數:\(G:\{0,1\}^s \rightarrow \{0,1\}^{n+t}\)同時\(H:\{0,1\}^{n+t} \rightarrow \{0,1\}^s\),其中\(k = n+t+s\)
  • \(R\)是s-bit的隨機數\(R \leftarrow \{0,1\}^s\)

加密:

我們計算k-bit密文用下面的方式:

\[Encrypt(m) = f_{pk}(\{(m||0^t) \oplus G(R) \}||\{R \oplus H((m||0^t) \oplus G(R))\}) \]

解密:

使用單向函數,我們能恢復這個值

\[f_{sk}(c) = \{(m||0^t) \oplus G(R) \}||\{R \oplus H((m||0^t) \oplus G(R))\} \]

然后通過計算我們就能恢復m的值.實際計算中,我們替換\(f_{sk},f_{pk}\)變成RSA中的加密函數.

2.ECIES(讀Dan Bonech的書啊,說的太明白了)

Elliptic Curve Integrated Encryption Scheme 是ElGamal公鑰加密系統在橢圓曲線密碼學中的應用.

簡單來說,我們用下面的范式來定義橢圓曲線:

\(E:y^2=x^3+ax+b\)

為了簡化問題,我們僅僅討論曲線\(E\)在素數域\(F_q\)中,使用一個基點\(P\),有一個素數階\(n\).然后我們定義建一個佳話的域參數:\(D=(q,a,b,P,n)\),其中

  • \(q\)是一個素數域的階.比如\(q\)是一個素數,\(x,y,a,b\)在{0,1,2,...,q-1}
  • a,b是橢圓曲線的系數
  • \(P\)是曲線上一個點
  • \(n\)\(P\)的素數階.例如,\(P\)的加法能在曲線上定義\(n\)個點,其中\(n\)是一個素數.

這些域參數都是公開的.

ECIES總是使用一個對稱加密場景和一個MAC(消息認證碼)場景.我們定義他們為{\(Enc_k(m)=c,Dec_k(c)=m\)}同時{\(MAC_k(m) = t,Very(t,m)=T/F\)}

我們定義\(KDF(s_1,s_2)=(k_{enc},k_{MAC})\).為`Key Derivation 有兩個種子\(s_1,s_2\).輸出一對加密密鑰和MAC密鑰.

然后我們描述這個場景:

密鑰生成

  • 選擇一個隨機整數\(d \in [1,n-1]\)
  • 選擇一個新的點\(Q=dP\)
  • 輸出Q作為公鑰,d是私鑰

加密

  • 選擇一個隨機整數\(k \in [1,n-1]\)
  • 計算\(R=kP,Z=kQ\).如果\(Z=\infty\),那么我們重新選擇一個k
  • 生成\((k_1,k_2)=KDF(x_Z,R)\).其中\(x_Z\)\(Z\)的x坐標.
  • 計算\(c=Enc_{K_1}(M)\),\(t=MAC_{k_2}(c)\)
  • 輸出\((R,c,t)\)作為密文

解密

  • 反向看之即可

因為\(z^{'}=dR=dkP=kQ=Z\).因此KDF()的種子事實上是相同的.因此,接收方可以生成與發送方相同的密鑰並解密消息。然而,我對ECC的了解非常有限。對於那些感興趣的人,你可以在[4]中找到更多。

References:
[1] http://people.csail.mit.edu/rivest/Rsapaper.pdf
[2] http://tools.ietf.org/html/rfc2437
[3] http://www.shoup.net/papers/iso-2_1.pdf
[4] http://www.springer.com/computer/security+and+cryptology/book/978-0-387-95273-4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM