202203_QQ_RSA_m<<p

Tags:RSA,经典非预期

0x00. 题目

task.py

#!/usr/bin/env python
from Crypto.Util.number import *
from secret import flag

n = 264048827496427248021277383801027180195275776366915828865010362454006394906519399441496561006668252031429735502465174250525698696973129422193405161920872162928097673289330345041221985548078586423910246601720647996170161319016119241836415788315729493164331517547663558380515400720081995290120793014108439083514403659082115510258023834737471488528527557960636984676435543300074504679264476413252780514962473070445293528877641502742438571110744667739728450283295649865745629276142949963507003094791773183928894536793857609738113546410753895719242547720815692998871947957214118354127328586542848234994500987288641595105
e = 65537
m = bytes_to_long(flag)
c = pow(m,e,n)
print(c)
# 76196483810925191371357319946893762223027002702624516192769497540954799651198719100683206759706879828894501526423422596543748404479640715319801018211652987852179907519286760601944889601355220646374788026632971331786307898234821477134265724962397355614076896148563340833323366935479885600112872998594315513803419069126624158092821269145991266528158747750965226483644012365861166608598063649804899693010576080857540523307078138634628539419178875838147396170651777949577793359622498517581948006585916952705460782942977789615065947303447566918741750017127110484065354974088489869377128636357092420660532261674969708694

0x01. WP

尝试用常规方法,使用factordb找到了几个因数

r1=5
r2=29
r3=31
r4=197
r5=12541
r6=4811988280952344246576937
r7=304081130082418831034791698146581643331044047712028910273173568327362370621651464924047927850720915897334538205155796477275515888954493777509372421863858817079340724222044305450451984754173948523380921443850440010226012354226083642718433164324022575599948330147718863789069
r8=16249579302136675275737472669394168521026727339712083110552530420348131906271518040549529167354613121510156841352658645018277766962773342379074137176993546193979134201416444089373463960664685121485689105129185197998903479181913613273443541075619342246119648308939006396145123630152777688592984718084919469059

但是经过isPrime()函数喝茶发现r7为合数,使用factordbyafa都无法分解,陷入死局。

百思不得其解之时,Q友给指了条明路,因为r8已经足够大且为质数,可以尝试使用r8替代n直接解题,遂豁然开朗

import binascii
import hashlib
import gmpy2
from Crypto.Util.number import *

# 用factordb分解n得到数个质因子
r1=5
r2=29
r3=31
r4=197
r5=12541
r6=4811988280952344246576937
r7=304081130082418831034791698146581643331044047712028910273173568327362370621651464924047927850720915897334538205155796477275515888954493777509372421863858817079340724222044305450451984754173948523380921443850440010226012354226083642718433164324022575599948330147718863789069
r8=16249579302136675275737472669394168521026727339712083110552530420348131906271518040549529167354613121510156841352658645018277766962773342379074137176993546193979134201416444089373463960664685121485689105129185197998903479181913613273443541075619342246119648308939006396145123630152777688592984718084919469059
n = 264048827496427248021277383801027180195275776366915828865010362454006394906519399441496561006668252031429735502465174250525698696973129422193405161920872162928097673289330345041221985548078586423910246601720647996170161319016119241836415788315729493164331517547663558380515400720081995290120793014108439083514403659082115510258023834737471488528527557960636984676435543300074504679264476413252780514962473070445293528877641502742438571110744667739728450283295649865745629276142949963507003094791773183928894536793857609738113546410753895719242547720815692998871947957214118354127328586542848234994500987288641595105

e = 65537

c=76196483810925191371357319946893762223027002702624516192769497540954799651198719100683206759706879828894501526423422596543748404479640715319801018211652987852179907519286760601944889601355220646374788026632971331786307898234821477134265724962397355614076896148563340833323366935479885600112872998594315513803419069126624158092821269145991266528158747750965226483644012365861166608598063649804899693010576080857540523307078138634628539419178875838147396170651777949577793359622498517581948006585916952705460782942977789615065947303447566918741750017127110484065354974088489869377128636357092420660532261674969708694

# 经查r7为合数,所以无法直接求phi_n
# 但因m = bytes_to_long(flag),而r8又是一个位数很长的素数
# m mod t*r8 = m mod r8
# 所以尝试使用非预期方式来解答,用r8直接替代n

phi_n=r8-1

d=inverse(e, phi_n)
m=long_to_bytes(pow(c,d,r8))
print(m)

# b'flag{5c066086-178b-46a7-b0f8-f1afba6f2910}'

0x02. 补充知识

这是一个偶然会出现的经典非预期。

如果出题人没有设置好明文填充,而是单单把flag作为明文的话,通常情况下这个明文都会比较短,短到m < p,(p是模数n的一-个分解)那么我们就可以直接利用p作为模数然后正常求解RSA就可以求解得到明文了。2020祥云杯的more_calc这一题就可以直接这样子一把梭。

至于为啥?,好推的,自己试试~ $$c \equiv m^e (mod n)→c \equiv m^e (mod p)$$

posted @ 2025-08-28 21:08  JasonJHu  阅读(3)  评论(0)    收藏  举报