dilithium-python 0.1.0
Python bindings for Dilithium post-quantum signatures
License: MIT

# Dilithium Python/Rust

Данная библиотека предоставляет Python-биндинги на библиотеку **pqcrypto-dilithium**, причём очень удобные биндинги.

---

## Пару слов про Dilithium

**Dilithium** — это один из алгоритмов цифровой подписи, разработанный для устойчивости к атакам с использованием квантовых компьютеров. Он является частью направления **постквантовой криптографии**, которое занимается созданием криптографических методов, устойчивых к взлому с помощью квантовых алгоритмов (например, алгоритма Шора).

### Основные характеристики Dilithium

1. **Основа на решётках**:
   - Dilithium построен на математических задачах, связанных с **решётками** (lattice-based cryptography). Эти задачи считаются устойчивыми к атакам как классических, так и квантовых компьютеров.
   - Основная проблема, на которой строится безопасность Dilithium, — это **Learning With Errors (LWE)** и её варианты.

2. **Эффективность**:
   - Алгоритм оптимизирован для работы на обычных компьютерах. Он имеет относительно небольшие размеры ключей и подписей по сравнению с другими постквантовыми алгоритмами.
   - Dilithium обеспечивает высокую скорость генерации подписей и их проверки.

3. **Стандартизация**:
   - В 2022 году Dilithium был выбран **NIST (Национальный институт стандартов и технологий США)** в качестве одного из стандартов для постквантовой цифровой подписи в рамках проекта по стандартизации постквантовой криптографии.
   - Он стал частью **CRYSTALS (Cryptographic Suite for Algebraic Lattices)** — набора криптографических алгоритмов, включающего также Kyber (для шифрования).

4. **Безопасность**:
   - Dilithium предлагает несколько уровней безопасности (например, 128-битный, 192-битный и 256-битный уровни стойкости к атакам).
   - Его безопасность основывается на сложности решения задач в решётках, которые считаются устойчивыми к квантовым атакам.

---

### Как работает Dilithium?

1. **Генерация ключей**:
   - Алгоритм создаёт пару ключей: **открытый ключ** (public key) и **закрытый ключ** (private key). Открытый ключ используется для проверки подписи, а закрытый — для её создания.

2. **Создание подписи**:
   - Для подписи сообщения используется закрытый ключ. Процесс включает в себя вычисления в решётках и добавление «шума» (на основе LWE), чтобы сделать подпись устойчивой к взлому.

3. **Проверка подписи**:
   - Проверка подписи осуществляется с помощью открытого ключа. Алгоритм проверяет, соответствует ли подпись сообщению и открытому ключу.

---

### Преимущества Dilithium

1. **Устойчивость к квантовым атакам**:
   - В отличие от классических алгоритмов (например, RSA или ECDSA), Dilithium устойчив к атакам с использованием квантовых компьютеров.

2. **Компактность**:
   - Размеры ключей и подписей в Dilithium значительно меньше, чем в некоторых других постквантовых алгоритмах, что делает его более практичным для использования.

3. **Высокая производительность**:
   - Алгоритм оптимизирован для быстрой работы на современных процессорах.

---

### Где применяется Dilithium?

Dilithium и другие постквантовые алгоритмы активно внедряются в:
- **Инфраструктуру цифровых подписей** (например, для защиты документов, сертификатов).
- **Криптовалюты и блокчейн** (для защиты транзакций от квантовых атак).
- **Защищённые коммуникации** (например, TLS, VPN).

---

### Почему это важно?

С появлением квантовых компьютеров классические криптографические алгоритмы (RSA, ECDSA) могут стать уязвимыми. Алгоритмы вроде Dilithium обеспечивают долгосрочную безопасность данных, защищая их от будущих угроз.

---

## Как работать с библиотекой

Библиотека имеет 3 класса: `Dilithium2`, `Dilithium3`, `Dilithium5`. Во всех классах есть 3 функции:

- `generate_keypair() -> Tuple[str, str]`
- `sign_message(message: str, private_key: str) -> str`
- `verify_message(signature: str, message: str, public_key: str) -> bool`

### Небольшой пример на Dilithium5

```python
import dilithium_python as dilithium

message = "Hello, world!"

# Генерация ключей
public_key, private_key = dilithium.Dilithium5.generate_keypair()

# Подпись сообщения
signature = dilithium.Dilithium5.sign_message(message, private_key)
print("Signature:", signature)

# Проверка подписи
print("Signature valid:", dilithium.Dilithium5.verify_message(signature, message, public_key))
```

---

### Особенности реализации

Специально чтобы не было ошибок, связанных с тем, что `Vec<u8>` в Rust при переходе в Python должен быть `bytes`, но становится `list`, было принято решение сразу же кодировать все значения в **Base64**. Это позволяет избежать проблем с типами данных и упрощает взаимодействие между Rust и Python.

---

## Установка

Есть несколько вариантов установки: через `pip` или вручную через `git`.

### 1. Установка через `pip`

Просто выполните команду:
```bash
pip install dilithium_python
```

**Примечание**: Если у вас **Linux x64-x86** или **amd64**, будет установлено предварительно собранное колесо (wheel). В противном случае будет использован исходный код (sdist), для чего потребуется установленный **Rust** и другие зависимости.

### 2. Установка вручную через `git`

Для тех, кто хочет собрать библиотеку самостоятельно:

1. Установите **Rust edition 2021**.
2. Клонируйте репозиторий:
   ```bash
   git clone https://github.com/kostya2023/dilithium_python
   ```
   или через SSH:
   ```bash
   git clone git@github.com:kostya2023/dilithium_python.git
   ```
3. Создайте виртуальную среду (например, с помощью `python -m venv venv`).
4. Установите **maturin**:
   ```bash
   pip install maturin
   ```
5. Соберите библиотеку:
   ```bash
   maturin build --release
   ```
6. Установите собранное колесо:
   ```bash
   pip install target/wheels/*.whl
   ```
7. Готово!

---

## Лицензия

Библиотека распространяется под лицензией **[MIT](https://choosealicense.com/licenses/mit/)**.

---

## Автор

- [kostya2023](https://www.github.com/kostya2023)