# Гомоморфное шифрование на основе матричных полиномов

# Описание

Библиотека содержит алгоритм гомоморфного шифрования на основе матричных полиномов. Подходит для создания систем, в которых можно выполнятьвычисления над зашифрованными данными без их расшифровки.

# Возможности

Библиотека "FHEMP" поддерживает функции:
1. Генерация ключей: секртеный ключ, секретный вектор, ключ вычислений;
2. Шифрование целых чисел;
3. Расшифровка с использованием секретного ключа и вектора;
4. Гомоморфне операции: сложение и умножение зашифрованных данных.

## Установка

Для установки необходимо выполнить команду

```bash
pip install FHEMP
```

Для обновления версии до последней нужно выполнить команду

```bash
pip install --upgrade FHEMP
```

# Инструкция по использованию

Перед началом работы необходимо определится с параметрами криптосистемы, такими как N, размерность матрицы, p, модуль по которому будут проходить вычисления, и 4 переменные λ, γ, δ и ψ, они влиют на степень матричных полиномов.

Важное примечение. p — должно быть больше максимального возможного значения результата после гомоморфных операций, иначе расшифровка будет приводить к некоректному резульату.

Для сохранения данных, во время первого выполнения функций, создаться
папка "FHEMP_data", содержащая папку "key", для сгенерированных ключей, и
папку "cipher", для хранения зашифрованных данных.

В начале необходимо создать секретный ключ, секретный
вектор и ключ вычислений, это можно выполнить вызовом функции

```bash
generate_keys(N, p, lam, omega, delta, sk_name, k_name, evk_name)
```

В ней необходимо указать значение переменных, выбранных ранее, так же необходимо указать навзание файлов в которые будут сохранены секретный ключ, вектор и ключ вычислений. 

Пример вызова функции генерации ключей

```bash
generate_keys(5, 97, 3, 3, 3, "secret_key", "vector", "evk")
```

Для выполнения шифрования необходимо вызвать функцию 

```bash
encrypt(message, filename, N, p, lam, psi, name_secret_key_file, name_vector_file)
```

Для работы функции шифрования необходимо указать сообщение (целое число), которое нужно зашифровать, название файла в который сохранится зашифрованное сообщение, значение переменных N, p, lam, psi, и название файлов содержащих секретный ключ и вектор.

Пример вызова функции шифрования

```bash
encrypt(10, "cipher1", 5, 97, 3, 3, "secret_key", "vector")
```

Для выполнения операций сложений и умножения необходимо вызвать функию 

```bash
operate(ciphertext_file1,  operation, ciphertext_file2, p name_evaluation_key_file, filename)
```

В ней необходимо указать названия двух файлов с которыми нужно выполнить операцию, далее нужно указать операцию "add", для сложения, и "mul", для умножения, далее прописываем значение p, модуля, и название файла содержащего ключ вычисления.

Пример вызова функции выполнения операции

```bash
operate("cipher1",  mul, "cipher2", 97, "evk", "multi")
```

Последней функцией является функция расшифровки

```bash
decrypt(ciphertext_file, secret_key_file, vector_file, p)
```

В ней необходимо указать название файлов содрежащих зашифрованный текст, секретный ключ, секретный вектор и значение модуля.

Пример вызова функции расшифровки

```bash
decrypt("multi", "secret_key", "vector", 97)
```