Мы с важной новостью: с 28 февраля 2025 года сервис Хабр Фриланс прекратит свою работу.

Купить услуги можно до 28 февраля 2025, но пополнить баланс уже нельзя. Если на вашем счете остались средства, вы можете потратить их на небольшие услуги — служба поддержки готова поделиться бонусами, на случай, если средств немного не хватает.
R50 4fd6d9d9de7b34638f63f16582928bb5
Дизайн, Python, IT , Арт

Необходимо уверенное знание высшей алгебры (поля, группы, кольца),

Добавлено 09 авг 2024 в 21:44
Необходимо уверенное знание высшей алгебры (поля, группы, кольца), опыт разработки 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) с потайным ходом. Благодаря использованию нелинейных отображений
данного типа обеспечивается возможность задания открытого ключа в алгоритмах многомерной криптографии в виде нелинейного отображения, реализуемого как вычисление значений набора многочленов третьей
и шестой степени. При этом за счет использования маскирующих линейных отображений, не приводящих к
увеличению числа слагаемых в многочленах, уменьшается размер открытого ключа по сравнению с известными алгоритмами-аналогами, в которых открытый ключ представлен набором многочленов второй и третьей
степени. Предлагаемый подход потенциально расширяет области практического применения постквантовых
алгоритмов открытого шифрования и электронной цифровой подписи, относящихся к многомерной криптографии, за счет существенного уменьшения размера открытого ключа
637790bb6f