Skip to main content Link Search Menu Expand Document (external link)

Oak Land

Catégorie: medium

Points: 122

Résolutions: 122

Énoncé

from Crypto.Util.number import *
from flag import flag

p = 7389313481223384214994762619823300589978423075857540712007981373887018860174846208000957230283669342186460652521580595183523706412588695116906905718440770776239313669678685198683933547601793742596023475603667
e = 31337
f = 7236042467316654159796543399639966340258093274047941788600980451877044636122969830708918356119442228154447395855689559447196348683125675305629837437591088260218138895919514078948650757100432223219969122629790
g = 1878626136321051642174045874618248475160620873585704351202865003185878331837410979441756843820270907300810543618813757245154196050399357659526631164136221434463496532263979506870318259276669412698827040743576

x = bytes_to_long(flag.encode('utf-8'))
assert x < p
c = (110 * pow(e, x, p) + 313 * pow(f, x, p) + 114 * pow(g, x, p)) % p
print(f'c = {c}')
# c = 871346503375040565701864845493751233877009611275883500035764036792906970084258238763963152627486758242101207127598485219754255161617890137664012548226251138485059295263306930653899766537171223837761341914356

Analyse

Cherchons des propriétés particuliers de l’entier p

sage: is_prime(p)
True
sage: factor(p-1)
2 * 136327 * 164341 * 169937^4 * 313351^4 * 321427^4 * 323377^4 * 356887^4 * 413783 * 519733^3 * 792413^4 * 860077^4 * 906289 * 976501^2

L’entier p est premier et puisque p-1 est lisse, on sait que le logarithme discret se calcule se manière très rapide modulo p.

Calculons quelques logarithmes discrets:

sage: Zmod(p)(f).log(e)
7389313481223384214994762619823300589978423075857540712007981373887018860174846208000957230283669342186460652521580595183523706412588695116906905718440770776239313669678685198683933547601793742596023475603665
sage: Zmod(p)(g).log(e)
7389313481223384214994762619823300589978423075857540712007981373887018860174846208000957230283669342186460652521580595183523706412588695116906905718440770776239313669678685198683933547601793742596023475603664

On constate que log(f) == log(g)+1 et même que log(f) == p-2. On en déduit que f = 1/e et g = 1/e² modulo p.

Ainsi si on note X = pow(e, x, p) on a l’équation (modulo p) 110 X + 313 / X + 114 / X² = c

Solution

On calcule les racines du polynôme avec SAGE:

sage: f = 110 * x^3 + 313 * x + 114 - c * x^2

sage: f.roots(Zmod(p))
[(6621736714803975486469770941631918297557515256645141403866696899656801529069492623812629032566382224631133756513615225604518504150834965984951182186972792703483282014259169249309903503054330793332575590535531,
  1)]

sage: r = 6621736714803975486469770941631918297557515256645141403866696899656801529069492623812629032566382224631133756513615225604518504150834965984951182186972792703483282014259169249309903503054330793332575590535531

sage: Zmod(p)(r).log(31337)
130669746807581038734209381694055163726297497321549047017439654852953086676029610991997

sage: int(130669746807581038734209381694055163726297497321549047017439654852953086676029610991997).to_bytes(64, "big")
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00CCTF{V33333rY_eeeeZy_DLP_cH41L3n9E!}'