已知p,e,dp,c,b,其中n=p^bq
题目
from Crypto.Util.number import *
flag = b"qqqy{******}"
p = getPrime(1024)
q = getPrime(1024)
n = p**3*q
e = 65537
d = inverse(e, (p-1)*(q-1))
dp = d % (p-1)
m = bytes_to_long(flag)
c = pow(m, e, n)
print(f'p = {p}')
print(f'n = {n}')
print(f'c = {c}')
print(f'dp = {dp}')
'''
p = 150459524431879022215779890390877889910776501990926194968938789030355580821218423228291738951940892074284470564780615973672375426186094882655945264796805369645072387192525864308371188317656823005332661501763561486199940300097250799967470692861566343271700829461517189377435218410580738209289566273176349580083
n = 526850690294682188425912654706214017106720365568677682370188122871444090572571751846268230753545026807760262841602020271045490655402278145869602282220975418698276175288531267129228038385278807826772324209330570555365917745501962134063815702101102961140836988918789235717997650064537383604497073045825177881740683772187694926666353157723490625968769144420872871699877272801111687495455490024359592547820111857602612245105650486413348764705930590718011284245638124331752716456488067609288465546070599824815077501247237026161129154683537813861903782624560542464809121530824667113766769243203708015488280587207016534342261949446445279973464581796124924066379219981603373675792496359992912861347156961772952435185858419775040337389348544219026998095422971618416569495808997434230461037124210967749929899047131605347878949474917270832185314668290083722813997707417565980539317360014085999508723937063620510494213592472114264031166943617226160046250562860226412112269744903414225288241461481292457371173946855156619606222969930829991932917672085904140025835378932921765793416634541741387683200117898036803983242159171957271160122252533992579108890095226196648341989843963117264465020825158076963289551568090111689915163737684767163197833357
c = 423805365994833386645406673722245627852906079981404762923639685375991360922097411288812288374347570412635831713626443069375218873549122844956715638881862229916847929682457575870775662174551409430499144946274786604842471730056718594754602111611908194156355366647646776505197392196841233912522378463692946707598263529580476285016170152169410690850644085925257268680612489421716550805278948597132023877214647309464924979061667788790515302254251146450587726969278025896931232998723833133776940803823760204014935720753755356503388092513147193686640519039481841044366417568550079700413429940008113042291915216453078617061785382877408136814278269315262734203730135321178698206217122842794113022082256306636525656102291990621284258142754129756851281962299296036262300827149336931354883118152761479511717223777131134908023765447524463141145325276078846818449526875436172585202047769442569128616257262477861326711795181638744198677554095282520732579352737316161263062536522894860648654864298653093690783468680443660576152936964019161928075336277598164551577084966001963514364292190490662762712202546725147991116624179128694533070694567163308860088492785459522510590124718241557118013183919702306337532009815666333268441272927405196424435486733
dp = 15420855785417876805825617952538669553545108318553660552151637180781824562859516743586609251875840701633715134712168660377456181053328643770694178000826123684421795699714607482175401253180659476735576656046902398687840441212646804452164436027757467198010505080992583747321854251245415849852724669376467341035
'''
解题思路
Input: $(c, e, d_p, p, b)$
$m_p' = c^{d_p - 1} \bmod p$
$m_p = c \cdot m_p' \bmod p = c^{d_p} \bmod p$
for $i$ from $1$ to $b - 2$
$x = (c - m_{pi}e) \bmod p^{i + 1}$
$y = x \cdot m_p' \cdot (e^{-1} \bmod p) \bmod p^{i + 1}$
$m_{p^{i + 1}} = m_{p^i} + y$
Output: 部分解密结果 $m_{p^{b - 1}}$
解答
from Crypto.Util.number import *
import gmpy2
p = 150459524431879022215779890390877889910776501990926194968938789030355580821218423228291738951940892074284470564780615973672375426186094882655945264796805369645072387192525864308371188317656823005332661501763561486199940300097250799967470692861566343271700829461517189377435218410580738209289566273176349580083
c = 423805365994833386645406673722245627852906079981404762923639685375991360922097411288812288374347570412635831713626443069375218873549122844956715638881862229916847929682457575870775662174551409430499144946274786604842471730056718594754602111611908194156355366647646776505197392196841233912522378463692946707598263529580476285016170152169410690850644085925257268680612489421716550805278948597132023877214647309464924979061667788790515302254251146450587726969278025896931232998723833133776940803823760204014935720753755356503388092513147193686640519039481841044366417568550079700413429940008113042291915216453078617061785382877408136814278269315262734203730135321178698206217122842794113022082256306636525656102291990621284258142754129756851281962299296036262300827149336931354883118152761479511717223777131134908023765447524463141145325276078846818449526875436172585202047769442569128616257262477861326711795181638744198677554095282520732579352737316161263062536522894860648654864298653093690783468680443660576152936964019161928075336277598164551577084966001963514364292190490662762712202546725147991116624179128694533070694567163308860088492785459522510590124718241557118013183919702306337532009815666333268441272927405196424435486733
dp = 15420855785417876805825617952538669553545108318553660552151637180781824562859516743586609251875840701633715134712168660377456181053328643770694178000826123684421795699714607482175401253180659476735576656046902398687840441212646804452164436027757467198010505080992583747321854251245415849852724669376467341035
b = 3
e = 65537
mp1 = pow(c, dp, p)
mp = pow(c, dp - 1, p)
for i in range(1, b - 2):
x = pow(c - pow(mp1, e), 1, p**(i + 1))
y = pow(x * mp * (gmpy2.invert(e, p)), 1, p**(i + 1))
mp1 = mp1 + y
print(long_to_bytes(mp1))
#qqqy{Hensel lifting for Takagi's scheme (p.189)}