通过求根公式求p和q
题目:
import gmpy2
p =#被小男娘偷走了
q =#被小男娘摸走了
n = p * q
phi = (p - 1) * (q - 1)
m =#nian
e = 0xe6b1bee47bd63f615c7d0a43c529d219
d = gmpy2.invert(e, phi)
print(hex(p+q))
print(hex((p+1)*(q+1)))
print(hex(pow(m,e,n)))
0x1232fecb92adead91613e7d9ae5e36fe6bb765317d6ed38ad890b4073539a6231a6620584cea5730b5af83a3e80cf30141282c97be4400e33307573af6b25e2ea
0x5248becef1d925d45705a7302700d6a0ffe5877fddf9451a9c1181c4d82365806085fd86fbaab08b6fc66a967b2566d743c626547203b34ea3fdb1bc06dd3bb765fd8b919e3bd2cb15bc175c9498f9d9a0e216c2dde64d81255fa4c05a1ee619fc1fc505285a239e7bc655ec6605d9693078b800ee80931a7a0c84f33c851740
0x21bfef2961c512fbb81fd75ca1c38cbc810dee21d04de1e749c9a24cc975447acc1098228108f25a5ab4840212b2c0f305aabb17ee6835599425ffeedb85698ff9edbc70d9e87acd5232526304948f806c0283776d3eb217599e06616a12d899b14723bfeb29becb10e464247760f828463eb4f0536244771c648b6445fab855
解题思路:
- 我们可以通过以下关系来找到n=pq
(p+1)(q+1)=pq+p+q+1
所以n=(p+1)(q+1)−(p+q)−1
- 根据判别式Δ=b^2−4ac和求根公式(-b±√(b^2-4ac))/(2a)来计算二次方程的根,这里 a=1,b=p+q,c=n
解答:
from Crypto.Util.number import *
import gmpy2
sum_pq = 0x1232fecb92adead91613e7d9ae5e36fe6bb765317d6ed38ad890b4073539a6231a6620584cea5730b5af83a3e80cf30141282c97be4400e33307573af6b25e2ea
# n=(p+1)*(q+1)-(p+q)-1
n = 0x5248becef1d925d45705a7302700d6a0ffe5877fddf9451a9c1181c4d82365806085fd86fbaab08b6fc66a967b2566d743c626547203b34ea3fdb1bc06dd3bb765fd8b919e3bd2cb15bc175c9498f9d9a0e216c2dde64d81255fa4c05a1ee619fc1fc505285a239e7bc655ec6605d9693078b800ee80931a7a0c84f33c851740-0x1232fecb92adead91613e7d9ae5e36fe6bb765317d6ed38ad890b4073539a6231a6620584cea5730b5af83a3e80cf30141282c97be4400e33307573af6b25e2ea-1
print("n:", n)
#n: 57781903220726608495841176404144399752917062064507427196457877637670900336948551690361309554998254116151157399251452194844720219023732542692019705315125895750034030052835547472397685327838976088928408560337016632351666472475413414704943529721199894711361841006444372063562252312744949278332373569559097979989
# 计算(p+q)^2-4n
discriminant = sum_pq**2 - 4*n
# 计算根的判别式
sqrt_discriminant = gmpy2.isqrt(discriminant)
# 计算p和q
p = (sum_pq + sqrt_discriminant) // 2
q = (sum_pq - sqrt_discriminant) // 2
print("p:", p)
print("q:", q)
#p: 8228801334907462855397256098699556584084854642543205682719705217859576250443629616812386484797164506834582095674143447181804355696220642775619711451990971
#q: 7021910101974335245794950722131367118195509913680915814438898999848788125908122655583911434165700354149914056221915541094395668546921268189522005629523759
# 计算私钥d
e = 0xe6b1bee47bd63f615c7d0a43c529d219
c = 0x21bfef2961c512fbb81fd75ca1c38cbc810dee21d04de1e749c9a24cc975447acc1098228108f25a5ab4840212b2c0f305aabb17ee6835599425ffeedb85698ff9edbc70d9e87acd5232526304948f806c0283776d3eb217599e06616a12d899b14723bfeb29becb10e464247760f828463eb4f0536244771c648b6445fab855
phi = (p-1)*(q-1)
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
#flag{Aurora_CAL}