Необходимо уверенное знание высшей алгебры (поля, группы, кольца), опыт разработки GUI на питоне, желательно (но не обязательно) знание C++ для написания отдельных компонентов утилиты. Объём работ сдельный (утилита планируется демонстрационная), потребуется длительное сопровождение. Удобные формат работы и оплату готов обсудить более детально с исполнителем.
mport numpy as np
from sympy import symbols, expand
import tkinter as tk
from tkinter import messagebox, filedialog
from Crypto.PublicKey import RSA
from Crypto.Random import get_random_bytes
from Crypto.Cipher import PKCS1_OAEP
def generate_tubv(m, d, constants):
tubv = np.zeros((m, m), dtype=object)
for i in range(m):
for j in range(m):
tubv[i, j] = constants[(i + j + d) % m]
return tubv
def generate_structural_constants(m, t):
constants = np.zeros((m, m), dtype=int)
for i in range(m):
for j in range(m):
constants[i, j] = (i t + j t) % m
return constants
def generate_input_vector(m):
return np.random.randint(0, 2, m)
def load_input_vector(filename):
with open(filename, 'r') as file:
return np.array([int(x) for x in file.read().split()])
def generate_polynomials(m, tubv, constants, input_vector):
x = symbols(f'x0:{m}')
polynomials = []
for i in range(m):
poly = 0
for j in range(m):
poly += constants[i, j] * x[j]**2
polynomials.append(expand(poly))
return polynomials
def second_square(polynomials, tubv):
x = symbols(f'x0:{len(polynomials)}')
new_polynomials = []
for poly in polynomials:
new_poly = 0
for term in poly.as_ordered_terms():
coeff = term.as_coeff_Mul()[0]
vars = term.as_coeff_Mul()[1].as_ordered_factors()
if len(vars) == 2:
i = int(str(vars[0])[1:])
j = int(str(vars[1])[1:])
new_poly += coeff * x[tubv[i, j]]
else:
new_poly += term
new_polynomials.append(expand(new_poly))
return new_polynomials
def save_to_file(filename, data):
with open(filename, 'w') as file:
for item in data:
file.write(str(item) + '\n')
def generate_rsa_keys():
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
return private_key, public_key
def save_keys(private_key, public_key):
with open('private.pem', 'wb') as priv_file:
priv_file.write(private_key)
with open('public.pem', 'wb') as pub_file:
pub_file.write(public_key)
def run_program():
try:
m1 = int(entry_m1.get())
d1 = int(entry_d1.get())
t1 = int(entry_t1.get())
constants1 = ['A', 'B', 'C', 'E']
tubv1 = generate_tubv(m1, d1, constants1)
structural_constants1 = generate_structural_constants(m1, t1)
input_vector1 = load_input_vector(file_path1.get())
polynomials1 = generate_polynomials(m1, tubv1, structural_constants1, input_vector1)
m2 = int(entry_m2.get())
d2 = int(entry_d2.get())
t2 = int(entry_t2.get())
constants2 = ['α', 'α\'', 'β', 'β\'']
tubv2 = generate_tubv(m2, d2, constants2)
structural_constants2 = generate_structural_constants(m2, t2)
input_vector2 = load_input_vector(file_path2.get())
polynomials2 = generate_polynomials(m2, tubv2, structural_constants2, input_vector2)
# Второе возведение в квадрат
new_polynomials1 = second_square(polynomials1, tubv2)
new_polynomials2 = second_square(polynomials2, tubv2)
save_to_file('polynomials1.txt', new_polynomials1)
save_to_file('polynomials2.txt', new_polynomials2)
# Генерация RSA ключей
private_key, public_key = generate_rsa_keys()
save_keys(private_key, public_key)
messagebox.showinfo("Успех", "Программа успешно выполнена. Ключи сгенерированы и сохранены.")
except Exception as e:
error_window = tk.Toplevel(root)
error_window.title("Ошибка")
tk.Label(error_window, text="Произошла ошибка:").pack()
tk.Label(error_window, text=str(e)).pack()
tk.Button(error_window, text="Закрыть", command=error_window.destroy).pack()
def select_file(entry):
file_path = filedialog.askopenfilename()
entry.delete(0, tk.END)
entry.insert(0, file_path)
def generate_tubv_button():
try:
m1 = int(entry_m1.get())
d1 = int(entry_d1.get())
t1 = int(entry_t1.get())
constants1 = ['A', 'B', 'C', 'E']
tubv1 = generate_tubv(m1, d1, constants1)
structural_constants1 = generate_structural_constants(m1, t1)
m2 = int(entry_m2.get())
d2 = int(entry_d2.get())
t2 = int(entry_t2.get())
constants2 = ['α', 'α\'', 'β', 'β\'']
tubv2 = generate_tubv(m2, d2, constants2)
structural_constants2 = generate_structural_constants(m2, t2)
# Отображение ТУБВ на интерфейсе
tubv1_str = '\n'.join([' '.join(map(str, row)) for row in tubv1])
tubv2_str = '\n'.join([' '.join(map(str, row)) for row in tubv2])
tubv1_label.config(text=f"ТУБВ 1:\n{tubv1_str}")
tubv2_label.config(text=f"ТУБВ 2:\n{tubv2_str}")
messagebox.showinfo("Успех", "ТУБВ успешно сгенерированы.")
except Exception as e:
error_window = tk.Toplevel(root)
error_window.title("Ошибка")
tk.Label(error_window, text="Произошла ошибка:").pack()
tk.Label(error_window, text=str(e)).pack()
tk.Button(error_window, text="Закрыть", command=error_window.destroy).pack()
def encrypt_polynomials_button():
try:
m1 = int(entry_m1.get())
d1 = int(entry_d1.get())
t1 = int(entry_t1.get())
constants1 = ['A', 'B', 'C', 'E']
tubv1 = generate_tubv(m1, d1, constants1)
structural_constants1 = generate_structural_constants(m1, t1)
input_vector1 = load_input_vector(file_path1.get())
polynomials1 = generate_polynomials(m1, tubv1, structural_constants1, input_vector1)
m2 = int(entry_m2.get())
d2 = int(entry_d2.get())
t2 = int(entry_t2.get())
constants2 = ['α', 'α\'', 'β', 'β\'']
tubv2 = generate_tubv(m2, d2, constants2)
structural_constants2 = generate_structural_constants(m2, t2)
input_vector2 = load_input_vector(file_path2.get())
polynomials2 = generate_polynomials(m2, tubv2, structural_constants2, input_vector2)
# Первое возведение в квадрат
new_polynomials1 = second_square(polynomials1, tubv2)
new_polynomials2 = second_square(polynomials2, tubv2)
# Отображение результатов на интерфейсе
poly1_str = '\n'.join(map(str, new_polynomials1))
poly2_str = '\n'.join(map(str, new_polynomials2))
poly1_label.config(text=f"Результат 1-го возведения в квадрат:\n{poly1_str}")
poly2_label.config(text=f"Результат 2-го возведения в квадрат:\n{poly2_str}")
messagebox Метод исследования: использование нелинейных отображений, задаваемых в виде операций возведения в степень в конечных расширенных полях GF(qm), представленных в форме конечных алгебр. Последнее
обеспечивает возможность выполнения операции возведения в степень в поле GF(qm) путем вычисления
значений степенных многочленов над полем GF(q), задающих трудно обратимое нелинейное отображение
векторного пространства над GF(q) с потайным ходом. Благодаря использованию нелинейных отображений
данного типа обеспечивается возможность задания открытого ключа в алгоритмах многомерной криптографии в виде нелинейного отображения, реализуемого как вычисление значений набора многочленов третьей
и шестой степени. При этом за счет использования маскирующих линейных отображений, не приводящих к
увеличению числа слагаемых в многочленах, уменьшается размер открытого ключа по сравнению с известными алгоритмами-аналогами, в которых открытый ключ представлен набором многочленов второй и третьей
степени. Предлагаемый подход потенциально расширяет области практического применения постквантовых
алгоритмов открытого шифрования и электронной цифровой подписи, относящихся к многомерной криптографии, за счет существенного уменьшения размера открытого ключа