RSA算法的工作流程

1. 生成公钥私钥

  生成两个素数p和q,计算n=p*q,计算φ(n)=n-p-q+1,然后生成e与d,使 e * d = 1 mod φ(n)。

  然后以(n, e)作为公钥,(n,d)作为私钥,其他的p,q,φ(n)可以舍弃。

2. 加密

  明文为c

  密文r = ce mod n

 解密

  密文为r

  明文c = rd mod n

3. 证明

  将加密的结果代入解密公式中,可以得到 rd mod n =  (ce mod n)d mod n = ced mod n = ck*φ(n)+1 mod n = (cφ(n))k * c mod n

  现在需要分情况讨论

  a. c与n互质,那么根据欧拉公式可以知道:cφ(n) =1 mod n,所以 (cφ(n))k * c mod n = c,得证

  b. c不与n互质,那么c=mq或者mp。假定c = mp

    此时我们需要证明 ced = c mod n,由于n=p*q,由费马小定理可以知道,此命题的充分条件是ced = c mod p && ced = c mod q

    对于ced = c mod p,由于c = mp,容易知道c mod p = 0, ced mod p = 0,所以ced = c mod p得证

    对于ced = c mod q,有ced mod q = ck*φ(n)+1 mod q = (cφ(n))k * c mod q = (c(q-1)*(p-1))k * c mod q = (c(q-1))(p-1)*k * c mod q = c,所以ced = c mod q得证。

    于是我们证明了 ced = c mod n

    但是有一点需要注意的是,此时密文r与公钥n有公约数p或者q,攻击者可以非常轻易的求解出私钥,这直接破坏了RSA的安全性。

    好在取到这种明文的可能性极小,概率上可以忽略。

最原始的RSA(textbook RSA):已知公钥(n,e),我们想传递一个密钥k,那么计算ke mod n得到密文c。

但是这种RSA是不安全的,其破解方式如下:

比方说k长度为64bit,那么这个k大约有20%的可能是由两个不超过34bit大小的k1*k2组成的

那么ke mod n = (k1 * k2) e mod n = (k1e * k2e) mod n,也就是说 c / k1e = k2e in Zn

如果先构建一个表格:{c/1e,c/2e,c/3e...c/234*e},然后假设k2的取值为0到234,检查k2e是否在上一步中构建的表格里,如果发现存在,那么立即可以知道k1与k2的值,也就知道密文k的值了

总的时间复杂度不超过240 << 264

正确使用RSA的姿势之一:PKCS1 v1.5 (public key cryptograhy standard)

比方说如果我们想要加密一个128bit的AES密钥msg,我们需要将其扩充为一个长度为2048bit的明文,其核心操作如下:

头16bit为0x0002(PKCS1 mode 2),再填充1896bit的随机值(不含0x00),再跟8bit的0x00,然后才是128bit的密钥。也就是将128bit的密钥msg扩充成了2048bit的明文p

现在我们可以将得到的明文p进行一般的RSA加密操作了,得到密文e。

接收者收到密文e后,用私钥解密,得到明文p,然后根据p的头16bit得到其模式为mode 2。然后直接取末尾的128bit,就得到了需要的密钥msg了。

对PKCS1 v1.5的攻击

SSL服务器在收到PKCS1 v1.5产生密文之后,根据解密后的明文的头16bit是否为0x0002返回结果  yes:countinue;no:error。

现在攻击者想要解密由公钥(n,e)产生的密文c

那么攻击者可以从Zn中选择r,然后计算c' = re * c = (r * KPCS1(m))e

将c'提交给服务器后可以知道,r * KPCS1(m)的头16bit是否为0x0002

如果巧妙构造r并多次提交,可以逐渐的猜测出KPCS1(m)的全文,虽然成功概率很小,但是依然是不可忽视的

攻击细节描述:原始论文stackexchange上的问答

HTTPS社区的对抗---RFC5246

核心思想,如果接收到的密文解密之后,不是以0x0002开头的,那就假定用户发送的密钥是一段随机字符串(也就是不立即告诉用户这个密文是不合法的),让错误信息在后续的通信中抛出。

正确使用RSA的姿势之二:PKCS1 v2.0 OAEP (Optimal asymmetric encryption padding)

为什么RSA难以破解?

因为如果想从公钥推知私钥,那么需要对大整数n进行因式分解,这个是极难做到的。

目前人类能完成的最好成绩是RSA-768,它是由两个384bit长的素数相乘得到的768bit长的整数,这是在2009年底被破解的

就目前来看,2048bit的密钥长度是绝对安全的。

为了提高解密速度,在私钥中使用比较小的d(比方说n是2048bit,d是128bit)

  实际上如果d的长度小于n的长度的1/4,算法是不安全的。

  d的长度不能小于n/2,最好与n长度相等。但是这涉及到一个开放问题。

RSA中,推荐使用的e值为65537=216+1,这样加密就只需要计算17次乘法

RSA中,p和q不宜相距太近,现在一般认为,如果合数N的位数为n,那么|p-q|要同时满足

N的NAF(Non-Adjacent Form,非相邻形式)权重不能小于N/4

Cryptography I 学习笔记 --- 基于陷门置换的公钥加密的更多相关文章

  1. Cryptography I 学习笔记 --- 基于Diffie-Hellman的公钥加密

    1. Diffie-Hellman协议: 假定g是集合G的生成元,G有n个元素. Alice随机选取1-n中的一个数a,并公布ga为公钥 Bob随机选取1-n中的一个数b,并公布gb为公钥 那么gab ...

  2. Linux学习笔记——基于鸟哥的Linux私房菜

    Linux学习笔记--基于鸟哥的Linux私房菜 ***** ARM与嵌入式linux的入门建议 (1) 学习基本的裸机编程:ARM7或ARM9,理解硬件架构和控制原理 (这一步是绝对的根基) (2) ...

  3. WCF学习笔记(基于REST规则方式)

    一.WCF的定义 WCF是.NET 3.0后开始引入的新技术,意为基于windows平台的通讯服务. 首先在学习WCF之前,我们也知道他其实是加强版的一个面向服务(SOA)的框架技术. 如果熟悉Web ...

  4. deep learning深度学习之学习笔记基于吴恩达coursera课程

    feature study within neural network 在regression问题中,根据房子的size, #bedrooms原始特征可能演算出family size(可住家庭大小), ...

  5. Linux常用命令学习笔记——基于CentOS 7

    前言:最近在linux培训时复习了一下linux系统中一些常用的命令和用法,整理成了笔记,虽然些许零散,但希望对大家有所帮助. 目录 0.帮助指令 1.关机.重启.注销命令 2.文件和目录操作命令 3 ...

  6. Cryptography I 学习笔记 --- 总结

    在b站上大概的看完了Dan Boneh的密码学,对现代密码学总算有了一个粗浅的认识. 总算能在纸上手写RSA公式并且证明之了,蛤蛤. 总体的感触就是,现代密码学是一个非常博大精深的体系,我等程序员最重 ...

  7. Cryptography I 学习笔记 --- 密钥交换

    1. 使用可信第三方(Trusted third parties)进行密钥交换. a. Alice与TTP之间的密钥是K1,Bob与TTP之间的密钥是K2. b. Alice向TTP发起一个与Bob交 ...

  8. Cryptography I 学习笔记 --- 信息完整性

    1. ECBC-MAC,需要一对密钥k与k1,然后将明文分组,用cbc模式对明文分块加密,将最后的密文块再用k1进行加密,即可得到结果 2. NMAC,需要一对密钥k与k1,然后将明文分组,用k加密第 ...

  9. Cryptography I 学习笔记 --- 分组密码

    1. 伪随机置换(PRF,Rseudo Random Permutaion)3DES/AES,K*X -> X(a. 可以高效计算,b. PRF函数是一个一一映射的函数,c. 存在有效的逆向算法 ...

随机推荐

  1. python语言介绍

    Python诞生于1989年,作者是吉多.范罗苏姆,人称龟叔,由C语言实现的. 1999年,基于python的web框架Zope 1诞生,标志着python向web领域迈出了第一步,现在这个框架好像不 ...

  2. JavaScript 计时事件-setInterval()-clearInterval() -setTimeout()-clearTimeout()

    (PS:JavaScript 一个设定的时间间隔之后来执行代码,我们称之为计时事件.) JavaScript 计时事件 通过使用 JavaScript,我们有能力做到在一个设定的时间间隔之后来执行代码 ...

  3. Git之2分钟教程

    Git之2分钟入门 普通人:“借我1000块钱”.程序猿:“借你1024吧,凑个整”. 今天是1024,是我们程序员的节日,在此,首先祝各位程序猿以及程序媛们节日快乐~然后送出一份节日礼物,没错,就是 ...

  4. 47.关于gradle的解疑

    Short Answer Gradle is a build system. Long Answer Before Android Studio you were using Eclipse for ...

  5. 【原创】React实例入门教程(1)基础API,JSX语法--hello world

    前  言 毫无疑问,react是目前最最热门的框架(没有之一),了解并学习使用React,可以说是现在每个前端工程师都需要的. 在前端领域,一个框架为何会如此之火爆,无外乎两个原因:性能优秀,开发效率 ...

  6. 并发编程——IO模型(6)

    1.IO模型分类 同步IO #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义,其实绝大多数函数都是同步调用.但是一般而言,我们在说同步.异步的时候,特指那些需要 ...

  7. Visual C++网络五子棋游戏源代码

    说明:网络对战版的五子棋,VC++游戏源码,带音乐,可设置网络最终网络下棋,通过源代码你将了解到设置菜单状态.服务器端口申请.客户机申请连接.发送数据.游戏编写.监听和使用套接字.主菜单对象定义等基础 ...

  8. sqlserver2008链接服务器中执行存储过程配置过程

    参考:http://www.cnblogs.com/ycsfwhh/archive/2010/12/15/1906507.html 1.双方启动MSDTC服务MSDTC(分布式交易协调器),协调跨多个 ...

  9. stdlib.h中自带的两个算法qsort,bsearch

    http://zh.cppreference.com/w/c/algorithm ========== void qsort( void *ptr, size_t count, size_t size ...

  10. UVALive 5033 I'm Telling the Truth 二分图最大匹配(略有修改)

    I - I'm Telling the Truth Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu ...