CTF Crypto ---已知p**2+q**2且e值较小

题目

from secret import flag

m = libnum.s2n(flag)

p = libnum.generate_prime(1024)
q = libnum.generate_prime(200)
a = p**2+q**2

e1=libnum.generate_prime(16)
e2=gmpy2.next_prime(e1)
n=p*q
c1=pow(m,e1,n)
c2=pow(m**3,e2,3*n)

print("a=",a)
print("c1=",c1)
print("c2=",c2)

a= 24206265871435822703437518362958531356211626642007253784650483176562422122875340827288772819943478120095206127359525474074270229930748107117372266160892473927182468441245406239260325825983178681264861898227398697570877226191045205101392758306677352447609463242377314079908674367312467009340725296069934982237938083953835511845988528740319671339681988454341775949773782599028758795858243892505801751373271145879675219676812982346718542627999285987122318375982631166086424677380378329616021990407324172009541237668232705741580914256004477070860164426099061412907214192878993303911745798633464333183684318013108481194330
c1= 126859631077098611901511232008797051138574124478480730639144977155143424488144265276530078952871200528973257851214276765041293928258819231377836450311630167556457808627111669654324359435794012547994299283010757231576308562368663215764193973190892053938581481578656240077555108821408787703658040501252208210069312753866895619962762868562608316860640231777068617867166147
c2= 11826835748339980863398980051042008082750935496082618268555582889298555680769555714450413403033938771160762505072342684767000980792793194857952806136430859946630518327736718530548802427141716474368099142576512330275210929488407696914896855868077026602082934281710567654604010065436992743237842728041335992414634519294554988610297895321490267356849938289132035975812904

#libnum.generate_prime(n):产生长度为n位的伪素数

过程分析

由题目可知,p的位数为1024,q的位数为200。在各自平方之后,p的平方远远大于q的平方,所以a开平方的值可近似看作p,然后(a-p**2)开平方得到q。又因为e1 = libnum.generate_prime(16),是一个长度为16位的伪素数,在这个范围内我们可以对e1进行爆破,找到满足条件的e1,再求Phi和d,最终得到flag。

解题脚本

import gmpy2
from Crypto.Util.number import *

a= 24206265871435822703437518362958531356211626642007253784650483176562422122875340827288772819943478120095206127359525474074270229930748107117372266160892473927182468441245406239260325825983178681264861898227398697570877226191045205101392758306677352447609463242377314079908674367312467009340725296069934982237938083953835511845988528740319671339681988454341775949773782599028758795858243892505801751373271145879675219676812982346718542627999285987122318375982631166086424677380378329616021990407324172009541237668232705741580914256004477070860164426099061412907214192878993303911745798633464333183684318013108481194330
c1= 126859631077098611901511232008797051138574124478480730639144977155143424488144265276530078952871200528973257851214276765041293928258819231377836450311630167556457808627111669654324359435794012547994299283010757231576308562368663215764193973190892053938581481578656240077555108821408787703658040501252208210069312753866895619962762868562608316860640231777068617867166147
c2= 11826835748339980863398980051042008082750935496082618268555582889298555680769555714450413403033938771160762505072342684767000980792793194857952806136430859946630518327736718530548802427141716474368099142576512330275210929488407696914896855868077026602082934281710567654604010065436992743237842728041335992414634519294554988610297895321490267356849938289132035975812904

p = gmpy2.iroot(a,2)[0]
q = gmpy2.iroot(a-p**2,2)[0]
n = p*q
phi = (p-1)*(q-1)
for e in range(2**15,2**16):
    if gmpy2.is_prime(e):
        try:
            d = gmpy2.invert(e,phi)
            m = pow(c1,d,n)
            flag = long_to_bytes(m)
            if b'flag' in flag:
                print(flag)
                break
        except:
            pass

flag:

flag{b8082417-0499-41f4-8c26-a1de19c44c42}

【男子年轻时候,总是想着自己有什么,就给女子什么,这没什么不好的。不同的岁月,不同的情爱,各有千秋,没有高下之分,好坏之别。人生无遗憾,太过圆满,事事无错,反而不美,就很难让人年老之后,时时惦念了。】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值