羊城杯 2024 - TheoremPlus
题目内容:
相信这里的Theorem你也能知道^V^
题目分值:
已答出0次,初始分值500.0,当前分值500.0,解出分值500.0
题目难度:
中等
from Crypto.Util.number import *
from gmpy2 import *
from secret import flag
def decode_e(e):
if e > 1:
mul = 1
for i in range(1, e):
mul *= i
if e - mul % e - 1 == 0:
mulmod = mul % e - e
else:
mulmod = mul % e
return mulmod + decode_e(e - 1)
else:
return 0
q = getPrime(1024)
p = next_prime(q)
n = p * q
phi = (p - 1) * (q - 1)
e = abs(decode_e(703440151))
c = pow(bytes_to_long(flag), e, n)
print('n = {}\n'
'c = {}'.format(n, c))
'''
n = 18770575776346636857117989716700159556553308603827318013591587255198383129370907809760732011993542700529211200756354110539398800399971400004000898098091275284235225898698802555566416862975758535452624647017057286675078425814784682675012671384340267087604803050995107534481069279281213277371234272710195280647747033302773076094600917583038429969629948198841325080329081838681126456119415461246986745162687569680825296434756908111148165787768172000131704615314046005916223370429567142992192702888820837032850104701948658736010527261246199512595520995042205818856177310544178940343722756848658912946025299687434514029951
c = 2587907790257921446754254335909686808394701314827194535473852919883847207482301560195700622542784316421967768148156146355099210400053281966782598551680260513547233270646414440776109941248869185612357797869860293880114609649325409637239631730174236109860697072051436591823617268725493768867776466173052640366393488873505207198770497373345116165334779381031712832136682178364090547875479645094274237460342318587832274304777193468833278816459344132231018703578274192000016560653148923056635076144189403004763127515475672112627790796376564776321840115465990308933303392198690356639928538984862967102082126458529748355566
'''
起手式:分解整数n,这个不难
分析decode_e
def decode_e(e):
if e > 1:
mul = 1
for i in range(1, e):
mul *= i
# mul = (e-1)!
# e is prime <--> (e-1)!=-1 % e
# Wilson theorem
if e - mul % e - 1 == 0:
mulmod = mul % e - e
# mulmod = -1
else:
mulmod = mul % e
# mulmod = ?
return mulmod + decode_e(e - 1)
else:
return 0
这个函数一般来说计算会很慢,根据数论定理,将其简化,然后加速计算
整点简单数据测试一下。
from sage.all import *
from Crypto.Util.number import *
p = 137005750887861042579675520137044512945598822783534629619239107541807615882572096858257909592145785126427095471870315367525847725823941391135851384962433640952546093687945848986528958373691860995753297871619638780075391669495117388905134584566094832853663864356912013900594295175075123578366393694884648557429
q = 137005750887861042579675520137044512945598822783534629619239107541807615882572096858257909592145785126427095471870315367525847725823941391135851384962433640952546093687945848986528958373691860995753297871619638780075391669495117388905134584566094832853663864356912013900594295175075123578366393694884648557219
phi = (p-1)*(q-1)
n = p*q
c = 2587907790257921446754254335909686808394701314827194535473852919883847207482301560195700622542784316421967768148156146355099210400053281966782598551680260513547233270646414440776109941248869185612357797869860293880114609649325409637239631730174236109860697072051436591823617268725493768867776466173052640366393488873505207198770497373345116165334779381031712832136682178364090547875479645094274237460342318587832274304777193468833278816459344132231018703578274192000016560653148923056635076144189403004763127515475672112627790796376564776321840115465990308933303392198690356639928538984862967102082126458529748355566
fake_e = 703440151
for i in range(-10,10,1):
e = 36421874 + i
try:
d = inverse_mod(e,phi)
print(long_to_bytes(pow(c,d,n)))
except:
continue
对于这个函数,递归进行,现在已知decode(e1)的值,计算decode(e1+1),
若e1+1为素数,则mulmod = -1,恒定减去-1
若e1+1为合数,则mulmod = 0(除去一个个例)e1+1=4时,mulmod非零
小范围实验,然后直接猜。ok
(n-1)!equiv 0pmod{n},quad n>4