浅析RSA Padding Attack

栏目: 编程工具 · 发布时间: 8年前

内容简介:近日在复盘一些Crypto的题目,做到了N1CTF的一道rsapadding,进行了一些拓展,于是进行了一些分析记录,有了这篇文章题目已开源在

浅析RSA Padding Attack

前言

近日在复盘一些Crypto的题目,做到了N1CTF的一道rsapadding,进行了一些拓展,于是进行了一些分析记录,有了这篇文章

题目分析

题目已开源在

https://github.com/Nu1LCTF/n1ctf-2018/tree/master/source/crypto/rsapadding

主要代码为

m = '*****************'
n = 21727106551797231400330796721401157037131178503238742210927927256416073956351568958100038047053002307191569558524956627892618119799679572039939819410371609015002302388267502253326720505214690802942662248282638776986759094777991439524946955458393011802700815763494042802326575866088840712980094975335414387283865492939790773300256234946983831571957038601270911425008907130353723909371646714722730577923843205527739734035515152341673364211058969041089741946974118237091455770042750971424415176552479618605177552145594339271192853653120859740022742221562438237923294609436512995857399568803043924319953346241964071252941
e = 3
welcom()
if cmd():
    f = open("/root/crypto/file.py")
    print(f.read())
    return
mm = bytes_to_long(m)
assert pow(mm, e) != pow(mm, e, n)
sys.stdout.write("Please give me a padding: ")
padding = input().strip()
padding = int(sha256(padding.encode()).hexdigest(),16)
c = pow(mm+padding, e, n)
print("Your Ciphertext is: %s"%c)

意思很简单

1.pow(mm, e) != pow(mm, e, n)

2.输入一个值

3.将输入的值sha256,记做padding

4.利用rsa加密m+padding

值得注意的是,e=3,padding可控

那么我们拥有的条件只有

n,e,c,padding

所以这里的攻击肯定是要从可控的padding入手了

初步推导

我们可以随便构造一对已知padding的密文,得到

浅析RSA Padding Attack

此时,我们可以设

浅析RSA Padding Attack

利用这两个式子,我们可以得到如下线性关系

浅析RSA Padding Attack

即方程形式为

浅析RSA Padding Attack

其中

浅析RSA Padding Attack

即

浅析RSA Padding Attack

我们有

浅析RSA Padding Attack

我们知道

浅析RSA Padding Attack

那么将其带入得到

浅析RSA Padding Attack

我们将c1展开得到

浅析RSA Padding Attack

我们将这个式子带入得到

浅析RSA Padding Attack

于是便一筹莫展

可求证明

上述的推导我们漏了一个非常重要的信息

浅析RSA Padding Attack

那么不难发现


浅析RSA Padding Attack

同理,我们还可以构造方程

浅析RSA Padding Attack

如此一来,我们可以得到

浅析RSA Padding Attack

是下列方程组的一个解

浅析RSA Padding Attack

那么一定可以有

浅析RSA Padding Attack

可以被写成

浅析RSA Padding Attack

如此一来,只要

浅析RSA Padding Attack

我们由e=3可以得知

浅析RSA Padding Attack

只有唯一解,所以k1和k2必互素,所以这里是M2一定是可求的

Related Message Attack

前面做了这么多证明铺垫,最后当然要祭出大招,即求解方法

这里的攻击是有方法名称的,即Related Message Attack

在e=3的情况下,我们可以利用rsa padding得到明文

根据之前第一步的推导,我们得到了

浅析RSA Padding Attack

我们将式子变形为

浅析RSA Padding Attack

移项得到

浅析RSA Padding Attack

根据立方差公式,我们又有

浅析RSA Padding Attack

联立

浅析RSA Padding Attack

我们将式子1左右同乘 aM2-b ,将式子2左右同乘 3b

然后即可得到如下式子

浅析RSA Padding Attack

我们再把c2带入得到

浅析RSA Padding Attack

则最后可以有

浅析RSA Padding Attack

即可求得M2

而我们知道

浅析RSA Padding Attack

所以最后有

浅析RSA Padding Attack

注意,这里的分式不是除法,是逆元

payload

既然推导出了公式,写脚本即可

def getM2(a,b,c1,c2,n):
    a3 = pow(a,3,n)
    b3 = pow(b,3,n)
    first = c1-a3*c2+2*b3
    first = first % n
    second = 3*b*(a3*c2-b3)
    second = second % n
    third = second*gmpy2.invert(first,n)
    third = third % n
    fourth = (third+b)*gmpy2.invert(a,n)
    return fourth % n
m = getM2(a,b,c1,c2,n)-padding2
print libnum.n2s(m)

Coppersmith’s short-pad attack

上述情况是e=3时候,我们可以根据

浅析RSA Padding Attack

推导出m

那么当e不是3的时候怎么办呢?

这里稍作拓展,我们可以用Coppersmith’s short-pad attack,即padding过短引起的攻击

脚本如下

https://github.com/ValarDragon/CTF-Crypto/blob/master/RSA/FranklinReiter.sage

后记

根据这一次学习,不难发现在存在padding的情况下,rsa也存在各种风险:

1.若e=3,则可以利用Related Message Attack

2.若e不为3,但padding过短,则可以利用Coppersmith’s short-pad attack


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

Ext JS源码分析与开发实例宝典

Ext JS源码分析与开发实例宝典

彭仁夔 / 电子工业出版社 / 2010-1 / 78.00元

《Ext JS源码分析与开发实例宝典》从Ext JS实现的基本功能开始讲解,从两个方面对Ext JS进行整体上的概述,让读者从宏观上去把握ExtJS框架。接下来讲解Ext JS核心基础知识,包括事件机制、模板模型、数据模型以及对类、函数、字符串、日期、数组及定时任务这6个类进行扩展。然后讲解Ext JS基于元素的开发,包括动画特效和拖曳实现等。最后深入讲解组件的开发,对布局、模型及4大组件一一进行......一起来看看 《Ext JS源码分析与开发实例宝典》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具