|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- from multiprocessing import Pool
- from map_drop import map_drop
- from numpy.random import seed as np_seed
- import time
- load("../framework/instance_gen.sage")
-
- Derr = build_centered_binomial_law(6)
- modulus = 11
-
- try:
- N_tests = int(sys.argv[1])
- threads = int(sys.argv[2])
- except:
- N_tests = 5
- threads = 1
-
-
- def v(i):
- return canonical_vec(d, i)
-
-
- qvec_donttouch = 35
-
-
- def randv():
- vv = v(randint(qvec_donttouch, d - 1))
- vv -= v(randint(qvec_donttouch, d - 1))
- vv += v(randint(qvec_donttouch, d - 1))
- vv -= v(randint(qvec_donttouch, d - 1))
- vv += v(randint(qvec_donttouch, d - 1))
- return vv
-
-
- def one_experiment(id, aargs):
- (N_hints, T_hints) = aargs
- mu, variance = average_variance(Derr)
- set_random_seed(id)
- np_seed(seed=id)
- A, b, dbdd1 = initialize_from_LWE_instance(DBDD, n, q,
- m, D_e, D_s,
- verbosity=0)
- A, b, dbdd2 = initialize_from_LWE_instance(DBDD,
- n, q, m, D_e,
- D_s,
- verbosity=0)
-
- dbdd1._keep_basis = False
- dbdd2._keep_basis = True
-
- dbdd1_time = 0.
- dbdd2_time = 0.
-
- for j in range(N_hints):
- vv = randv()
- ##print(vv)
- if T_hints == "Perfect":
- start_time = time.time()
- dbdd1.integrate_perfect_hint(vv, dbdd1.leak(vv), estimate=False)
- middle_time = time.time()
- dbdd2.integrate_perfect_hint(vv, dbdd2.leak(vv), estimate=False)
- end_time = time.time()
- if T_hints == "Approx":
- start_time = time.time()
- dbdd1.integrate_approx_hint(vv, dbdd1.leak(vv) +
- draw_from_distribution(Derr),
- variance, estimate=False)
- middle_time = time.time()
- dbdd2.integrate_approx_hint(vv, dbdd2.leak(vv) +
- draw_from_distribution(Derr),
- variance, estimate=False)
- end_time = time.time()
- if T_hints == "Modular":
- start_time = time.time()
- dbdd1.integrate_modular_hint(vv, dbdd1.leak(vv) % modulus,
- modulus, smooth=True, estimate=False)
- middle_time = time.time()
- dbdd2.integrate_modular_hint(vv, dbdd2.leak(vv) % modulus,
- modulus, smooth=True, estimate=False)
- end_time = time.time()
-
- dbdd1_time += middle_time - start_time
- dbdd2_time += end_time - middle_time
-
- print('q-vectors')
- start_time = time.time()
- dbdd1.integrate_q_vectors(q, indices=range(35))
- beta_pred_1, _ = dbdd1.estimate_attack(probabilistic=True)
- beta1, _ = dbdd1.attack()
-
- middle_time = time.time()
- dbdd2.integrate_q_vectors(q, indices=range(35))
- beta_pred_2, _ = dbdd2.estimate_attack(probabilistic=True)
- beta2, _ = dbdd2.attack()
-
- end_time = time.time()
- dbdd1_time += middle_time - start_time
- dbdd2_time += end_time - middle_time
-
- return (beta, beta1, beta2, dbdd1_time, dbdd2_time)
-
-
- dic = {" ": None}
-
-
- def validation_prediction(N_tests, N_hints, T_hints):
- # Estimation
- import datetime
- ttt = datetime.datetime.now()
- res = map_drop(N_tests, threads, one_experiment, (N_hints, T_hints))
- beta_real = RR(sum([r[0] for r in res])) / N_tests
- beta_pred_full = RR(sum([r[1] for r in res])) / N_tests
- beta_pred_light = RR(sum([r[2] for r in res])) / N_tests
- dbdd1_time = RR(sum([r[3] for r in res])) / N_tests
- dbdd2_time = RR(sum([r[4] for r in res])) / N_tests
-
- print("%d,\t %.3f,\t %.3f,\t %.3f,\t %.3f,\t %.3f \t\t" %
- (N_hints, beta_real, beta_pred_full, beta_pred_light, dbdd1_time, dbdd2_time), end=" \t")
- print("Time:", datetime.datetime.now() - ttt)
- return beta_pred_full
-
-
- logging("Number of threads : %d" % threads, style="DATA")
- logging("Number of Samples : %d" % N_tests, style="DATA")
- logging(" Validation tests ", style="HEADER")
-
- n = 70
- m = n
- q = 3301
- D_s = build_centered_binomial_law(40)
- D_e = build_centered_binomial_law(40)
- d = m + n
-
- #print("\n \n None")
-
- #print("hints,\t real,\t pred_full, \t pred_light,")
-
- #beta_pred = validation_prediction(N_tests, 0, "None")
-
- print("\n \n Perfect")
-
- print("hints,\t real,\t pred_full, \t pred_light,")
- for h in range(2, 100):
- beta_pred = validation_prediction(N_tests, h, "Perfect") # Line 0
- if beta_pred < 3:
- break
-
- print("\n \n Modular")
-
- print("hints,\t real,\t pred_full, \t pred_light,")
- for h in range(2, 200, 2):
- beta_pred = validation_prediction(N_tests, h, "Modular") # Line 0
- if beta_pred < 3:
- break
-
- print("\n \n Approx")
-
- print("hints,\t real,\t pred_full, \t pred_light,")
- for h in range(4, 200, 4):
- beta_pred = validation_prediction(N_tests, h, "Approx") # Line 0
- if beta_pred < 3:
- break
|