Fork of the official github repository of the framework Leaky-LWE-Estimator, a Sage Toolkit to attack and estimate the hardness of LWE with Side Information. https://github.com/lducas/leaky-LWE-Estimator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

prediction_verifications.sage 5.1KB

  1. from multiprocessing import Pool
  2. from map_drop import map_drop
  3. from numpy.random import seed as np_seed
  4. load("../framework/instance_gen.sage")
  5. Derr = build_centered_binomial_law(6)
  6. modulus = 11
  7. saving_results = True
  8. try:
  9. N_tests = int(sys.argv[1])
  10. threads = int(sys.argv[2])
  11. except:
  12. N_tests = 5
  13. threads = 1
  14. def v(i):
  15. return canonical_vec(d, i)
  16. qvec_donttouch = 20
  17. def randv():
  18. vv = v(randint(qvec_donttouch, d - 1))
  19. vv -= v(randint(qvec_donttouch, d - 1))
  20. vv += v(randint(qvec_donttouch, d - 1))
  21. vv -= v(randint(qvec_donttouch, d - 1))
  22. vv += v(randint(qvec_donttouch, d - 1))
  23. return vv
  24. def one_experiment(id, aargs):
  25. (N_hints, T_hints) = aargs
  26. mu, variance = average_variance(Derr)
  27. set_random_seed(id)
  28. np_seed(seed=id)
  29. A, b, dbdd = initialize_from_LWE_instance(DBDD, n, q,
  30. m, D_e, D_s,
  31. verbosity=0)
  32. A, b, dbdd_p = initialize_from_LWE_instance(DBDD_predict,
  33. n, q, m, D_e,
  34. D_s,
  35. verbosity=0)
  36. for j in range(N_hints):
  37. vv = randv()
  38. print(vv)
  39. if T_hints == "Perfect":
  40. dbdd.integrate_perfect_hint(vv, dbdd.leak(vv), estimate=False)
  41. dbdd_p.integrate_perfect_hint(vv, dbdd_p.leak(vv), estimate=False)
  42. if T_hints == "Approx":
  43. dbdd.integrate_approx_hint(vv, dbdd.leak(vv) +
  44. draw_from_distribution(Derr),
  45. variance, estimate=False)
  46. dbdd_p.integrate_approx_hint(vv, dbdd_p.leak(vv) +
  47. draw_from_distribution(Derr),
  48. variance, estimate=False)
  49. if T_hints == "Modular":
  50. dbdd.integrate_modular_hint(vv, dbdd.leak(vv) % modulus,
  51. modulus, smooth=True, estimate=False)
  52. dbdd_p.integrate_modular_hint(vv, dbdd_p.leak(vv) % modulus,
  53. modulus, smooth=True, estimate=False)
  54. if T_hints == "Q-Modular":
  55. dbdd.integrate_q_modular_hint(vv, dbdd.leak(vv) % q,
  56. q, estimate=False)
  57. dbdd_p.integrate_q_modular_hint(vv, dbdd_p.leak(vv) % q,
  58. q, estimate=False)
  59. dbdd_p.integrate_q_vectors(q, indices=range(20))
  60. dbdd.integrate_q_vectors(q, indices=range(20))
  61. beta_pred_light, _ = dbdd_p.estimate_attack(probabilistic=True)
  62. beta_pred_full, _ = dbdd.estimate_attack(probabilistic=True)
  63. beta, _ = dbdd.attack()
  64. return (beta, beta_pred_full, beta_pred_light)
  65. dic = {" ": None}
  66. def get_stats(data, N_tests):
  67. avg = RR(sum(data)) / N_tests
  68. var = abs(RR(sum([r**2 for r in data])) / N_tests - avg**2)
  69. return (avg, var)
  70. def validation_prediction(N_tests, N_hints, T_hints):
  71. # Estimation
  72. import datetime
  73. ttt = datetime.datetime.now()
  74. res = map_drop(N_tests, threads, one_experiment, (N_hints, T_hints))
  75. beta_real, vbeta_real = get_stats([r[0] for r in res], N_tests)
  76. beta_pred_full, vbeta_pred_full = get_stats([r[1] for r in res], N_tests)
  77. beta_pred_light, vbeta_pred_light = get_stats([r[2] for r in res], N_tests)
  78. print("%d,\t %.3f,\t %.3f,\t %.3f \t\t" %
  79. (N_hints, beta_real, beta_pred_full, beta_pred_light), end=" \t")
  80. print("Time:", datetime.datetime.now() - ttt)
  81. if saving_results:
  82. with open('results.csv', 'a') as _file:
  83. _file.write(f'{T_hints};{N_hints};{N_tests};{datetime.datetime.now() - ttt};')
  84. _file.write(f'{beta_real};{beta_pred_full};{beta_pred_light};')
  85. _file.write(f'{vbeta_real};{vbeta_pred_full};{vbeta_pred_light};')
  86. _file.write(f'\n')
  87. return beta_pred_full
  88. logging("Number of threads : %d" % threads, style="DATA")
  89. logging("Number of Samples : %d" % N_tests, style="DATA")
  90. logging(" Validation tests ", style="HEADER")
  91. n = 70
  92. m = n
  93. q = 3301
  94. D_s = build_centered_binomial_law(40)
  95. D_e = build_centered_binomial_law(40)
  96. d = m + n
  97. print("\n \n None")
  98. print("hints,\t real,\t pred_full, \t pred_light,")
  99. beta_pred = validation_prediction(N_tests, 0, "None")
  100. print("\n \n Perfect")
  101. print("hints,\t real,\t pred_full, \t pred_light,")
  102. for h in range(1, 100):
  103. beta_pred = validation_prediction(N_tests, h, "Perfect") # Line 0
  104. if beta_pred < 3:
  105. break
  106. print("\n \n Modular")
  107. print("hints,\t real,\t pred_full, \t pred_light,")
  108. for h in range(2, 200, 2):
  109. beta_pred = validation_prediction(N_tests, h, "Modular") # Line 0
  110. if beta_pred < 3:
  111. break
  112. print("\n \n Q-Modular")
  113. print("hints,\t real,\t pred_full, \t pred_light,")
  114. for h in range(1, 100):
  115. beta_pred = validation_prediction(N_tests, h, "Q-Modular") # Line 0
  116. if beta_pred < 3:
  117. break
  118. print("\n \n Approx")
  119. print("hints,\t real,\t pred_full, \t pred_light,")
  120. for h in range(4, 200, 4):
  121. beta_pred = validation_prediction(N_tests, h, "Approx") # Line 0
  122. if beta_pred < 3:
  123. break