Advertisement
khaotic1

Untitled

Mar 5th, 2025
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.22 KB | None | 0 0
  1. import random
  2.  
  3. def H_oracle(alpha_vec, beta_vec, q, hid_counter):
  4.     """Имитация оракула H."""
  5.     delta = random.randint(1, q - 1)
  6.     hid_counter += 1
  7.     return delta, hid_counter
  8.  
  9. def S_oracle(i, c_i, q, y_values, I_fin):
  10.     """Имитация оракула S."""
  11.     if i in I_fin:
  12.         return None, I_fin
  13.     y_i = random.randint(1, q - 1)
  14.     y_values[i] = y_i
  15.     I_fin.add(i)
  16.     return y_i, I_fin
  17.  
  18. def clever_wros_attack(l, q, q_h_limit):
  19.     """Реализация 'умной' атаки на WFROS v2 с улучшенной коллизией и S-оракулом."""
  20.     J_success = set()
  21.     deltas = {}         # Словарь для хранения delta_j для каждого запроса j
  22.     c_values = {}       # Словарь для хранения c_i
  23.     y_values = {}       # Словарь для хранения y_i
  24.     I_fin = set()       # Множество индексов, для которых вызвался S-оракул
  25.     hid_counter = 0
  26.     vector_pairs = []    # Список пар векторов (alpha, beta)
  27.  
  28.     # --- Фаза 1: Генерация векторов и запросы к H для первых l элементов ---
  29.     for i in range(1, l):
  30.         alpha_vec = [0] * (l + 1)
  31.         beta_vec = [0] * (l + 1)
  32.         alpha_vec[0] = 0
  33.         beta_vec[0] = 0
  34.         alpha_vec[i] = 1
  35.         beta_vec[i] = 1
  36.         vector_pairs.append((alpha_vec, beta_vec))
  37.  
  38.     for index, (alpha_vec, beta_vec) in enumerate(vector_pairs):
  39.         delta_val, hid_counter = H_oracle(alpha_vec, beta_vec, q, hid_counter)
  40.         deltas[hid_counter] = delta_val
  41.         c_i_val = delta_val # c_i = delta_i для первых l векторов
  42.         c_values[index + 1] = c_i_val
  43.  
  44.         # Вызов S-оракула для получения y_i
  45.         s_result_y, I_fin = S_oracle(index + 1, c_i_val, q, y_values, I_fin)
  46.         if s_result_y is None:
  47.             print(f"Ошибка S-оракула для индекса {index + 1}. Атака прервана.") # Очень маловероятно, но на всякий случай
  48.             return None
  49.         print(f"H-запрос {hid_counter}: delta = {delta_val}, c_{index+1} = {c_i_val}, y_{index+1} = {s_result_y}, для векторов alpha[{index+1}], beta[{index+1}]")
  50.         J_success.add(hid_counter)
  51.  
  52.  
  53.     # --- Фаза 2: Поиск коллизии для последнего элемента ---
  54.     alpha_vec_last = [0] * (l + 1)
  55.     beta_vec_last = [0] * (l + 1)
  56.     alpha_vec_last[0] = 0
  57.     beta_vec_last[0] = 0
  58.     alpha_vec_last[l] = 1
  59.     beta_vec_last[l] = 1
  60.  
  61.     last_delta_collision = None
  62.     previous_deltas_for_collision = [] # Список для хранения предыдущих delta для коллизии
  63.     collision_found = False
  64.     collision_query_count = 0
  65.  
  66.     while collision_query_count < q_h_limit and not collision_found: # Ограничение на кол-во запросов для коллизии
  67.         current_delta, hid_counter = H_oracle(alpha_vec_last, beta_vec_last, q, hid_counter)
  68.         collision_query_count += 1
  69.         print(f"H-запрос {hid_counter}: delta = {current_delta} (Поиск коллизии...)")
  70.  
  71.         for prev_delta in previous_deltas_for_collision: # Проверяем коллизию с ЛЮБЫМ предыдущим delta
  72.             if current_delta == prev_delta:
  73.                 last_delta_collision = current_delta
  74.                 collision_found = True
  75.                 J_success.add(l + previous_deltas_for_collision.index(current_delta))
  76.                 J_success.add(hid_counter)
  77.                 print(f"  Коллизия найдена с предыдущим delta = {prev_delta}!")
  78.                 break # Коллизия найдена, выходим из цикла
  79.         if collision_found:
  80.             break # Выход из внешнего цикла, если коллизия найдена
  81.  
  82.         previous_deltas_for_collision.append(current_delta) # Добавляем текущий delta в список предыдущих
  83.  
  84.  
  85.     if not collision_found:
  86.         print(f"Коллизия не найдена за {q_h_limit} запросов. Атака не удалась.")
  87.         return None
  88.  
  89.     deltas[l] = last_delta_collision # Сохраняем последнее delta коллизии
  90.     deltas[l + 1] = last_delta_collision
  91.     c_l_val = last_delta_collision
  92.     c_values[l] = c_l_val # c_{l+1} = delta_collision
  93.  
  94.     # Вызов S-оракула для последнего индекса l+1
  95.     s_result_y_last, I_fin = S_oracle(l + 1, c_l_val, q, y_values, I_fin)
  96.     if s_result_y_last is None:
  97.         print(f"Ошибка S-оракула для индекса {l + 1}. Атака прервана.") # Очень маловероятно, но на всякий случай
  98.         return None
  99.     y_values[l] = s_result_y_last
  100.     print(f"H-запрос {hid_counter}: delta = {last_delta_collision}, c_{l+1} = {c_l_val}, y_{l+1} = {s_result_y_last}, для векторов alpha[{l+1}], beta[{l+1}]")
  101.  
  102.     # --- Фаза 3: Проверка условия A_j = delta_j * B_j для всех l+1 векторов ---
  103.     successful_queries = set()
  104.     all_conditions_met = True
  105.     all_vectors = vector_pairs + [(alpha_vec_last, beta_vec_last)] * (hid_counter - l + 1) # Объединяем все векторы
  106.     for j, j_index in enumerate(J_success):
  107.         #delta_j = deltas[list(deltas.keys())[query_index]] # Получаем delta_j из словаря
  108.  
  109.         A_j = all_vectors[j_index-1][0][0] # Инициализация A_j и B_j с нулевыми элементами
  110.         B_j = all_vectors[j_index-1][1][0]
  111.         for i in range(1, l + 1): # Суммирование с использованием y_i и c_i
  112.             c_i = c_values.get(i, 0)
  113.             y_i = y_values.get(i, 0)
  114.             A_j += y_i * c_i * all_vectors[j_index-1][0][i]
  115.             B_j += y_i * all_vectors[j_index-1][0][i]
  116.         if B_j != 0 and (A_j % q) == (deltas[j + 1] * B_j) % q:
  117.             successful_queries.add(j_index)
  118.             print(f"Запрос {j_index} успешен! A_j = {A_j}, delta_j * B_j = {deltas[j + 1] * B_j}")
  119.         else:
  120.             all_conditions_met = False
  121.             print(f"Запрос {j_index} НЕ успешен! A_j = {A_j}, delta_j * B_j = {deltas[j + 1] * B_j}")
  122.  
  123.  
  124.     if all_conditions_met and len(successful_queries) > l:
  125.         print(f"\nАтака успешна! Найдено {len(successful_queries)} успешных запросов: {successful_queries}")
  126.         return successful_queries
  127.     else:
  128.         print()
  129.         print(f"\nАтака не удалась. Условия WFROS не выполнены для всех l+1 векторов.")
  130.         return None
  131.  
  132.  
  133. # --- Параметры для теста ---
  134. l_param = 15
  135. q_param = 1999
  136. q_h_limit_param = q_param ** (1/2) // 1 # Увеличим лимит для поиска коллизии
  137.  
  138. successful_J_clever_v2 = clever_wros_attack(l_param, q_param, q_h_limit_param)
  139.  
  140. if successful_J_clever_v2:
  141.     print("\nУспешная атака!")
  142. else:
  143.     print("\nАтака провалилась.")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement