#!/usr/bin/python #encoding:utf8 import random import sys from binascii import hexlify, unhexlify def GF2_add(p1, p2): assert(p1>=0 and p2>=0) return p1 ^ p2 def GF2_mod(p, mod): assert(p>=0 and mod>0) while p.bit_length() >= mod.bit_length(): mask = mod << (p.bit_length() - mod.bit_length()) p ^= mask return p def GF2_mul_mod(p1, p2, mod): assert(p1>=0 and p2>=0 and mod>0) r=0 while p2: if p2 & 1: r ^= p1 p2 >>= 1 p1 = GF2_mod(p1<<1, mod) return r def GF2_pow_mod(b, e, mod): assert(b>=0 and e>=0 and mod>0) r=1 while e: if e&1: r = GF2_mul_mod(r, b, mod) e >>= 1 b = GF2_mul_mod(b,b,mod) return r if __name__=="__main__": if len(sys.argv)!=2: print ("Usage: {0} exposant_privé".format(sys.argv[0])) sys.exit(1) D = int(sys.argv[1],0) N = 231002291543555016818569199325004102033150445385414455365880736176436715311790663130589862191084808106664722172105531887027184495017140783502576089624623090612010946552911266876786591303954740526520748757324542859056473246482362113968367791176213289397973534046005478174177408900797351038135732809112135056071 #à refaire avec E=3 ou 65537 (plus logique, même si cette version est solvable) E = 65533 test_plain = random.randrange(2**1024) test_crypt = GF2_pow_mod(test_plain, E, N) if GF2_pow_mod(test_crypt, D, N)==test_plain: flag = 3084449846433041813390375663058703285782448134840024007803494551180465048150640197025779798034586128810372902144370282944067512576975973977099499869946999914888177281161149730177343199310024653678751046701545038089863997906852127878655263416175563754210990106963126850755139552152622891343746619023468031658 flag = GF2_pow_mod(flag,D,N) flag = unhexlify(hex(flag)[2:].strip("L").zfill(256)).decode() flag = flag[:ord(flag[-1])] print (flag) else: print ("Non.")