zoukankan      html  css  js  c++  java
  • 第十五个知识点: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 ightarrow {0,1}^k)
    • m是n-bit消息
    • (G,H)是两个伪随机函数:(G:{0,1}^s ightarrow {0,1}^{n+t})同时(H:{0,1}^{n+t} ightarrow {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

  • 相关阅读:
    SpringBoot2.x前后端分离跨域问题及Swagger不能访问
    SpirngBoot2.x整合Swagger2接口文档
    SpringBoot2.x整合Druid数据源
    SpringBoot2.x整合logback 实现自动打印日志
    docker 进入 mysql中的操作
    Intellij Springboot (子模块)访问jsp页面404
    运行rabbitmq 的docker
    mybatis拦截器修改sql重新set后不生效?
    oracle+mybatis如何在新增时返回主键(自增序列)的值?
    oracle+mybatis报“未找到要求的from关键字”错误?
  • 原文地址:https://www.cnblogs.com/zhuowangy2k/p/12242712.html
Copyright © 2011-2022 走看看