第十五个知识点: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

第十五个知识点:RSA-OAEP和ECIES的密钥生成,加密和解密的更多相关文章

  1. 第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法

    第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-45-de ...

  2. 第二十五个知识点:使用特殊的素数定义$GF(p)$和$GF(2^n)$的方法。

    第二十五个知识点:使用特殊的素数定义\(GF(p)\)和\(GF(2^n)\)的方法. 在我们之前看到的博客中,当实现密码学方案时,一个最频繁调用的操作就是模运算.不幸的是,尽管模块化的使用非常广泛, ...

  3. 第三十五个知识点:给针对ECDLP问题的Pollard rho,Pollard "Kangaroo",parallel Pollard rho攻击的一个粗略的描述

    第三十五个知识点:给针对ECDLP问题的Pollard rho,Pollard "Kangaroo",parallel Pollard rho攻击的一个粗略的描述 我们的目标是对任 ...

  4. iOS,一行代码进行RSA、DES 、AES、MD5加密、解密

    本文为投稿文章,作者:Flying_Einstein(简书) 加密的Demo,欢迎下载 JAVA端的加密解密,读者可以看我同事的这篇文章:http://www.jianshu.com/p/98569e ...

  5. (转)DES、RSA、MD5、SHA、随机生成加密与解密

    一.数据加密/编码算法列表   常见用于保证安全的加密或编码算法如下:   1.常用密钥算法   密钥算法用来对敏感数据.摘要.签名等信息进行加密,常用的密钥算法包括:   DES(Data Encr ...

  6. DES、RSA、MD5、SHA、随机生成加密与解密

    一.数据加密/编码算法列表   常见用于保证安全的加密或编码算法如下:   1.常用密钥算法   密钥算法用来对敏感数据.摘要.签名等信息进行加密,常用的密钥算法包括:   DES(Data Encr ...

  7. IOS基础之 (十五)知识点

    一 SEL 1. 方法的存储位置 每个类的方法地址列表都存储在类对象中. 每个方法都有一个与之对应的SEL类型的对象. 根据一个SEL对象就可以找到方法的地址,进而调用方法. Person.h #im ...

  8. Bristol大学密码学博士生的五十二个知识点

    Bristol大学密码学博士生的五十二个知识点 这个系列,是Bristol大学的密码安全工作组为密码学和信息安全相关的博士准备了52个基本知识点. 原地址:http://bristolcrypto.b ...

  9. C#实现RSA加密与解密、签名与认证(转)

    一.RSA简介 RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力 ...

随机推荐

  1. C语言中的指针的小标可以是负数

    首先,创建一个正常的数组 int A[20];.然后用指针指向其中间的元素 int *A2 = &(A[10]); 这样,A2[-10 ... 9] 就是一个可用的有效范围了. 1 2 3 4 ...

  2. Shell 管道指令pipe

    目录 管道命令pipe 选取命令 cut.grep cut 取出需要的信息 grep 取出需要行.过滤不需要的行 排序命令 sort.wc.uniq sort 排序 假设三位数,按十位数从小到大,个位 ...

  3. 3.7 rust 静态块

    Cargo.toml [dependencies] lazy_static = "1.4.0" main.rs #[macro_use] extern crate lazy_sta ...

  4. AFNetworking 网络错误提示data转换字符串

    AFN在进行网络交互时,有时候会碰到返回502.500.404的时候.后台的总需要你配合他查出问题所在.但是AFN在返回数据序列化时解析错误只会转成NSData类型的数据,如果直接扔给后台Data的数 ...

  5. 【Linux】【Services】任务计划、周期性任务执行

    Linux任务计划.周期性任务执行       未来的某时间点执行一次某任务:at, batch     周期性运行某任务:crontab         执行结果:会通过邮件发送给用户        ...

  6. springboot-MVC 过滤器使用

    一.前言 一下代码以SSO用户登录列子代码.完整代码https://gitee.com/xuxueli0323/xxl-sso 二.使用 2.1 创建过滤器 创建一个过滤器,实现Filter 接口 p ...

  7. spring cloud config center Git SSH configuration

    Git SSH configuration using properties By default, the JGit library used by Spring Cloud Config Serv ...

  8. 封装一个按Key排序的Map工具

    Map是集合的存放顺序是按哈希值定的,有时候不是我们需要的,当想要一个按自己规定顺序存放顺序,可以用LinkedHashMap,这里自己把LinkedHashMap封装了一次 package test ...

  9. MFC入门示例之组合框(CComboBox)、列表框(CListBox)

    1 //添加按钮点击事件 2 void CMFCApplication4Dlg::OnBnClickedButton1() 3 { 4 CString strText; 5 //获取文本框的值 6 G ...

  10. 第一章-Flink介绍-《Fink原理、实战与性能优化》读书笔记

    Flink介绍-<Fink原理.实战与性能优化>读书笔记 1.1 Apache Flink是什么? 在当代数据量激增的时代,各种业务场景都有大量的业务数据产生,对于这些不断产生的数据应该如 ...