This document covers how to compute on encrypted data homomorphically using the Concrete framework. We will walk you through a complete example step-by-step.
The basic workflow of computation is as follows:
Define the function you want to compute
Compile the function into a Concrete Circuit
Use the Circuit
to perform homomorphic evaluation
Here is the complete example, which we will explain step by step in the following paragraphs.
Another simple way to compile a function is to use a decorator.
This decorator is a way to add the compile
method to the function object without changing its name elsewhere.
Import the fhe
module, which includes everything you need to perform homomorphic evaluation:
Here we define a simple addition function:
To compile the function, you first need to create a Compiler
by specifying the function to compile and the encryption status of its inputs:
For instance, to set the input y as clear:
An inputset is a collection representing the typical inputs of the function. It is used to determine the bit widths and shapes of the variables within the function.
The inputset should be an iterable that yields tuples of the same length as the number of arguments of the compiled function.
For example:
Here, our inputset consists of 10 integer pairs, ranging from a minimum of (0, 0)
to a maximum of (7, 7)
.
Choosing a representative inputset is critical to allow the compiler to find accurate bounds of all the intermediate values (see more details here). Evaluating the circuit with input values under or over the bounds may result in undefined behavior.
You can use the fhe.inputset(...)
function to easily create random inputsets, see more details in this documentation.
Use the compile
method of the Compiler
class with an inputset to perform the compilation and get the resulting circuit:
Use the keygen
method of the Circuit
class to generate the keys (public and private):
If you don't call the key generation explicitly, keys will be generated lazily when needed.
Now you can easily perform the homomorphic evaluation using the encrypt
, run
and decrypt
methods of the Circuit
:
Zama 5-Question Developer Survey
We want to hear from you! Take 1 minute to share your thoughts and helping us enhance our documentation and libraries. 👉 Click here to participate.