記一次個人賽2019.1.11
阿新 • • 發佈:2019-01-11
本人比較喜歡密碼學。
個人賽:斷外網
有一道RSA,看了一下題:
給了兩個pem和兩個密文txt
用openssl讀取了兩個pem得到:
e1=117 e2=65537 N=67755F890795644EC27E68892B94042C78334C34F9A6D8B6AA488D9B424D64A8B9B2DCC91B1D098A09D7AC4F9A06A4B5267F88F8968B4BAD29235D9A80330845F126B9A865F44C7A77DF72F763F553E99020745F40C8D97 F0AB906154FBB1020B588F441F712B2377505B644FE36A78743EE4995B42C7B17B8DF4782EBB595097EE1BE74143261893C4EE2C140DC469E32B17F8AB30E25F07164506B4E79C6B4E3AF5BEA0268427FFB1134FB90A51227 29C4EEF17B6D0B12CFBA4E7F14E27AA3C2B4F978E75163242EBD5CBD73829336F9A120E86E25D69CAE0229FDCCEB5B35DC630187B0EEF1532EEC546F4037A6EAB0D0207199B9566011A52F8E9ACD7261
判斷是共模攻擊,於是改事先準備好的指令碼:
結果執行發現,自己沒有安裝gmpy2的庫,悲催的發現自己沒有庫,基本什麼庫都沒有。平時覺得麻煩沒有安裝,一直用Anaconda,等上戰場才知道Anaconda是需要網路的,於是我就gg了,回家後不甘心,跑了一下,flag果然出現了。(我的心情大家應該能體會的到)
import gmpy2 def ByteToHex( bins ): return ''.join( [ "%02X" % x for x in bins ] ).strip() def n2s(num): t = hex(num)[2:] if len(t) % 2 == 1: t= '0'+ t return ''.join([chr(int(b, 16)) for b in [t[i:i+2] for i in range(0, len(t), 2)]]) n = 13060424286033164731705267935214411273739909173486948413518022752305313862238166593214772698793487761875251030423516993519714215306808677724104692474199215119387725741906071553437840256786220484582884693286140537492541093086953005486704542435188521724013251087887351409946184501295224744819621937322469140771245380081663560150133162692174498642474588168444167533621259824640599530052827878558481036155222733986179487577693360697390152370901746112653758338456083440878726007229307830037808681050302990411238666727608253452573696904083133866093791985565118032742893247076947480766837941319251901579605233916076425572961 e1= 117 e2 = 65537 s = gmpy2.gcdext(e1,e2) #gmpy2.gcdext(e1,e2)的執行結果為元組(mpz(1), mpz(30841), mpz(-8)),所以元組的第0個值不能取,第1個值才是s1,第2個值由於是負數,所以要取反,變為正數 s1 = s[1] s2 = -s[2] c1 =12847007370626420814721007824489512747227554004777043129889885590168327306344216253180822558098466760014640870748287016523828261890262210883613336704768182861075014368378609414255982179769686582365219477657474948548886794807999952780840981021935733984348055642003116386939014004620914273840048061796063413641936754525374790951194617245627213219302958968018227701794987747717299752986500496848787979475798026065928167197152995841747840050028417539459383280735124229789952859434480746623573241061465550303008478730140898740745999035563599134667708753457211761969806278000126462918788457707098665612496454640616155477050 c2 =6830857661703156598973433617055045803277004274287300997634648800448233655756498070693597839856021431269237565020303935757530559600152306154376778437832503465744084633164767864997303080852153757211172394903940863225981142502888126928982009493972076013486758460894416710122811249903322437742241269681934551237431668187006176418124934488775505816544733929241927900392924886649420943699356314278255683484998359663404611236056664149725644051300950988495549164517140159041907329062655574220869612072289849679613024196448446224406889484578310512232665571188351621585528255501546941332782446448144033997067917984719103068519 c2 = gmpy2.invert(c2, n) #由於根據前面的運算,s1是正數,s2是負數,後面需要運算c2的s2次冪。因為在數論模運算中,要求一個數的負數次冪,與常規方法並不一樣,比如此處要求c2的s2次冪,就要先計算c2的模反元素c2r,然後求c2r的-s2次冪。 m = (pow(c1,s1,n) * pow(c2 , s2 , n)) % n print(n2s(m))