Crates.io | concrete-core-experimental |
lib.rs | concrete-core-experimental |
version | 1.0.0-beta |
source | src |
created_at | 2022-07-06 18:40:42.621032 |
updated_at | 2022-07-06 18:40:42.621032 |
description | Concrete is a fully homomorphic encryption (FHE) library that implements Zama's variant of TFHE. |
homepage | https://crates.io/crates/concrete |
repository | https://github.com/zama-ai/concrete-core |
max_upload_size | |
id | 620679 |
size | 5,921,924 |
This crate contains low-level implementations of homomorphic operators used in the
concrete
library.
This crate assumes that the user is comfortable with the theory behind FHE. If you prefer to use a
simpler API, that will perform sanity checks on your behalf, the higher-level concrete
crate should have your back.
Here is a small example of how one could use concrete-core
to perform a simple operation
homomorphically:
// This examples shows how to multiply a secret value by a public one homomorphically. First
// we import the proper symbols:
use concrete_core::crypto::encoding::{RealEncoder, Cleartext, Encoder, Plaintext};
use concrete_core::crypto::secret::LweSecretKey;
use concrete_core::crypto::LweDimension;
use concrete_core::crypto::lwe::LweCiphertext;
use concrete_core::math::dispersion::LogStandardDev;
// We initialize an encoder that will allow us to turn cleartext values into plaintexts.
let encoder = RealEncoder{offset: 0., delta: 100.};
// Our secret value will be 10.,
let cleartext = Cleartext(10.);
let public_multiplier = Cleartext(5);
// We encode our cleartext
let plaintext = encoder.encode(cleartext);
// We generate a new secret key which is used to encrypt the message
let secret_key_size = LweDimension(710);
let secret_key = LweSecretKey::generate(secret_key_size);
// We allocate a ciphertext and encrypt the plaintext with a secure parameter
let mut ciphertext = LweCiphertext::allocate(0u32, secret_key_size.to_lwe_size());
secret_key.encrypt_lwe(
&mut ciphertext,
&plaintext,
LogStandardDev::from_log_standard_dev(-17.)
);
// We perform the homomorphic operation:
ciphertext.update_with_scalar_mul(public_multiplier);
// We decrypt the message
let mut output_plaintext = Plaintext(0u32);
secret_key.decrypt_lwe(&mut output_plaintext, &ciphertext);
let output_cleartext = encoder.decode(output_plaintext);
// We check that the result is as expected !
assert_eq!((output_cleartext.0 - 50.).abs() < 0.01);
This software is distributed under the BSD-3-Clause-Clear license. If you have any questions,
please contact us at hello@zama.ai
.