Building block: Paillier¶
Implementation of the Paillier encryption scheme. With support with precomputation of randomness . The encryption scheme supports positive and negative numbers, as well as fixed point encoding of numbers. Homomorphic addition of ciphertexts, negation of ciphertexts, and multiplication of ciphertexts with integral scalars has been included as well.
This building block is included in the TNO MPC Python Toolbox.
Note:¶
A significant performance improvement can be achieved by installing the GMPY2 library.
Install¶
Install the tno.mpc.encryption_schemes.paillier package using one of the following options.
Personal access token
Deploy tokens
Cloning this repo (developer mode)
Personal access token¶
Generate a personal access token with
read_api
scope. Instruction are found here.Install
python -m pip install tno.mpc.encryption_schemes.paillier --extra-index-url https://__token__:<personal_access_token>@ci.tno.nl/gitlab/api/v4/projects/7397/packages/pypi/simple
Deploy tokens¶
Generate a deploy token with
read_package_registry
scope. Instruction are found here.Install
python -m pip install tno.mpc.encryption_schemes.paillier --extra-index-url https://<GITLAB_DEPLOY_TOKEN>:<GITLAB_DEPLOY_PASSWORD>@ci.tno.nl/gitlab/api/v4/projects/7397/packages/pypi/simple
Dockerfile¶
FROM python:3.8
ARG GITLAB_DEPLOY_TOKEN
ARG GITLAB_DEPLOY_PASSWORD
RUN python -m pip install tno.mpc.encryption_schemes.paillier --extra-index-url https://$GITLAB_DEPLOY_TOKEN:$GITLAB_DEPLOY_PASSWORD@ci.tno.nl/gitlab/api/v4/projects/7397/packages/pypi/simple
Usage¶
Usage (examples/example.py
):
from tno.mpc.encryption_schemes.paillier import Paillier
if __name__ == "__main__":
# initialize Paillier with key_length of 2048 bits and fixed point precision of 3 decimals
paillier_scheme = Paillier.from_security_parameter(key_length=2048, precision=3)
# encrypt the number 8.1
ciphertext1 = paillier_scheme.encrypt(8.1)
# add 0.9 to the original plaintext
ciphertext1 += 0.9
# multiply the original plaintext by 10
ciphertext1 *= 10
# encrypt the number 10
ciphertext2 = paillier_scheme.encrypt(10)
# add both encrypted numbers together
encrypted_sum = ciphertext1 + ciphertext2
# decrypt the encrypted sum to 100
decrypted_sum = paillier_scheme.decrypt(encrypted_sum)
assert decrypted_sum == 100