这是一道关于RSA的解密题;首先,我们要明白,通常是公钥加密、私钥解密,私钥签名、公钥验证。这个题目中给出的是一个公钥和一段密文。

  刚开始一直以为和验证签名有关,费劲脑汁也想不出来怎么办。下面介绍些思路。

  首先,利用openssl分析公钥的格式,获得modulus和expoent。

  方法一:利用openssl asn1parse来分析公钥格式

  1. root@bt:~/Desktop# openssl asn1parse -in publickey.pub
  2. :d= hl= l= cons: SEQUENCE
  3. :d= hl= l= cons: SEQUENCE
  4. :d= hl= l= prim: OBJECT :rsaEncryption
  5. :d= hl= l= prim: NULL
  6. :d= hl= l= prim: BIT STRING

  那么在偏移为19处就是证书的expoent和modulus的信息。

  1. root@bt:~/Desktop# openssl asn1parse -in publickey.pub -i -strparse
  2. :d= hl= l= cons: SEQUENCE
  3. :d= hl= l= prim: INTEGER :0367198D6B5614E95813ADD8F22A4717BC72BE1EABD933D1B86944FDB75B8ED230BE62D7D1B69D222095C128C86F82012ECB116191FD9D018A6D02F84DB27BC51A21307DC86F4BF771C691C143E5ABE549B5BD2D6EB1A21FD6270E7E1B48FE0611FBB2E1B0B3524E6F4DE8B4E4A345DA44A13DE825B72608DB6C7C4A40B78266E6C87BBFDEF6B48381D49C4507A58BCD47B76D64B45908B158BD7EBC4DACB0B1CFD6C2C19574F40EB2EFD0E9E10DC7005CAD39BCAF52B9EAC3873368D69031C5E724684A44F068EFD1D3DC096D9B5D6411E58BDEE43E46B99A0D0494B9DB28195AF901AFF130D4A6E203DAD08DA57FA7E40262A5BADB2A323EDA28B44696AB305D
  4. :d= hl= l= prim: INTEGER :F3959D978E02EB9F06DEF3F335D8F8AFD7609951DDAC60B714B6C22AF0FA912F210B34206BD24A9601C78DF4A0275F107FD3AB552D95057EB934E71BDDCD7045C24B18587B8C8FCF5ADD4C5D83F0C77C94DC9C50CBE438E2B67BAFD31633B6AAF1781D90C3AD6F03D037B3321801B23546D483E67E26067F7B22347DDBC0C2D592CE814CBF5DFCCC141437F14E0B3990F88061E5F0BAE5F01E3FA70DB0E9605E7CFD575E9C81EFEEC529C33FD9037A20FD8ACD513AC9637768313E63F9838AE3511CDD0A9A2B516F2148C8D475A360A06359449739EECD251ABB42B014573E439F2FA4573557B25699FFC11E631CE8EE975A86E7E272BCF5F76A93450348FE3F

  则第二行的十六进制就是modulus,第三行的十六进制则是expoent。观察到这里,expoent几乎和modulus一样长。

  方法二:利用openssl rsa来获得modulus和expoent。

  1. root@bt:~/Desktop# openssl rsa -in publickey.pub -pubin -modulus -text
  2. Modulus ( bit):
  3. :::8d:6b:::e9:::ad:d8:f2:2a::
  4. :bc::be:1e:ab:d9::d1:b8:::fd:b7:5b:
  5. 8e:d2::be::d7:d1:b6:9d::::c1::c8:
  6. 6f:::2e:cb::::fd:9d::8a:6d::f8:
  7. 4d:b2:7b:c5:1a:::7d:c8:6f:4b:f7::c6::
  8. c1::e5:ab:e5::b5:bd:2d:6e:b1:a2:1f:d6::
  9. 0e:7e:1b::fe:::fb:b2:e1:b0:b3::4e:6f:
  10. 4d:e8:b4:e4:a3::da::a1:3d:e8::b7:::
  11. db:6c:7c:4a::b7:::e6:c8:7b:bf:de:f6:b4:
  12. ::d4:9c:::a5:8b:cd::b7:6d::b4::
  13. :b1::bd:7e:bc:4d:ac:b0:b1:cf:d6:c2:c1::
  14. :f4:0e:b2:ef:d0:e9:e1:0d:c7::5c:ad::bc:
  15. af::b9:ea:c3::::d6:::c5:e7:::
  16. 4a::f0::ef:d1:d3:dc::6d:9b:5d:::e5:
  17. 8b:de:e4:3e::b9:9a:0d:::b9:db:::5a:
  18. f9::af:f1::d4:a6:e2::da:d0:8d:a5:7f:a7:
  19. e4:::a5:ba:db:2a::3e:da::b4:::ab:
  20. :5d
  21. Exponent:
  22. :f3::9d::8e::eb:9f::de:f3:f3::d8:
  23. f8:af:d7::::dd:ac::b7::b6:c2:2a:f0:
  24. fa::2f::0b:::6b:d2:4a:::c7:8d:f4:
  25. a0::5f::7f:d3:ab::2d:::7e:b9::e7:
  26. 1b:dd:cd:::c2:4b:::7b:8c:8f:cf:5a:dd:
  27. 4c:5d::f0:c7:7c::dc:9c::cb:e4::e2:b6:
  28. 7b:af:d3:::b6:aa:f1::1d::c3:ad:6f::
  29. d0::b3::::b2:::d4::e6:7e:::
  30. 7f:7b:::7d:db:c0:c2:d5::ce::4c:bf:5d:
  31. fc:cc::::f1:4e:0b:::f8:::e5:f0:
  32. ba:e5:f0:1e:3f:a7:0d:b0:e9::5e:7c:fd::5e:
  33. 9c::ef:ee:c5::c3:3f:d9::7a::fd:8a:cd:
  34. :3a:c9:::::3e::f9::8a:e3::1c:
  35. dd:0a:9a:2b::6f:::c8:d4::a3::a0::
  36. ::::ee:cd::1a:bb::b0:::3e::
  37. 9f:2f:a4::::b2:::ff:c1:1e::1c:e8:
  38. ee::5a::e7:e2::bc:f5:f7:6a:::::
  39. fe:3f
  40. Modulus=367198D6B5614E95813ADD8F22A4717BC72BE1EABD933D1B86944FDB75B8ED230BE62D7D1B69D222095C128C86F82012ECB116191FD9D018A6D02F84DB27BC51A21307DC86F4BF771C691C143E5ABE549B5BD2D6EB1A21FD6270E7E1B48FE0611FBB2E1B0B3524E6F4DE8B4E4A345DA44A13DE825B72608DB6C7C4A40B78266E6C87BBFDEF6B48381D49C4507A58BCD47B76D64B45908B158BD7EBC4DACB0B1CFD6C2C19574F40EB2EFD0E9E10DC7005CAD39BCAF52B9EAC3873368D69031C5E724684A44F068EFD1D3DC096D9B5D6411E58BDEE43E46B99A0D0494B9DB28195AF901AFF130D4A6E203DAD08DA57FA7E40262A5BADB2A323EDA28B44696AB305D

  同样的,我们获得了modulus和expoent。

   由于expoent很大,可以使用Wiener攻击来得到d,从而对信息解密。

  求d的python脚本使用了https://github.com/pablocelayes/rsa-wiener-attack上的,稍微修改了下。

  1. import ContinuedFractions, Arithmetic
  2. import sys
  3. sys.setrecursionlimit(1000000)
  4. def hack_RSA(e,n):
  5. '''
  6. Finds d knowing (e,n)
  7. applying the Wiener continued fraction attack
  8. '''
  9. frac = ContinuedFractions.rational_to_contfrac(e, n)
  10. convergents = ContinuedFractions.convergents_from_contfrac(frac)
  11.  
  12. for (k,d) in convergents:
  13.  
  14. #check if d is actually the key
  15. if k!=0 and (e*d-1)%k == 0:
  16. phi = (e*d-1)//k
  17. s = n - phi + 1
  18. # check if the equation x^2 - s*x + n = 0
  19. # has integer roots
  20. discr = s*s - 4*n
  21. if(discr>=0):
  22. t = Arithmetic.is_perfect_square(discr)
  23. if t!=-1 and (s+t)%2==0:
  24. print("Hacked!")
  25. return d
  26. if __name__ == "__main__":
  27. e = 0xF3959D978E02EB9F06DEF3F335D8F8AFD7609951DDAC60B714B6C22AF0FA912F210B34206BD24A9601C78DF4A0275F107FD3AB552D95057EB934E71BDDCD7045C24B18587B8C8FCF5ADD4C5D83F0C77C94DC9C50CBE438E2B67BAFD31633B6AAF1781D90C3AD6F03D037B3321801B23546D483E67E26067F7B22347DDBC0C2D592CE814CBF5DFCCC141437F14E0B3990F88061E5F0BAE5F01E3FA70DB0E9605E7CFD575E9C81EFEEC529C33FD9037A20FD8ACD513AC9637768313E63F9838AE3511CDD0A9A2B516F2148C8D475A360A06359449739EECD251ABB42B014573E439F2FA4573557B25699FFC11E631CE8EE975A86E7E272BCF5F76A93450348FE3F
  28. n = 0x367198D6B5614E95813ADD8F22A4717BC72BE1EABD933D1B86944FDB75B8ED230BE62D7D1B69D222095C128C86F82012ECB116191FD9D018A6D02F84DB27BC51A21307DC86F4BF771C691C143E5ABE549B5BD2D6EB1A21FD6270E7E1B48FE0611FBB2E1B0B3524E6F4DE8B4E4A345DA44A13DE825B72608DB6C7C4A40B78266E6C87BBFDEF6B48381D49C4507A58BCD47B76D64B45908B158BD7EBC4DACB0B1CFD6C2C19574F40EB2EFD0E9E10DC7005CAD39BCAF52B9EAC3873368D69031C5E724684A44F068EFD1D3DC096D9B5D6411E58BDEE43E46B99A0D0494B9DB28195AF901AFF130D4A6E203DAD08DA57FA7E40262A5BADB2A323EDA28B44696AB305D
  29. d = hack_RSA(e,n)
  30. print d
  31. #d为:4221909016509078129201801236879446760697885220928506696150646938237440992746683409881141451831939190609743447676525325543963362353923989076199470515758399

  解密的脚本,参考自:http://rickgray.me/2015/03/23/bctf2015-writeup.html 写得很简单,但很清晰

  1. import binascii
  2.  
  3. n = 0x367198D6B5614E95813ADD8F22A4717BC72BE1EABD933D1B86944FDB75B8ED230BE62D7D1B69D222095C128C86F82012ECB116191FD9D018A6D02F84DB27BC51A21307DC86F4BF771C691C143E5ABE549B5BD2D6EB1A21FD6270E7E1B48FE0611FBB2E1B0B3524E6F4DE8B4E4A345DA44A13DE825B72608DB6C7C4A40B78266E6C87BBFDEF6B48381D49C4507A58BCD47B76D64B45908B158BD7EBC4DACB0B1CFD6C2C19574F40EB2EFD0E9E10DC7005CAD39BCAF52B9EAC3873368D69031C5E724684A44F068EFD1D3DC096D9B5D6411E58BDEE43E46B99A0D0494B9DB28195AF901AFF130D4A6E203DAD08DA57FA7E40262A5BADB2A323EDA28B44696AB305D
  4. d = 4221909016509078129201801236879446760697885220928506696150646938237440992746683409881141451831939190609743447676525325543963362353923989076199470515758399L
  5. c = 0x1e04304936215de8e21965cfca9c245b1a8f38339875d36779c0f123c475bc24d5eef50e7d9ff5830e80c62e8083ec55f27456c80b0ab26546b9aeb8af30e82b650690a2ed7ea407dcd094ab9c9d3d25a93b2140dcebae1814610302896e67f3ae37d108cd029fae6362ea7ac1168974c1a747ec9173799e1107e7a56d783660418ebdf6898d7037cea25867093216c2c702ef3eef71f694a6063f5f0f1179c8a2afe9898ae8dec5bb393cdffa3a52a297cd96d1ea602309ecf47cd009829b44ed3100cf6194510c53c25ca7435f60ce5f4f614cdd2c63756093b848a70aade002d6bc8f316c9e5503f32d39a56193d1d92b697b48f5aa43417631846824b5e86
  6.  
  7. m = hex(pow(c,d,n)).rstrip("L")
  8. print m
  9. print binascii.unhexlify(m[2:])
  10. #0x424354467b3965745265613479217d
  11. #BCTF{9etRea4y!}

参考文献:

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

http://stackoverflow.com/questions/3116907/rsa-get-exponent-and-modulus-given-a-public-key

http://www.openssl.org/docs/apps/openssl.html

https://github.com/pablocelayes/rsa-wiener-attack

http://rickgray.me/2015/03/23/bctf2015-writeup.html

BCTF warmup 50的更多相关文章

  1. hduoj 4710 Balls Rearrangement 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4710 Balls Rearrangement Time Limit: 6000/3000 MS (Java/Ot ...

  2. 记一次坑爹的RSA旅程____快哭了555555555(来自实验吧的warmup的wp和感想)

    这么简单的题目搞了我那么久,森森感觉自己菜的不行....哎,努力吧少年,BXS已经全国第二了. 嗯,废话不说,这道题目来自实验吧的"warmup",附上链接 http://www. ...

  3. PHPer不能不看的50个细节!

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的"函数&quo ...

  4. 【noip 2016】 蚯蚓(50分)(earthworm)

    50分小程序,写了2天- 题目在这里 一个单调队列,写的都是p=0的点,考试的时候要是弄到这些分的话--不说了-- 羡慕AC的神犇啊,54行的满分程序,而我-- #include <iostre ...

  5. 50个jQuery插件可将你的网站带到另一个高度

    Web领域一直在发生变化并且其边界在过去的每一天都在发生变化(甚至不能以小时为计),随着其边界的扩展取得了许多新发展.在这些进步之中,开发者的不断工作创造了更大和更好的脚本,这些脚本以插件方式带来更好 ...

  6. SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10.50.1600

    http://blog.csdn.net/feng19821209/article/details/8571571 SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10. ...

  7. 50个新的汉化Demo!纯前端 Wijmo 放大招

    Wijmo 是为企业应用程序开发而推出的一系列包含 HTML5 和 JavaScript 的开发控件,包含 Wijmo 5 . Wijmo 3 及面向企业级应用的控件金融图表.FlexSheet 和 ...

  8. 数据见50条常用sql

    问题及描述: --1.学生表 Student(Sid,Sname,Sage,Ssex) --Sid 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course ...

  9. IIS 7.5 Application Warm-Up Module

    http://www.cnblogs.com/shanyou/archive/2010/12/21/1913199.html 有些web应用在可以处理用户访问之前,需要装载很多的数据,或做一些花费很大 ...

随机推荐

  1. tftp使用方法

    参数说明:-l   是local的缩写,后跟存在于Client的源文件名,或下载Client后               重命名的文件名.          -r   是remote的缩写,后跟Se ...

  2. libevent evbuffer bug

    今天发现 libevent 2.0.22 一个坑爹的bug,导致消息混乱.查找问题浪费一天,复现代码如下 #include <event2/buffer.h> #include <s ...

  3. 匿名方法和Lambda表达式

    匿名方法本质上是一传递给委托的代码块,是使用委托的另一种方法. 规则: 1.匿名方法中不能使用跳转语句跳至次匿名方法的外部,反之亦然:匿名方法外部的跳转语句也不能跳转到匿名方法的内部: 2.在匿名方法 ...

  4. POJ 2420 A Star not a Tree? (计算几何-费马点)

    A Star not a Tree? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3435   Accepted: 172 ...

  5. 【单调队列】【3-21个人赛】【problmeB】

    Problem B Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Sub ...

  6. C#核编之格式化编程

    一.格式化控制台输入输出 1. 在前面的随笔中,会经常看到诸如{0},{1}之类的标记嵌入在字符串变量中..NET引入一种字符串格式化的新风格.与C的printf()相似,简而言之,如果需要定义一个字 ...

  7. Arcgis Runtime sdk for android 授权

    要下载和安装 ArcGISRuntime SDK for Android,您需要注册开发者账户,进而便拥有了访问所有功能的权限,从而实现开发和测试目的.但是,这种情况下,应用程序中的所有地图都具有水印 ...

  8. C#6 冒泡 折半查找 二维数组

    人类思维--计算机逻辑思维 逻辑思维--代码实现 写书法: 描红--临摹--碑贴--自成一体--草 章节复习: 数组:一维,二维,多维 一维:豆角.连续,同一类型. 定义:数据类型[] 数组名=new ...

  9. hadoop生态圈安装详解(hadoop+zookeeper+hbase+pig+hive)

    -------------------------------------------------------------------* 目录 * I   hadoop分布式安装   * II zoo ...

  10. 安装gVim

    从Vim官网下载其安装包,安装并首次运行后,开启控制台并执行如下命令: %HOMEDRIVE% cd %HOMEPATH% mkdir vimfiles cd vimfiles mkdir backu ...