RSA常见攻击方式(西电网信密码学大作业)

题目:RSA大礼包

摘要:

实验要求:

使用截获的加密数据,根据RSA算法的非合规使用,参数选取不当等,破译出相关明文和参数,其中参数主要为p、q以及私钥d。

实验目的:

通过对已截获密文的破译,学习对RSA常见的攻击方式,如共模攻击、低加密密指数攻击、低解密指数攻击、因数碰撞攻击、随机数发生器攻击等。在破译过程中,更深刻的理解RSA各个参数的作用及使用要求限制。并在今后的使用过程中,避免对参数的不合规使用,从而造成加解密系统的不安全。

题目描述

已知为截获的21条加密帧,对应的明文为一个通关密语,问是否能仅从加密数据恢复通关密语及RSA体质参数。若可以恢复,则需给出原文和参数,若不能恢复则需给出已恢复部分并说明剩余部分不能恢复的理由。

需要注意的是模数N=pq规模问1024比特,其中p、q为素数,每次对文本加密,最多只能加密八个明文字符,若超过八个字符,则需对明文进行分片,每个分片不超过八个字符。帧数据的数据格式如下,其中数据都是 16 进制表示,结构如下1024bit模数N | 1024bit加密指数e | 1024bit密文m^e mod N。分片加密后发送一个加密帧数据,帧数据文件名称为 FrameXX,其中 XX 表示接收序号,该序号不一定等于通信序号。

过程

背景:

RSA 的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题。数域筛法是目前 RSA 攻击的首选算法。在 1999 年,一台 Cray 超级电脑用了 5 个月时间分解了 512 比特长的密钥。在 512 比特 RSA 算法破解 10 年之后,即 2009 年 12 月 9 日,768比特 RSA 算法即 232 数位数字的 RSA-768 被分解。分解一个 768 比特RSA 密钥所需时间是 512 位的数千倍,而 1024 比特所需时间则是 768比特的一千多倍,因此在短时间内 1024 比特仍然是安全的。除此之外,目前对于 RSA 算法的攻击主要有以下方式:选择密文攻击、公共模数攻击、低加密密指数攻击、低解密指数攻击、定时攻击等等。

原理:

1)RSA 体制参数选取

Step1. 每个使用者,任意选择两个大素数ᵅd和ᵅe,并求出其乘积ᵄ1 = ᵅdᵅe。

Step2. 令ᵱ1(ᵄ1) = (ᵅd − 1)(ᵅe − 1),选择整数ᵅ2,使得GCD(ᵅ2,ᵱ1(ᵄ1)) = 1,并求出ᵅ2模ᵱ1(ᵄ1)的逆元ᵅ1,即ᵅ2ᵅ1 ≡ 1 mod ᵱ1(ᵄ1).

Step3. 将数对(ᵅ2, ᵄ1)公布为公钥,ᵅ1保存为私钥。

2)加解密过程

Bob 欲传递明文ᵅa给 Alice,则 Bob 首先由公开途径找出 Alice 的公

钥(ᵅ2, ᵄ1),Bob 计算加密的信息ᵅ0为:ᵅ0 ≡ ᵅaᵅ2 mod ᵄ1。

Bob 将密文ᵅ0传送给 Alice。随后 Alice 利用自己的私钥ᵅ1解密:

ᵅ0^ᵅ2 ≡ (ᵅa^ᵅ2)^ᵅ1 ≡ ᵅa^ᵅ2ᵅ1 ≡ ᵅa mod ᵄ1.

步骤:

1、提取加密帧中RSA参数

def getOptions(filepath: str):

with open(filepath, "r", encoding='GBK') as f:

msg = f.read()

n = int('0x' + msg[:1024 // 4], 16)

e = int('0x' + msg[1024 // 4:2048 // 4], 16)

c = int('0x' + msg[2048 // 4:], 16)

return n, e, c

2、共模攻击

若明文m相同,用两个公钥e1,e2加密得到两个私钥d1,d2 和两个密文c1,c2。共模攻击,即当m不变的情况下,知道n,e1,e2,c1,c2, 可以在不知道d1,d2的情况下,解出m利用条件为=> gcd(e1,e2)=1。加密帧中第0帧和第4帧可用共模攻击破解。

def com_module_attack(e1, e2, n, c1, c2):

# a*e1 + b*e2 = 1

a, b, d = extended_gcd(e1, e2)

print('============frame0, frame4===================')

print('p=')

print('q=')

print('frame0_e=' + str(e1))

print('frame4_e=' + str(e2))

print('msg=', end='')

print(libnum.n2s(int((pow(c1, a, n) * pow(c2, b, n)) % n))[-8:])

解得结果如下:

============frame0, frame4===================

frame0_e=46786465362686334917265996843779843233606992585424976481745055335468678697948774988450305612127967926533923268260412557000125153569622340353246096040604284883505587337829322949633637609180797447754513992039018904786537115087888005528547900640339270052628915440787357271345416818313808448127098885767015748889

frame4_e=152206992575706893484835984472544529509325440944131662631741403414037956695665533186650071476146389737020554215956181827422540843366433981607643940546405002217220286072880967331118344806315756304650248634546597784597963886656422706197757265316981889118026978865295597135470735576032282694348773714479076093197

msg=b'My secre'

3、因数碰撞攻击

多条报文选取选取到了相同的p,q,那么会出现n_1=pq_1,n_2=pq_2,则由欧几里得算法gcd(n1,n2)=p,再计算n/p即可得到参数q,计算出fai(n)=N-p-q+1,计算出私钥d,加密帧中第1帧和第18帧可用因数碰撞攻击破解。

def bad_choose_pq_com(e1, c1, n1, e2, c2, n2):

p = math.gcd(n1, n2)

q1 = n1 // p

q2 = n2 // p

print('================frame1======================')

print('p=' + str(p))

print('q=' + str(q1))

print('e=' + str(e1))

print('msg=', end='')

decryptRSA(p, q1, e1, c1)

print('================frame18======================')

print('p=' + str(p))

print('q=' + str(q2))

print('e=' + str(e2))

print('msg=', end='')

decryptRSA(p, q2, e2, c2)

解得结果如下:

================frame1======================

p=7273268163465293471933643674908027120929096536045429682300347130226398442391418956862476173798834057392247872274441320512158525416407044516675402521694747

q=12775796067504534889308793837705093856447186276434607181291462366302734214583227473619414509043813033676998357747882057607288385639737162184366176530607467

e=65537

msg=b'. Imagin'

================frame18======================

p=7273268163465293471933643674908027120929096536045429682300347130226398442391418956862476173798834057392247872274441320512158525416407044516675402521694747

q=12840807874760119497562989864651565491645077946976950748211992253853323703532620362223764981952516328133916264333884385029280730688894521589959051436522977

e=65537

msg=b'm A to B'

4、低加密指数广播攻击

若加密指数e非常小,一份明文使用不同的模数n,相同的加密指数e进行多次加密,则可以拿到每一份加密后的密文和对应的模数n、加密指数e。破解思路为不同的模数n中可能存在相同的p或者说q,求出不同n之间的最大公约数 gcd(),得到p或q 可得d,有私钥d就能得到明文。

def broadcast_attack(params: list):

x, n = chinese_remainder_theorem(params)

print('==========frame3, 8, 12, 16, 20==============')

print('p=')

print('q=')

print('e=5')

print('msg=', end='')

print(libnum.n2s(int(gmpy2.iroot(x, 5)[0]))[-8:])

解得结果如下:

==========frame3, 8, 12, 16, 20==============

e=5

msg=b't is a f'

5、Pollard p-1分解攻击

若所选取的素数p或素数q不为强素数,即p-1或q-1没有大素数因子时,可能存在pollard p-1 分解法实现对n的因子分解,计算出p,q,从而算出私钥d,破解明文。加密帧中第2帧、第6帧和第19帧可用Pollard p-1攻击破解。

def factor_n_p_1_attack(frames: list):

i = 0

for c, n, e in frames:

if i == 0:

print('================frame2======================')

elif i == 1:

print('================frame6======================')

else:

print('================frame19======================')

p = factor_n_p_1(n)

q = n // p

print('p=' + str(p))

print('q=' + str(q))

print('e=' + str(e))

print('msg=', end='')

decryptRSA(p, q, e, c)

i = i + 1

解得结果如下:

================frame2======================

p=1719620105458406433483340568317543019584575635895742560438771105058321655238562613083979651479555788009994557822024565226932906295208262756822275663694111

q=52484065122572767557293534477361686456679280880304125291106733197354892893647364164212186415880889674435558369420400890814461263958618375991691022752189839

e=65537

msg=b' That is'

================frame6======================

p=920724637201

q=159482692259010816139523195494724350795654007589889398757383554027183924116413427533184220914037106543253535103452324841452565420868944985464229649420240708554088156331324206733727690785373464575525698274552058386560106163093965065830071277465943834308083708065429495092746028681968670036721164931

e=65537

msg=b' "Logic '

================frame19======================

p=1085663496559

q=86725761611859895386396141031497189948984447138542215420462553101081991008304507461163078354877970282649251051457532902955009856009405853917396630017011320500357081664483071782135584899953560478866041032397335990722689211113937797406269980402604895207480485168493674422769645640726941944110986793

e=65537

msg=b'instein.'

6、Fermat分解攻击

若模数N的因子p与q非常接近,则可通过尝试

,从而分解出p+q。加密帧中第10帧和第14帧可用Pollard p-1攻击破解。

def factor_n_fermat_attack(frames: list):

i = 0

for c, n, e in frames:

if i == 0:

print('================frame10======================')

else:

print('================frame14======================')

p, q = fermat(n)

print('p=' + str(p))

print('q=' + str(q))

print('e=' + str(e))

print('msg=', end='')

decryptRSA(p, q, e, c)

i = i + 1

解得结果如下:

================frame10======================

p=9686924917554805418937638872796017160525664579857640590160320300805115443578184985934338583303180178582009591634321755204008394655858254980766008932978699

q=9686924917554805418937638872796017160525664579857640590160320300805115443578184985934338583303180178582009591634321755204008394655858254980766008932978633

e=65537

msg=b'will get'

================frame14======================

p=10954856299233465126359914171500305822846165431085183673999109759449706417636519711881707731622506407722143163847672064459333431572992021257881551867597529

q=10954856299233465126359914171500305822846165431085183673999109759449706415739193445885099004577509868426540084786683485568001351280541116090063034118634519

e=65537

msg=b' you fro'

至此,根据已有部分的明文,已经可以大致推测出明文逻辑,根据搜索,得到明文如下:

My secret is a famous saying of Albert Einstein. That is "Logic will get you from A to B. Imagination will take you everywhere.”

总结

通过本次实验,我对RSA体质各个参数的作用以及常见误用方式有了更深的了解,通过对RSA常见的攻击方式的实现,如共模攻击、因数碰撞攻击、低加密指数广播攻击、Pollard p-1分解攻击、Fermat分解攻击,不仅锻炼了自己的编程能力,还在一次次尝试与debug中对RSA加密体制有了更清楚的认识。了解到一个安全的加密体制,不仅仅需要其在理论证明上的安全性,只有使用者使用时按照要求,明确各个参数的作用,才能避免被轻易破解的问题。

在实验过程中,遇到最大的问题是刚拿到题目时,试图逐个帧依次破解,但是少量的知识储备使我一度无从下手、毫无思绪。之后,通过搜索,从许多优秀的博客中了解到了每个帧大致的攻击方式和破解思路,由此才一步一步先去了解相关攻击方式、再去实现、再尝试破解最终得到明文,在此十分感谢那些优秀博客的创作者。

参考文献

[1]《现代密码学》(红书)

[2]https://www.cnblogs.com/coming1890/p/13506057.html

[3]https://blog.csdn.net/Mitchell_Donovan/article/details/120771960

[4]https://blog.csdn.net/weixin_45859850/article/details/110479914

[5]https://blog.csdn.net/qq_45564150/article/details/124656223

[6]https://www.jianshu.com/p/76a05f18e969

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值