FHE (полностью гомоморфное шифрование) — класс криптосхем, позволяющих выполнять вычисления прямо над зашифрованными данными и получать зашифрованный же результат. После расшифровки владелец ключа видит то же значение, как если бы вычисление шло по открытым данным. Практическое следствие: облако/исполнитель ничего не знает о входах и, при желании, о самой программе, но может «посчитать» и вернуть результат.
Связанные материалы: zkML (верифицируемый ИИ), AI Security Hub, Fine-tuning LLM, LoRA.
FHE (Fully Homomorphic Encryption): зачем это нужно
- Приватность по умолчанию. Банк, клиника или аналитический провайдер могут обрабатывать данные клиента, не видя их содержимого.
- Нулевая экспозиция в облаке. Вы отдаёте ciphertext, а не plaintext; утечки инфраструктуры не раскрывают исходники.
- Совместимость со строгими режимами. В медицине/финансах/гос-секторах FHE упрощает соответствие нормативам хранения/обработки.
- Приватный ML. Инференс моделей по зашифрованным данным (и/или с зашифрованными весами) без доступа к самому содержимому.
Короткая история и «семейство» схем
Идея гомоморфного шифрования обсуждалась с 1970-х; впервые полную схему предложил Крейг Джентри (2009). Современная практика — это семейство реализаций на решётках:
- BGV (Brakerski–Gentry–Vaikuntanathan) — точная арифметика над кольцами, хороший контроль шума.
- BFV (Brakerski–Fan–Vercauteren) — целочисленная арифметика, удобна для «точных» вычислений.
- CKKS (Cheon–Kim–Kim–Song) — приближённая арифметика с плавающей «фикспойнт» шкалой; популярна для ML/аналитики.
- TFHE — «покомпонентные» логические операции/быстрый бутстраппинг; применяют для булевых схем и активаций.
Отдельно: частичные (PHE) — Paillier (аддитивная) и ElGamal (мультипликативная) — поддерживают одну операцию и не являются «полными».
Типы гомоморфии (уровни возможностей)
- PHE (частичное) — одна операция (сложение или умножение) без ограничений глубины.
- SHE (ограниченное) — несколько операций, но с малой глубиной.
- Leveled FHE — заранее заданная глубина цепочки операций без бутстраппинга (дешевле).
- Full FHE — неограниченная глубина благодаря бутстраппингу (освежение шума).
На практике часто хватает leveled: вы оцениваете «глубину схемы» и подбираете параметры так, чтобы пройти без перезарядки.
Что под капотом: кольца, шум и ключи
Современные FHE-схемы базируются на задачах типа (R)LWE/RLWE (задачи на «шум» в линейных уравнениях над кольцами). Важно понимать три идеи:
1) Шум. Каждое шифрование содержит контролируемый шум. При гомоморфных операциях шум растёт. Если превысить порог — расшифровка сломается. Бутстраппинг «сбрасывает» шум (дорога операция, но делает схему «полной»).
2) Ключи. Помимо обычных public/secret, нужны оценочные (evaluation) ключи:
- Relinearization keys — «сжимают» степень шифротекста после умножения.
- Galois/rotation keys — для поворотов/сдвигов «батчей» (SIMD).
- Bootstrapping keys — чтобы уметь освежать шум.
3) Упаковка (SIMD). В BGV/BFV/CKKS можно «упаковать» множество значений в один шифротекст и делать операции покомпонентно (SIMD). Это резко снижает стоимость на элемент.
Варианты арифметики: точная vs приближённая
- BGV/BFV: целочисленная арифметика по модулю; удобна, если важно точное равенство/счётчик/булева логика.
- CKKS: «плавающая» шкала; вы храните действительные числа с контролируемой погрешностью. Отлично подходит для статистики/ML, где ≈ приемлемо.
В CKKS ключевое — масштаб (scale) и rescale после умножений. В BGV/BFV — модуль-свитч и контроль «бюджета шума».
Стоимость: на что закладываться
- Расширение данных: шифротекст крупнее открытого значения (×10…×100+).
- Латентность: операции в десятки–тысячи раз медленнее, чем в открытом виде; «бутстраппинг» — самый тяжёлый шаг.
- Память: крупные параметры (размер кольца N, модуль Q), дополнительные ключи.
Снижают цену: упаковка SIMD, грамотная структура вычислений, минимизация умножений/ротаций, выбор leveled вместо полного FHE, аккуратные параметры.
ML под FHE: как строят инференс
Задача — заменить то, что «не дружит» с гомоморфией, и уложиться в глубину:
- Активации: ReLU/Swish заменяют на полиномиальные аппроксимации (квадрат, Чебышёв, кусочно-полиномиальные).
- Нормализации: избегать делений и сложных функций; всё «дорогое» — заранее свёртывать в оффлайне.
- Квантование: уменьшение диапазонов/точности снижает глубину.
- CKKS: стандарт для вещественных сетей; TFHE — для булевых/«битовых» вариантов.
- Batching: упаковывайте целые мини-батчи в ciphertext; экономия огромная.
Где реально применяют: приватный скоринг (финансы/страхование), поиск по зашифрованным признакам, медицинские предикторы, рекомендации без раскрытия профиля пользователя.
Ядро API: что обычно можно сделать
- Encrypt/Decrypt (SEAL-подобные библиотеки): работа со скейлом (CKKS), списки модулей (RNS).
- EvalAdd/EvalMul: базовые операции; следите за ростом скейла/шума.
- Relinearize/Rescale/ModSwitch: «сжатие» и выравнивание параметров.
- Rotate/Permute: ротации упакованных слотов (нужны Galois-ключи).
- Bootstrap (если нужно «бесконечное» вычисление).
Дизайн-паттерны вычислений
- «Больше сложений, меньше умножений» — глубину делают умножения.
- Формулы Горанера для полиномов — минимизация глубины мультипликативной цепочки.
- Предварительные константы — сводите деления/нормировки в оффлайн-коэффициенты.
- Ротации пакетами — планируйте развороты/сдвиги слотов заранее: каждая ротация — это отдельная «дорогая» операция.
- Слои «в линию» — избегайте ветвлений: логика «если/то» сложна для FHE; используйте «мягкие» приближения.
Сравнение: FHE vs альтернативы
| Подход | Что даёт | Плюсы | Минусы/нюансы |
|---|---|---|---|
| FHE | Считаем над зашифрованными данными | Приватность без доверия к исполнителю; совместим с облаком | Медленно/дорого; перепроектирование алгоритмов |
| MPC | Совместное вычисление между сторонами | Нет единой доверенной стороны; хорош для интерактивных сценариев | Требует онлайн-взаимодействия; сетевая стоимость |
| TEE | Защищённая среда (SGX и др.) | Почти нативная скорость; простая разработка | Доверие к железу; уязвимости/патчи; модель угроз другая |
| zk-доказательства (zkML) | Доказуем правильный результат | Дешёвая проверка/ончейн; не раскрывает входы при нужном дизайне | Обычно не скрывает сами входы по умолчанию; доказывает «правильность», а не «секретность» |
Практика — гибриды: TEE для тяжёлых участков, FHE для чувствительных полей, zk — для публичной верификации итога.
Проектирование под FHE: пошаговый план
- Выделите «ценность приватности». Какие поля нельзя раскрывать? Что можно псевдоанонимизировать?
- Выберите схему. Точные целые → BFV/BGV; стат-/ML-инференс → CKKS; булевы/логические цепочки → TFHE.
- Оцените глубину. Счёт полиномов/слоёв/умножений → хватит ли leveled? Нужен ли бутстраппинг?
- Спроектируйте упаковку. Какие данные упакуем в один ciphertext? Какие ротации необходимы?
- Подберите параметры. Размер кольца N, модуль Q, скейл (CKKS), уровень безопасности (бит-security).
- Соберите прототип. Замерьте латентность, память, точность/погрешность (CKKS).
- Твикните модель. Упростите активации, уменьшите глубину, вынесите константы.
- Добавьте контроль. Логи вычислений, алерты по «исчерпанию» уровня, тесты корректности на эталонах.
Частные темы, о которых спотыкаются чаще всего
Бутстраппинг. Делает схему «полной», но это сотни миллисекунд–секунды на ciphertext в обычных настройках. Если pipeline фиксированный, старайтесь обойтись leveled и переписать вычисление.
Погрешность (CKKS). Каждое умножение увеличивает скейл и вносит ошибку округления. Контролируйте rescale и держите итоговую точность в заданном допуске.
Ротации и память. Планируйте число Galois-ключей и ротаций: они влияют и на размер ключевого набора, и на время.
Смешанные типы. «Целое + вещественное»? Иногда выгодно держать первые шаги в BFV, затем перейти к CKKS (или наоборот) — но межсхемная композиция сложна; чаще выбирают одну схему и проектируют под неё.
Набор «правил большой тройки» для инженера
- Минимизируйте умножения и ротации. Самые дорогие операции.
- Используйте упаковку и SIMD. Игнор упаковки — главный «убийца» производительности.
- Ранний прототип и профилировка. Точная стоимость FHE «на глаз» не оценивается; эксперимент обязателен.
Пример: линейная регрессия и логистическая под FHE
Линейная регрессия — почти «нативна»: сумма произведений wᵀx в CKKS/BFV, при CKKS — ещё и масштаб. Логистическая требует сигмоиды: заменяют на полином P(x) (например, аппроксимация Чебышёва 3-5-го порядка) → предсказание вероятности с допустимой ошибкой.
FAQ
FHE пригоден для обучения моделей или только для инференса?
Инференс — реалистично сегодня. Обучение под FHE — крайне дорого, но возможны гибриды (часть шагов в TEE/MPC; приватные градиенты под HE для простых моделей).
Чем CKKS отличается от BFV/BGV?
CKKS — приближённая арифметика по вещественным числам с контролем масштаба/ошибки; BFV/BGV — целочисленная арифметика по модулю, «строго точная», но менее удобная для статистики/ML.
Что такое «уровни» и почему все говорят про «глубину»?
Каждое умножение «съедает» уровень. Если уровни закончились — надо бутстраппить (дорого) или изначально выбрать параметры/аппроксимации так, чтобы уложиться.
Можно ли скрыть и данные, и модель?
Да. Данные всегда шифруются; веса модели тоже можно шифровать/скрывать (есть протоколы «двусторонней» приватности), но это ещё увеличит стоимость.
Это быстрее, чем zkML или TEE?
Нет. TEE ближе к нативной скорости. zk решает другую задачу — верификацию. FHE — про секретность входов при вычислении. В реальных системах часто используется комбинация.
Подходит ли FHE для блокчейна/он-чейн?
Он-чейн обычно делают только проверку (zk). FHE-вычисления исполняют оффчейн, возвращая результат владельцу. Есть исследования «он-чейн FHE», но экономически это пока тяжело.
Чек-лист внедрения
- Определили, что FHE действительно решает проблему приватности, а не «удорожает по моде».
- Выбрали схему (CKKS/BFV/BGV/TFHE) и библиотеку (SEAL-подобные/аналог).
- Оценили глубину, спроектировали упаковку и ротации.
- Настроили параметры безопасности (бит-уровень), N, Q, масштаб.
- Заложили мониторинг: уровни, латентность, память, точность.
- Прописали «план деградации» (облегчённый маршрут без бутстраппинга).
- Провели evals точности и производительности на реальных данных (см. evals).
Мини-глоссарий
- Гомоморфизм — свойство шифрования сохранять операцию: Enc(a) ⊕ Enc(b) ↦ Enc(a ○ b).
- Шум — скрывающий добавок в ciphertext; растёт при операциях.
- Бутстраппинг — процедура «освежения» шума; делает схему «полной».
- SIMD/батчинг — упаковка многих значений в один ciphertext.
- Relinearization/Galois keys — ключи для «сжатия» степеней и для ротаций.
- CKKS/BFV/BGV/TFHE — популярные семейства FHE-схем.
