dp = d%(p-1)
∴dp*e=d*e mod(p-1)
∴d*e=dp*e+k1*(p-1) ①
又有e*d = 1mod((p-1)*(q-1))
∴e*d=k2*(p-1)*(q-1)+1 ②
①带入②得
dp*e+k1*(p-1)=k2*(p-1)*(q-1)+1 k1,k2∈Z
dp*e =k2*(p-1)*(q-1)+k3*(p-1)+1 k2,k3∈Z
e*dp=(k2*(q-1)+k3)*(p-1)+1
∵dp<q-1
∴(k2*(q-1)+k3)<e
设(k2*(q-1)+k3)=i
可以通过遍历求出i的值
根据已知条件n=p*q,i*(p-1)+1=dp*e
1 2 3 4 5 6 7 8 9 10 for i in range (2 ,e): if (dp*e-1 )%i==0 : p=((dp*e-1 )//i)+1 if n%p==0 : q=n//p if e*dp==i*(p-1 )+1 : d=__import__ ('gmpy2' ).invert(e,(p-1 )*(q-1 )) print (long_to_bytes(pow (c,d,n))) break
例题[LitCTF 2023]P_Leak | NSSCTF
给了dp,n,c可以直接求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 e=65537 dp= 5892502924236878675675338970704766304539618343869489297045857272605067962848952532606770917225218534430490745895652561015493032055636004130931491316020329 n= 50612159190225619689404794427464916374543237300894011803225784470008992781409447214236779975896311093686413491163221778479739252804271270231391599602217675895446538524670610623369953168412236472302812808639218392319634397138871387898452935081756580084070333246950840091192420542761507705395568904875746222477 c= 39257649468514605476432946851710016346016992413796229928386230062780829495844059368939749930876895443279723032641876662714088329296631207594999580050131450251288839714711436117326769029649419789323982613380617840218087161435260837263996287628129307328857086987521821533565738409794866606381789730458247531619 for i in range (1 ,e): if (dp*e-1 )%i==0 : p=((dp*e-1 )//i)+1 if n%p==0 : q=n//p if e*dp==i*(p-1 )+1 : d=__import__ ('gmpy2' ).invert(e,(p-1 )*(q-1 )) print (__import__ ('Crypto.Util.number' , fromlist=['*' ]).long_to_bytes(pow (c,d,n))) break