4p-1method

题目:

from Crypto.Util.number import isPrime
from secret import flag
import random

m = int.from_bytes(flag)

def getMyPrime(nbits, d):
    print(d)
    s = random.getrandbits(nbits)
    p = d * s**2 + 1
    while p % 4 or not isPrime(p // 4):
        s = random.getrandbits(nbits)
        p = d * s**2 + 1
    return p // 4

D = [19, 27, 35, 43, 67, 163]

p, q, r = map(lambda d: getMyPrime(512, d), random.choices(D, k=3))

n = p * q * r
enc = pow(m, 0x10001, n)

print(f"n = {n}")
print(f"c = {enc}")
'''
n = 23905475512365883122674408238955539155764722366217012545397874540862337334240016295800125839666379728072321165937705962913280606073090970895142797828890967895964711232778350747246145437063213797431406035930174111043042340520332940609525581739023092298039562772423262765827124701021969335352335683792731683921665507741401586702876932709526723050390599457874833474203654573826450071697539641600322677144352938390876652392608502272076553363040364616750658572691385895505437242478151873823349763431066100830530865683577851333177933883559685556857237139613218194081446956323024853443261620884805303981306446372802015044771639426999749528610475388861786694864415139994859276371131942573350304814695091460001587702769577342755316734174332921026422723617077752187651429392825613071820790930071213362634211053716954311368831862903499625111683201402526987572026698743470957191372997973386719129801283901357299485943586220652418988756989
enc = 20290124145262596131171262098400968763029234061511934834222170323336352789493462981125252905144849253567410785045251291281965974162517541092753592621976991536420386296008923067690131499917309230770425673361420526278705677868350261448920451435130093572132312421788350025260541205230414987558889506859141578553149107724691009183251887162853495222266814426521607565821520571300280892509216229126792313714540405688099386257359428381050142559724638272785150430571010230291579795372462576424848672863369953788642729601376423815467431808384249324317160756723240875922680353619529182039048235291664132823541196629191203977620809650328092884416626985657394934834405937347004155818332568478234548850387649090494274601825700088378489565113317791020951975667943227729845304723849530630874343911522720043521661229624936713672517051272032637783376281256972132726759806237600969520741491040216491707848210629024308070724592683363625778406304
'''

解题思路:

  • 对使用一类特定素数乘积的模数的分解
  • 当一类特殊的素数用在RSA模数中时,可以轻易的将该素数从n中分解出来
  • 由于这一类素数都形如4p−1=Ds<sup>2</sup>,因此又被称为<font style="background-color:rgb(238, 238, 238);">4p-1 method</font>;此外,有些人也会将其视为RSA的后门之一,称之为<font style="background-color:rgb(238, 238, 238);">RSA backdoor</font>

解答:

import sys

sys.setrecursionlimit(10^6)

def QiCheng(n):
	R = Integers(n)
	attempts = 20
	js = [0, (-2^5)^3, (-2^5*3)^3, (-2^5*3*5)^3, (-2^5*3*5*11)^3, (-2^6*3*5*23*29)^3]

	for _ in range(attempts):
		for j in js:
			if j == 0:
				a = R.random_element()
				E = EllipticCurve([0, a])

			else:
				a = R(j)/(R(1728)-R(j))
				c = R.random_element()
				E = EllipticCurve([3*a*c^2, 2*a*c^3])

			x = R.random_element()
			z = E.division_polynomial(n, x)
			g = gcd(z, n)
			if g > 1:
				return g

n = 23905475512365883122674408238955539155764722366217012545397874540862337334240016295800125839666379728072321165937705962913280606073090970895142797828890967895964711232778350747246145437063213797431406035930174111043042340520332940609525581739023092298039562772423262765827124701021969335352335683792731683921665507741401586702876932709526723050390599457874833474203654573826450071697539641600322677144352938390876652392608502272076553363040364616750658572691385895505437242478151873823349763431066100830530865683577851333177933883559685556857237139613218194081446956323024853443261620884805303981306446372802015044771639426999749528610475388861786694864415139994859276371131942573350304814695091460001587702769577342755316734174332921026422723617077752187651429392825613071820790930071213362634211053716954311368831862903499625111683201402526987572026698743470957191372997973386719129801283901357299485943586220652418988756989
p = int(QiCheng(Integer(n)))
print(p)
#723901928644186201342703732594391085548438498872269149746901332095104745189403493232856390180094004927327104289636748833086956950268682679283512606217153601630625459749180509253037733679430394386030275831839257462397768398163295719116033072007814742752635761186421272534707859208071641667656506415649759756277
#37704101679522396366371077579161828401413630537914110535033075800496762660694015579974111994017395648637167389050791220459449856274508725370455442637046958455027430579738850536891447450823721122044298612348073802350003434349164592954082802437918012424021535091441573061046186157140144051487895110657791513007
#875848630401440232754771004784163763169385369731000778829344491185916531236328597247726016292147923120128234805850298810041600995027986216918299682082286547698371769318799684522889002387645022998515773204709877758277999300236842038510300341626350562493918639145662264468171785325851985674692381470911080030951

n是由三个大素数相乘得到,运行脚本后会得到其中一个素数,将n除以得到的素数就是剩下两个素数的积,再次套用那个脚本即可再分解出一个素数,也就分解完了

from Crypto.Util.number import *

p = 723901928644186201342703732594391085548438498872269149746901332095104745189403493232856390180094004927327104289636748833086956950268682679283512606217153601630625459749180509253037733679430394386030275831839257462397768398163295719116033072007814742752635761186421272534707859208071641667656506415649759756277
q = 37704101679522396366371077579161828401413630537914110535033075800496762660694015579974111994017395648637167389050791220459449856274508725370455442637046958455027430579738850536891447450823721122044298612348073802350003434349164592954082802437918012424021535091441573061046186157140144051487895110657791513007
r = 875848630401440232754771004784163763169385369731000778829344491185916531236328597247726016292147923120128234805850298810041600995027986216918299682082286547698371769318799684522889002387645022998515773204709877758277999300236842038510300341626350562493918639145662264468171785325851985674692381470911080030951
e = 65537
c = 20290124145262596131171262098400968763029234061511934834222170323336352789493462981125252905144849253567410785045251291281965974162517541092753592621976991536420386296008923067690131499917309230770425673361420526278705677868350261448920451435130093572132312421788350025260541205230414987558889506859141578553149107724691009183251887162853495222266814426521607565821520571300280892509216229126792313714540405688099386257359428381050142559724638272785150430571010230291579795372462576424848672863369953788642729601376423815467431808384249324317160756723240875922680353619529182039048235291664132823541196629191203977620809650328092884416626985657394934834405937347004155818332568478234548850387649090494274601825700088378489565113317791020951975667943227729845304723849530630874343911522720043521661229624936713672517051272032637783376281256972132726759806237600969520741491040216491707848210629024308070724592683363625778406304
n = 23905475512365883122674408238955539155764722366217012545397874540862337334240016295800125839666379728072321165937705962913280606073090970895142797828890967895964711232778350747246145437063213797431406035930174111043042340520332940609525581739023092298039562772423262765827124701021969335352335683792731683921665507741401586702876932709526723050390599457874833474203654573826450071697539641600322677144352938390876652392608502272076553363040364616750658572691385895505437242478151873823349763431066100830530865683577851333177933883559685556857237139613218194081446956323024853443261620884805303981306446372802015044771639426999749528610475388861786694864415139994859276371131942573350304814695091460001587702769577342755316734174332921026422723617077752187651429392825613071820790930071213362634211053716954311368831862903499625111683201402526987572026698743470957191372997973386719129801283901357299485943586220652418988756989
phi = (p-1)*(q-1)*(r-1)
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
#flag{5c5ef02c-0c50-44d3-9e46-49fa6b4801ab}
posted @ 2025-03-11 22:04  sevensnight  阅读(62)  评论(0)    收藏  举报