第十五个知识点: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密文用下面的方式:
\]
解密:
使用单向函数,我们能恢复这个值
\]
然后通过计算我们就能恢复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