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

time_verifications.sage 5.0KB

  1. from multiprocessing import Pool
  2. from map_drop import map_drop
  3. from numpy.random import seed as np_seed
  4. import time
  5. load("../framework/instance_gen.sage")
  6. Derr = build_centered_binomial_law(6)
  7. modulus = 11
  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 = 35
  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, dbdd1 = initialize_from_LWE_instance(DBDD, n, q,
  30. m, D_e, D_s,
  31. verbosity=0)
  32. A, b, dbdd2 = initialize_from_LWE_instance(DBDD,
  33. n, q, m, D_e,
  34. D_s,
  35. verbosity=0)
  36. dbdd1._keep_basis = False
  37. dbdd2._keep_basis = True
  38. dbdd1_time = 0.
  39. dbdd2_time = 0.
  40. for j in range(N_hints):
  41. vv = randv()
  42. ##print(vv)
  43. if T_hints == "Perfect":
  44. start_time = time.time()
  45. dbdd1.integrate_perfect_hint(vv, dbdd1.leak(vv), estimate=False)
  46. middle_time = time.time()
  47. dbdd2.integrate_perfect_hint(vv, dbdd2.leak(vv), estimate=False)
  48. end_time = time.time()
  49. if T_hints == "Approx":
  50. start_time = time.time()
  51. dbdd1.integrate_approx_hint(vv, dbdd1.leak(vv) +
  52. draw_from_distribution(Derr),
  53. variance, estimate=False)
  54. middle_time = time.time()
  55. dbdd2.integrate_approx_hint(vv, dbdd2.leak(vv) +
  56. draw_from_distribution(Derr),
  57. variance, estimate=False)
  58. end_time = time.time()
  59. if T_hints == "Modular":
  60. start_time = time.time()
  61. dbdd1.integrate_modular_hint(vv, dbdd1.leak(vv) % modulus,
  62. modulus, smooth=True, estimate=False)
  63. middle_time = time.time()
  64. dbdd2.integrate_modular_hint(vv, dbdd2.leak(vv) % modulus,
  65. modulus, smooth=True, estimate=False)
  66. end_time = time.time()
  67. dbdd1_time += middle_time - start_time
  68. dbdd2_time += end_time - middle_time
  69. print('q-vectors')
  70. start_time = time.time()
  71. dbdd1.integrate_q_vectors(q, indices=range(35))
  72. beta_pred_1, _ = dbdd1.estimate_attack(probabilistic=True)
  73. beta1, _ = dbdd1.attack()
  74. middle_time = time.time()
  75. dbdd2.integrate_q_vectors(q, indices=range(35))
  76. beta_pred_2, _ = dbdd2.estimate_attack(probabilistic=True)
  77. beta2, _ = dbdd2.attack()
  78. end_time = time.time()
  79. dbdd1_time += middle_time - start_time
  80. dbdd2_time += end_time - middle_time
  81. return (beta, beta1, beta2, dbdd1_time, dbdd2_time)
  82. dic = {" ": None}
  83. def validation_prediction(N_tests, N_hints, T_hints):
  84. # Estimation
  85. import datetime
  86. ttt = datetime.datetime.now()
  87. res = map_drop(N_tests, threads, one_experiment, (N_hints, T_hints))
  88. beta_real = RR(sum([r[0] for r in res])) / N_tests
  89. beta_pred_full = RR(sum([r[1] for r in res])) / N_tests
  90. beta_pred_light = RR(sum([r[2] for r in res])) / N_tests
  91. dbdd1_time = RR(sum([r[3] for r in res])) / N_tests
  92. dbdd2_time = RR(sum([r[4] for r in res])) / N_tests
  93. print("%d,\t %.3f,\t %.3f,\t %.3f,\t %.3f,\t %.3f \t\t" %
  94. (N_hints, beta_real, beta_pred_full, beta_pred_light, dbdd1_time, dbdd2_time), end=" \t")
  95. print("Time:", datetime.datetime.now() - ttt)
  96. return beta_pred_full
  97. logging("Number of threads : %d" % threads, style="DATA")
  98. logging("Number of Samples : %d" % N_tests, style="DATA")
  99. logging(" Validation tests ", style="HEADER")
  100. n = 70
  101. m = n
  102. q = 3301
  103. D_s = build_centered_binomial_law(40)
  104. D_e = build_centered_binomial_law(40)
  105. d = m + n
  106. #print("\n \n None")
  107. #print("hints,\t real,\t pred_full, \t pred_light,")
  108. #beta_pred = validation_prediction(N_tests, 0, "None")
  109. print("\n \n Perfect")
  110. print("hints,\t real,\t pred_full, \t pred_light,")
  111. for h in range(2, 100):
  112. beta_pred = validation_prediction(N_tests, h, "Perfect") # Line 0
  113. if beta_pred < 3:
  114. break
  115. print("\n \n Modular")
  116. print("hints,\t real,\t pred_full, \t pred_light,")
  117. for h in range(2, 200, 2):
  118. beta_pred = validation_prediction(N_tests, h, "Modular") # Line 0
  119. if beta_pred < 3:
  120. break
  121. print("\n \n Approx")
  122. print("hints,\t real,\t pred_full, \t pred_light,")
  123. for h in range(4, 200, 4):
  124. beta_pred = validation_prediction(N_tests, h, "Approx") # Line 0
  125. if beta_pred < 3:
  126. break