从零开始学RSA:已知n,e,d求p,q和私钥文件修复

 (8)已知n,e,d求p,q

一看这个标题你就应该有个觉悟,n一定无法直接分解得到p和q。

 

题目: 10-存货5

 

题目给出了两个文件,一个是加密脚本chall.py,一个是加密后输出的内容output.txt。

 

分析一下加密脚本:

from gmpy2 import invert

from md5 import md5

from secret import p, q



e = 65537

n = p*q

phi = (p-1)*(q-1)

d = invert(e, phi)



print n, e, d

print "Flag: flag{%s}" %md5(str(p + q)).hexdigest()


 

加密脚本真的是很简单啊,flag就是str(p+q)进行md5运算之后的得到的字符串,从output.txt中可以得到n,e,d。

 

用Winhex打开output文件提取数据

![image desc](./rsa-pic/rsa-11.png)


 

现在的关键问题就是求出p和q来,google一把梭好像可以找到这种骚操作,当时线上比赛做这个题目的时候真的就是google找到的类似题目,百度啊,可不可以靠谱一点。

 

解题脚本:

 

已知n,e,d求p,q

#!/usr/bin/python

#coding:utf-8




import random

from md5 import md5



def gcd(a, b):

   if a < b:

     a, b = b, a

   while b != 0:

     temp = a % b

     a = b

     b = temp

   return a



def getpq(n,e,d):

    p = 1

    q = 1

    while p==1 and q==1:

        k = d * e - 1

        g = random.randint ( 0 , n )

        while p==1 and q==1 and k % 2 == 0:

            k /= 2

            y = pow(g,k,n)

            if y!=1 and gcd(y-1,n)>1:

                p = gcd(y-1,n)

                q = n/p

    return p,q



def main():

    n = 16352578963372306131642407541567045533766691177138375676491913897592458965544068296813122740126583082006556217616296009516413202833698268845634497478988128850373221853516973259086845725813424850548682503827191121548693288763243619033224322698075987667531863213468223654181658012754897588147027437229269098246969811226129883327598021859724836993626315476699384610680857047403431430525708390695622848315322636785398223207468754197643541958599210127261345770914514670199047435085714403641469016212958361993969304545214061560160267760786482163373784437641808292654489343487613446165542988382687729593384887516272690654309

    e = 65537

    d = 9459928379973667430138068528059438139092368625339079253289560577985304435062213121398231875832264894458314629575455553485752685643743266654630829957442008775259776311585654014858165341757547284112061885158006881475740553532826576260839430343960738520822367975528644329172668877696208741007648370045520535298040161675407779239300466681615493892692265542290255408673533853011662134953869432632554008235340864803377610352438146264524770710345273439724107080190182918285547426166561803716644089414078389475072103315432638197578186106576626728869020366214077455194554930725576023274922741115941214789600089166754476449453

    p,q = getpq(n,e,d)

        print p

        print q

        print "Flag: flag{%s}" %md5(str(p + q)).hexdigest()

if __name__ == '__main__':

    main()

 (9)私钥文件修复

题目: 11-Jarvis OJ -Crypto-God Like RSA


 

呵呵,这个题我认了,别的不会的题目起码都能看个大概,这个题绝了,只是知道解题脚本中对应的变量是谁了(哈哈哈),顺带把变量给你们注释了,反正我是写不出来。

 

这里面涉及到的东西太多了,我觉得绝不单单是Python脚本的问题,什么数学、什么算法的,必须给你安排的明明白白的。So,我把这题作为了一个模板,以后有类似的题目,直接掏出来用,莫非这真是"上帝之手"?

 

题目给出三个文件,一个是公钥文件pubkey.pem,一个是残损的私钥文件private.corrupted,还有一个是密文文件flag.enc。

 

首先使用openssl提取公钥信息:

──(holyeyes㉿kali2023)-[~/Misc/RSA/godlikeRSA]

└─$ openssl rsa -pubin -in pubkey.pem -text -modulus

Public-Key: (4096 bit)

Modulus:

    00:c0:97:78:53:45:64:84:7d:8c:c4:b4:20:e9:33:

    58:67:ec:78:3e:6c:f5:f0:5c:a0:3e:ee:dc:25:63:

    d0:eb:2a:9e:ba:8f:19:52:a2:67:0b:e7:6e:b2:34:

    b8:6d:50:76:e0:6a:d1:03:cf:77:33:d8:b1:e9:d7:

    3b:e5:eb:1c:65:0c:25:96:fd:96:20:b9:7a:de:1d:

    bf:fd:f2:b6:bf:81:3e:3e:47:44:43:98:bf:65:2f:

    67:7e:27:75:f9:56:47:ba:c4:f0:4e:67:2b:da:e0:

    1a:77:14:40:29:c1:a8:67:5a:8f:f5:2e:be:8e:82:

    31:3d:43:26:d4:97:86:29:15:14:a9:69:36:2c:76:

    ed:b5:90:eb:ec:6f:ce:d5:ca:24:1c:aa:f6:63:f8:

    06:a2:62:cb:26:74:d3:5b:82:4b:b6:d5:e0:49:32:

    7b:62:f8:05:c4:f7:0e:86:59:9b:f3:17:25:02:aa:

    3c:97:78:84:7b:16:fd:1a:f5:67:cf:03:17:97:d0:

    c6:69:85:f0:8d:fa:ce:ee:6

你可能感兴趣的:(Crypto,python,网络安全,算法)