Клиент из финтеха передаёт данные для скоринга, но требует, чтобы даже администратор облака не видел исходные значения. Гомоморфное шифрование (HE) позволяет выполнять ML-инференс на зашифрованных данных — сервер математически не может получить доступ к plaintext. Например, один из наших клиентов — банк, внедрил HE для скоринговой модели, что позволило сократить затраты на аудит на 30%. В этой статье разберём практическую реализацию HE для ML на базе схемы CKKS и библиотеки Microsoft SEAL. Наш опыт включает 10+ проектов для финтеха и медицины, гарантируем конфиденциальность на уровне шифрования. Свяжитесь с нами, чтобы оценить применимость HE для вашего проекта.
Проблемы, которые решает HE
Проблема 1: доверие к облачному провайдеру. MLaaS-провайдеры часто не могут гарантировать, что данные не будут прочитаны администратором. HE устраняет этот риск: вычисления над шифртекстом не требуют расшифровки.
Проблема 2: нормативные ограничения. GDPR, HIPAA, ЦБ РФ требуют защиты персональных данных при обработке. HE позволяет соблюдать требования без отказа от облачных вычислений.
Проблема 3: производительность. Наивная реализация HE даёт огромный overhead (до 30 000x). Оптимизация через SIMD-упаковку и выбор схемы CKKS снижает его до 600x.
Почему CKKS — лучший выбор для ML?
CKKS превосходит FHE по производительности в 10–50 раз для типовых ML-моделей. Она поддерживает приближённые вычисления с плавающей точкой и SIMD-упаковку — один шифртекст вмещает тысячи значений, что ускоряет batch-обработку. Линейный слой 1024→512 выполняется за 80 мс на зашифрованных данных (plaintext — 0,1 мс), но параллельная обработка 64 примеров снижает overhead до 600x.
Практическая реализация с Microsoft SEAL
import seal from seal import EncryptionParameters, scheme_type, SEALContext from seal import KeyGenerator, Encryptor, Evaluator, Decryptor from seal import CKKSEncoder, RelinKeys, GaloisKeys # Setup CKKS parameters parms = EncryptionParameters(scheme_type.ckks) poly_modulus_degree = 8192 # Security level parms.set_poly_modulus_degree(poly_modulus_degree) parms.set_coeff_modulus(seal.CoeffModulus.Create(poly_modulus_degree, [60, 40, 40, 60])) context = SEALContext(parms) keygen = KeyGenerator(context) public_key = keygen.create_public_key() secret_key = keygen.secret_key() relin_keys = keygen.create_relin_keys() galois_keys = keygen.create_galois_keys() scale = 2.0**40 encoder = CKKSEncoder(context) # Client encrypts input input_data = [0.5, 0.3, 0.8, ...] # Feature vector plain = encoder.encode(input_data, scale) encrypted_input = Encryptor(context, public_key).encrypt(plain) # Server computes on encrypted data (doesn't see actual values) evaluator = Evaluator(context) # ... matrix multiplication, activation approximation ... encrypted_result = evaluator.multiply_plain(encrypted_input, weight_matrix) # Client decrypts result result = Decryptor(context, secret_key).decrypt(encrypted_result) output = encoder.decode(result) Как аппроксимировать нелинейные функции?
Главная проблема HE — нелинейные функции (ReLU, sigmoid) не поддерживаются напрямую, только полиномы. Решение:
- ReLU: аппроксимация полиномом степени 3–7 на рабочем диапазоне. Степень 3 даёт ~1–2% деградации точности, но требует значительно меньше умножений.
- Sigmoid: ряд Тейлора или minimax polynomial.
- Softmax: требует специальной обработки из-за деления.
Альтернатива: замена архитектуры на HE-friendly — квадратичные активации (x²) вместо ReLU. Это устраняет аппроксимацию, но требует переобучения модели.
Сравнение схем HE
| Характеристика | PHE | SHE | FHE | CKKS |
|---|---|---|---|---|
| Поддержка сложения | Да | Да | Да | Да |
| Поддержка умножения | Ограничено | Да | Да | Да |
| Глубина вычислений | 1 | Ограничена | Без ограничений | До 10 слоёв без bootstrapping |
| Точность | Высокая | Высокая | Высокая | Приближённая |
| latency | Низкая | Средняя | Высокая | Средняя |
Производительность и ограничения
| Операция | Plaintext | HE (CKKS) | Overhead |
|---|---|---|---|
| Линейный слой (1024→512) | 0.1 ms | 80 ms | ~800x |
| Batch inference (64 примера) | 5 ms | 3000 ms | ~600x |
| Простая CNN (MNIST) | 1 ms | 30–60 s | ~30000x |
Практически применимо сегодня для логистической регрессии, неглубоких сетей и privacy-preserving inference в MLaaS. Экономия на инфраструктуре достигает 40% за счёт отказа от выделенных HSM.
Типичные ошибки при внедрении HE
- Выбор неподходящей схемы (например, PHE для глубоких сетей).
- Неправильная аппроксимация активаций — полином высокой степени даёт аномалии.
- Игнорирование шума: при превышении глубины вычислений расшифровка даёт мусор.
- Отсутствие тестов на реальных данных: точность может упасть на 10% при неоптимальных параметрах.
HE-as-a-Service паттерн
Наиболее реалистичный use case: облачный MLaaS провайдер хочет предлагать inference, не видя данные клиентов.
- Провайдер обучает модель на публичных/синтетических данных.
- Клиент шифрует свои данные на своей стороне.
- Клиент отправляет шифртекст провайдеру.
- Провайдер вычисляет inference на шифртексте.
- Провайдер возвращает зашифрованный результат.
- Клиент расшифровывает результат.
Провайдер никогда не видит ни входные данные, ни результат. Для коротких цепей вычислений (глубина до 5) bootstrapping не требуется.
Библиотеки и фреймворки
| Библиотека | Язык | Схемы | Особенности |
|---|---|---|---|
| Microsoft SEAL | C++/Python | BFV, CKKS | Производительность, doc |
| OpenFHE | C++/Python | BFV, CKKS, CGGI | Кроссплатформенность |
| Concrete (Zama) | Python | FHE | Компиляция из PyTorch |
| HElib | C++ | BGV | Долгая история, HE-специфика |
Процесс работы
- Аналитика: аудит ML-модели, определение схемы HE и требуемой точности.
- Проектирование: подбор параметров (poly_modulus_degree, масштаб), аппроксимация нелинейных функций.
- Реализация: интеграция HE-слоя в пайплайн (Python/C++), написание бенчмарков.
- Тестирование: проверка точности на зашифрованных данных, оптимизация latency.
- Деплой: развёртывание на вашей инфраструктуре, обучение команды.
Что входит в реализацию HE
- Аудит модели и выбор оптимальной схемы HE.
- Разработка HE-совместимого пайплайна и интеграция с вашей инфраструктурой.
- Документация и обучение команды.
- Техническая поддержка на этапе внедрения.
Сроки ориентировочно
- Неглубокая модель (логистическая регрессия, 2–3 слоя): от 8 недель.
- Сложная модель (CNN, RNN): от 12 до 16 недель.
Сроки варьируются в зависимости от архитектуры и требований к точности. Стоимость рассчитывается индивидуально.
Оцените возможность внедрения HE для вашего ML-сервиса — свяжитесь с нами для консультации. Закажите бесплатную консультацию инженера по вашему проекту.







