浅析RSA Padding Attack

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

内容简介:近日在复盘一些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


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

查看所有标签

猜你喜欢:

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

网络共和国

网络共和国

[美] 凯斯·桑斯坦 / 黄维明 / 上海人民出版社 / 2003-6-1 / 15.00元

本书主要讨论网络中的民主问题。网络技术已经深刻地影响了我们的生活,我们随时可以获得我们需要的信息,我们也随时可以与别人联系,那么网络技术是不是就是民主的福音呢?作者回答说不,他认为通过网络人们更容易获得的是自己喜欢的信息,而拒绝接受自己不喜欢的信息,事实上人们得到的是窄化的信息,很多的网站也不和与自己立场相反的网站链接。而在一个真正的民主的环境中,信息应是多元的并且不是我们事先选择的,在其中我们还......一起来看看 《网络共和国》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具