В этом руководстве я покажу, как выполнять вычисления с зашифрованными данными, используя Python и Google Collab, бесплатную платформу машинного обучения, предлагаемую Google. Мне понравился Collab тем, что вы можете очень быстро что-то протестировать перед установкой на свой компьютер или в облако.
Тип шифрования, который я использую, называется полностью гомоморфным шифрованием, и он позволяет нам сначала шифровать данные и отправлять данные другой стороне для выполнения некоторых вычислений, сохраняя данные в зашифрованном виде. Как только вы получите результат, вы и только вы сможете расшифровать его, потому что у вас есть секретный ключ.
Полностью гомоморфное шифрование (FHE) — это тип шифрования, который выполняет только две операции над зашифрованными данными: сложение и умножение. На практике вам нужно преобразовать вашу задачу таким образом, чтобы у вас были только эти две операции для зашифрованных вычислений.
В этом руководстве я буду использовать оболочку Python для библиотеки SEAL. Эта библиотека была разработана Microsoft несколько лет назад и реализует широко используемую схему шифрования BFV FHE.
Давайте откроем новый блокнот для совместной работы, или вы можете использовать тот, который у меня уже есть [ссылка].
Вам необходимо установить и собрать библиотеку SEAL, выполнив следующие шаги:
- Скачиваем все зависимости:
!git clone -b 3.3.2 https://github.com/Huelse/SEAL-Python
2. Создайте библиотеку SEAL C++.
!cd SEAL-Python/SEAL/native/src;cmake .;make
3. Зависимость Python-SEAL
!pip3 install -r SEAL-Python/requirements.txt
4. Настройте Python-SEAL
!cd SEAL-Python;python3 setup.py build_ext -i
5. Установите Python-SEAL
!cd SEAL-Python;python3 setup.py install
Это оно. Мы завершили установку.
Теперь попробуем сгенерировать пару ключей:
from seal import * parms = EncryptionParameters(scheme_type.BFV) poly_modulus_degree = 4096 parms.set_poly_modulus_degree(poly_modulus_degree) parms.set_coeff_modulus(CoeffModulus.BFVDefault(poly_modulus_degree)) parms.set_plain_modulus(256) context = SEALContext.Create(parms) keygen = KeyGenerator(context) public_key = keygen.public_key() secret_key = keygen.secret_key() encryptor = Encryptor(context, public_key) evaluator = Evaluator(context) decryptor = Decryptor(context, secret_key)
Секретный ключ здесь — это закрытый ключ, который вы будете использовать для расшифровки, в то время как открытый ключ используется для выполнения вычислений, и его можно передать кому угодно. Обратите внимание, что вычисления вызывают рост шума в зашифрованных значениях, и в какой-то момент вы больше не сможете расшифровать эти значения. Кроме того, расчеты выполняются по фиксированному модулю. Пожалуйста, обратитесь к официальной документации Microsoft.
Теперь давайте перейдем к демонстрации, где мы шифруем два значения. (Числа должны быть шестнадцатеричными.)
enc1 = Ciphertext() enc2 = Ciphertext() encryptor.encrypt(Plaintext(“5”), enc1) encryptor.encrypt(Plaintext(“7”), enc2)
Здесь мы складываем два числа и расшифровываем, чтобы увидеть результат
evaluator.add_inplace(enc1, enc2) # decrypt result = Plaintext() decryptor.decrypt(enc1, result) print(f”result: 0x{result.to_string()}”)
›› результат: 0xC
Затем мы умножаем зашифрованные числа и расшифровываем их
evaluator.multiply_inplace(enc1, enc2) result_mul = Plaintext() decryptor.decrypt(enc1, result_mul) print(f”result: 0x{result_mul.to_string()}”)
› результат: 0x54
Вы можете запустить больше примеров из репозитория Python-Seal.
Доступна блокнот Colab с приведенным выше кодом, а также страница GitHub.