攻防世界 Crypto OldDriver (低加密指数广播攻击)

47 篇文章 1 订阅
8 篇文章 0 订阅

题目来源:XCTF 4th-WHCTF-2017
题目描述:有个年轻人得到了一份密文,身为老司机的你能帮他看看么?
题目附件:https://adworld.xctf.org.cn/media/file/task/4981449e0af24b10a4125ee647270fe3.zip

0x00 下载附件,查看附件内容

在这里插入图片描述

只有一个enc.txt,文件内容如下:

[{"c": 7366067574741171461722065133242916080495505913663250330082747465383676893970411476550748394841437418105312353971095003424322679616940371123028982189502042, "e": 10, "n": 25162507052339714421839688873734596177751124036723831003300959761137811490715205742941738406548150240861779301784133652165908227917415483137585388986274803},
{"c": 21962825323300469151795920289886886562790942771546858500842179806566435767103803978885148772139305484319688249368999503784441507383476095946258011317951461, "e": 10, "n": 23976859589904419798320812097681858652325473791891232710431997202897819580634937070900625213218095330766877190212418023297341732808839488308551126409983193},
{"c": 6569689420274066957835983390583585286570087619048110141187700584193792695235405077811544355169290382357149374107076406086154103351897890793598997687053983, "e": 10, "n": 18503782836858540043974558035601654610948915505645219820150251062305120148745545906567548650191832090823482852604346478335353784501076761922605361848703623},
{"c": 4508246168044513518452493882713536390636741541551805821790338973797615971271867248584379813114125478195284692695928668946553625483179633266057122967547052, "e": 10, "n": 23383087478545512218713157932934746110721706819077423418060220083657713428503582801909807142802647367994289775015595100541168367083097506193809451365010723},
{"c": 22966105670291282335588843018244161552764486373117942865966904076191122337435542553276743938817686729554714315494818922753880198945897222422137268427611672, "e": 10, "n": 31775649089861428671057909076144152870796722528112580479442073365053916012507273433028451755436987054722496057749731758475958301164082755003195632005308493},
{"c": 17963313063405045742968136916219838352135561785389534381262979264585397896844470879023686508540355160998533122970239261072020689217153126649390825646712087, "e": 10, "n": 22246342022943432820696190444155665289928378653841172632283227888174495402248633061010615572642126584591103750338919213945646074833823905521643025879053949},
{"c": 1652417534709029450380570653973705320986117679597563873022683140800507482560482948310131540948227797045505390333146191586749269249548168247316404074014639, "e": 10, "n": 25395461142670631268156106136028325744393358436617528677967249347353524924655001151849544022201772500033280822372661344352607434738696051779095736547813043},
{"c": 15585771734488351039456631394040497759568679429510619219766191780807675361741859290490732451112648776648126779759368428205194684721516497026290981786239352, "e": 10, "n": 32056508892744184901289413287728039891303832311548608141088227876326753674154124775132776928481935378184756756785107540781632570295330486738268173167809047},
{"c": 8965123421637694050044216844523379163347478029124815032832813225050732558524239660648746284884140746788823681886010577342254841014594570067467905682359797, "e": 10, "n": 52849766269541827474228189428820648574162539595985395992261649809907435742263020551050064268890333392877173572811691599841253150460219986817964461970736553},
{"c": 13560945756543023008529388108446940847137853038437095244573035888531288577370829065666320069397898394848484847030321018915638381833935580958342719988978247, "e": 10, "n": 30415984800307578932946399987559088968355638354344823359397204419191241802721772499486615661699080998502439901585573950889047918537906687840725005496238621}]

 有10组RSA加密后得到的密文,以及对应的e和n,其中e的值均为10,可以进行低加密指数广播攻击。

0x01 低加密指数广播攻击原理

1、低加密指数

 所谓低加密指数,指的是RSA加密过程中使用的参数e的值很小,这样往往会产生安全隐患,导致低加密指数攻击的发生。

2、广播

 所谓广播,就是发送方将一份明文进行多份加密,但是每份使用不同的密钥,即密钥中的模数n不同,但是指数e相同且很小,因此我们只要得到多份密文和对应的模数n就可以利用中国剩余定理进行解密。

3、低加密指数广播攻击

 实现低加密指数广播攻击需要满足以下三个条件:

(1)加密指数e非常小。
(2)同一份明文使用不同的模数n,相同的加密指数e进行多次加密。
(3)攻击者可以得到每一份加密后的密文和对应的模数n、加密指数e。

4、中国剩余定理

 设正整数 n 1 , n 2 , n 3 , … … , n k n_1, n_2, n_3, ……, n_k n1,n2,n3,,nk两两互素,对任意整数 c 1 , c 2 , c 3 , … … , c k c_1, c_2, c_3, ……, c_k c1,c2,c3,,ck, 一次同余方程组
{ x ≡ c 1   ( m o d   n 1 ) x ≡ c 2   ( m o d   n 1 ) x ≡ c 3   ( m o d   n 2 ) ⋮ x ≡ c k   ( m o d   n k ) \left\{ \begin{aligned} x & \equiv c_1\ (mod\ n_1) \\ x & \equiv c_2\ (mod\ n_1) \\ x & \equiv c_3\ (mod\ n_2) \\ & \qquad \vdots \\ x & \equiv c_k\ (mod\ n_k) \\ \end{aligned} \right. xxxxc1 (mod n1)c2 (mod n1)c3 (mod n2)ck (mod nk)
在模 N N N意义下存在唯一解,该解可表示为:
x ≡ N 1 d 1 c 1 + N 2 d 2 c 2 + N 3 d 3 c 3 + ⋯ + N k d k c k   ( m o d   N ) x \equiv N_1d_1c_1 + N_2d_2c_2 + N_3d_3c_3 + \cdots + N_kd_kc_k\ (mod\ N) xN1d1c1+N2d2c2+N3d3c3++Nkdkck (mod N)

其 中 , N = n 1 n 2 n 3 ⋯ n k , N i = N n i , d i ≡ N i − 1   ( m o d   n i ) 其中,N = n_1n_2n_3\cdots n_k,N_i = \frac{N}{n_i},d_i \equiv N_i^{-1}\ (mod\ n_i) N=n1n2n3nkNi=niNdiNi1 (mod ni)

0x02 编写解密脚本

 根据之前的分析,我们可以编写python解密脚本,联立10个一次同余式,利用中国剩余定理求得me,随后开e次方根,就可以得到明文m。
exp.py如下:

import gmpy2
from functools import reduce
from Crypto.Util.number import long_to_bytes


# 中国剩余定理
def CRT(cipher, n):
    N = reduce(lambda x, y: x * y, (i for i in n))
    result = 0
    data = zip(cipher, n)
    for ci, ni in data:
        Ni = N // ni
        di = gmpy2.invert(Ni, ni)
        result += ci * Ni * di
    return result % N, N


# 读入 e, n, c
e = 10

c = [
    7366067574741171461722065133242916080495505913663250330082747465383676893970411476550748394841437418105312353971095003424322679616940371123028982189502042,
    21962825323300469151795920289886886562790942771546858500842179806566435767103803978885148772139305484319688249368999503784441507383476095946258011317951461,
    6569689420274066957835983390583585286570087619048110141187700584193792695235405077811544355169290382357149374107076406086154103351897890793598997687053983,
    4508246168044513518452493882713536390636741541551805821790338973797615971271867248584379813114125478195284692695928668946553625483179633266057122967547052,
    22966105670291282335588843018244161552764486373117942865966904076191122337435542553276743938817686729554714315494818922753880198945897222422137268427611672,
    17963313063405045742968136916219838352135561785389534381262979264585397896844470879023686508540355160998533122970239261072020689217153126649390825646712087,
    1652417534709029450380570653973705320986117679597563873022683140800507482560482948310131540948227797045505390333146191586749269249548168247316404074014639,
    15585771734488351039456631394040497759568679429510619219766191780807675361741859290490732451112648776648126779759368428205194684721516497026290981786239352,
    8965123421637694050044216844523379163347478029124815032832813225050732558524239660648746284884140746788823681886010577342254841014594570067467905682359797,
    13560945756543023008529388108446940847137853038437095244573035888531288577370829065666320069397898394848484847030321018915638381833935580958342719988978247]
n = [
    25162507052339714421839688873734596177751124036723831003300959761137811490715205742941738406548150240861779301784133652165908227917415483137585388986274803,
    23976859589904419798320812097681858652325473791891232710431997202897819580634937070900625213218095330766877190212418023297341732808839488308551126409983193,
    18503782836858540043974558035601654610948915505645219820150251062305120148745545906567548650191832090823482852604346478335353784501076761922605361848703623,
    23383087478545512218713157932934746110721706819077423418060220083657713428503582801909807142802647367994289775015595100541168367083097506193809451365010723,
    31775649089861428671057909076144152870796722528112580479442073365053916012507273433028451755436987054722496057749731758475958301164082755003195632005308493,
    22246342022943432820696190444155665289928378653841172632283227888174495402248633061010615572642126584591103750338919213945646074833823905521643025879053949,
    25395461142670631268156106136028325744393358436617528677967249347353524924655001151849544022201772500033280822372661344352607434738696051779095736547813043,
    32056508892744184901289413287728039891303832311548608141088227876326753674154124775132776928481935378184756756785107540781632570295330486738268173167809047,
    52849766269541827474228189428820648574162539595985395992261649809907435742263020551050064268890333392877173572811691599841253150460219986817964461970736553,
    30415984800307578932946399987559088968355638354344823359397204419191241802721772499486615661699080998502439901585573950889047918537906687840725005496238621]

x, N = CRT(c, n)

m = gmpy2.iroot(gmpy2.mpz(x), e)[0]

print(m)
print(long_to_bytes(m))

运行结果:

854589733786598088127099154138504953368140761371523704656865879247874533963639770706597129057405
b'flag{wo0_th3_tr4in_i5_leav1ng_g3t_on_it}'

0x03 得到flag

flag{wo0_th3_tr4in_i5_leav1ng_g3t_on_it}
在这里插入图片描述

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChaoYue_miku

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值