from multiprocessing import Pool from map_drop import map_drop from numpy.random import seed as np_seed load("../framework/instance_gen.sage") Derr = build_centered_binomial_law(6) modulus = 11 saving_results = True results_filename = "results.csv" 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 = 20 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 qrandv(): vv = randint(1, q-1) * v(randint(qvec_donttouch, d - 1)) vv -= randint(1, q-1) * v(randint(qvec_donttouch, d - 1)) vv += randint(1, q-1) * v(randint(qvec_donttouch, d - 1)) vv -= randint(1, q-1) * v(randint(qvec_donttouch, d - 1)) vv += randint(1, q-1) * 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, dbdd = initialize_from_LWE_instance(DBDD, n, q, m, D_e, D_s, verbosity=0) A, b, dbdd_p = initialize_from_LWE_instance(DBDD_predict, n, q, m, D_e, D_s, verbosity=0) for j in range(N_hints): vv = randv() if T_hints == "Perfect": dbdd.integrate_perfect_hint(vv, dbdd.leak(vv), estimate=False) dbdd_p.integrate_perfect_hint(vv, dbdd_p.leak(vv), estimate=False) if T_hints == "Approx": dbdd.integrate_approx_hint(vv, dbdd.leak(vv) + draw_from_distribution(Derr), variance, estimate=False) dbdd_p.integrate_approx_hint(vv, dbdd_p.leak(vv) + draw_from_distribution(Derr), variance, estimate=False) if T_hints == "Modular": dbdd.integrate_modular_hint(vv, dbdd.leak(vv) % modulus, modulus, smooth=True, estimate=False) dbdd_p.integrate_modular_hint(vv, dbdd_p.leak(vv) % modulus, modulus, smooth=True, estimate=False) if T_hints == "Q-Modular": vv = qrandv() dbdd.integrate_q_modular_hint(vv, dbdd.leak(vv) % q, q, estimate=False) dbdd_p.integrate_q_modular_hint(vv, dbdd_p.leak(vv) % q, q, estimate=False) dbdd_p.integrate_q_vectors(q, indices=range(20)) dbdd.integrate_q_vectors(q, indices=range(20)) beta_pred_light, _ = dbdd_p.estimate_attack(probabilistic=True) beta_pred_full, _ = dbdd.estimate_attack(probabilistic=True) beta, _ = dbdd.attack() return (beta, beta_pred_full, beta_pred_light) dic = {" ": None} def get_stats(data, N_tests): avg = RR(sum(data)) / N_tests var = abs(RR(sum([r**2 for r in data])) / N_tests - avg**2) return (avg, var) def save_results(*args): with open(results_filename, 'a') as _file: _file.write(';'.join([str(arg) for arg in args])+'\n') 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, vbeta_real = get_stats([r[0] for r in res], N_tests) beta_pred_full, vbeta_pred_full = get_stats([r[1] for r in res], N_tests) beta_pred_light, vbeta_pred_light = get_stats([r[2] for r in res], N_tests) print("%d,\t %.3f,\t %.3f,\t %.3f \t\t" % (N_hints, beta_real, beta_pred_full, beta_pred_light), end=" \t") print("Time:", datetime.datetime.now() - ttt) if saving_results: save_results( T_hints, N_hints, N_tests, datetime.datetime.now() - ttt, beta_real, beta_pred_full, beta_pred_light, vbeta_real, vbeta_pred_full, vbeta_pred_light, ) 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") for T_hints in ["Perfect", "Modular", "Q-Modular", "Approx"]: hint_range = None if T_hints == "Perfect": hint_range = range(1, 100) elif T_hints == "Modular": hint_range = range(2, 200, 2) elif T_hints == "Q-Modular": hint_range = range(1, 100) elif T_hints == "Approx": hint_range = range(4, 200, 4) print(f"\n \n {T_hints}") print("hints,\t real,\t pred_full, \t pred_light,") for h in hint_range: beta_pred = validation_prediction(N_tests, h, T_hints) # Line 0 if beta_pred < 3: break