В этом руководстве я покажу, как выполнять вычисления с зашифрованными данными, используя Python и Google Collab, бесплатную платформу машинного обучения, предлагаемую Google. Мне понравился Collab тем, что вы можете очень быстро что-то протестировать перед установкой на свой компьютер или в облако.

Тип шифрования, который я использую, называется полностью гомоморфным шифрованием, и он позволяет нам сначала шифровать данные и отправлять данные другой стороне для выполнения некоторых вычислений, сохраняя данные в зашифрованном виде. Как только вы получите результат, вы и только вы сможете расшифровать его, потому что у вас есть секретный ключ.

Полностью гомоморфное шифрование (FHE) — это тип шифрования, который выполняет только две операции над зашифрованными данными: сложение и умножение. На практике вам нужно преобразовать вашу задачу таким образом, чтобы у вас были только эти две операции для зашифрованных вычислений.

В этом руководстве я буду использовать оболочку Python для библиотеки SEAL. Эта библиотека была разработана Microsoft несколько лет назад и реализует широко используемую схему шифрования BFV FHE.

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

Вам необходимо установить и собрать библиотеку SEAL, выполнив следующие шаги:

  1. Скачиваем все зависимости:
!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.

Далее: Зашифрованные вычисления, приемы реализации ›