1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
   | import numpy as np from Crypto.Util.number import getPrime, inverse, bytes_to_long,long_to_bytes import random import math
  FLAG = b'crypto{?????????????????????}'
 
  def gen_key():     q = getPrime(512)     upper_bound = int(math.sqrt(q // 2))     lower_bound = int(math.sqrt(q // 4))     f = random.randint(2, upper_bound)     while True:         g = random.randint(lower_bound, upper_bound)         if math.gcd(f, g) == 1:             break     h = (inverse(f, q)*g) % q     return (q, h), (f, g)
 
  def encrypt(q, h, m):     assert m < int(math.sqrt(q // 2))     r = random.randint(2, int(math.sqrt(q // 2)))     e = (r*h + m) % q     return e
 
  def decrypt(q, h, f, g, e):     a = (f*e) % q     m = (a*inverse(f, g)) % g     return m
 
  public, private = gen_key() q, h = public f, g = private
  m = bytes_to_long(FLAG) e = encrypt(q, h, m)
  print(f'Public key: {(q,h)}') print(f'Encrypted Flag: {e}') ''' Public key: (7638232120454925879231554234011842347641017888219021175304217358715878636183252433454896490677496516149889316745664606749499241420160898019203925115292257, 2163268902194560093843693572170199707501787797497998463462129592239973581462651622978282637513865274199374452805292639586264791317439029535926401109074800) Encrypted Flag: 5605696495253720664142881956908624307570671858477482119657436163663663844731169035682344974286379049123733356009125671924280312532755241162267269123486523 '''
 
  |