TFHE-rs includes features to reduce the size of both keys and ciphertexts, by compressing them. Most TFHE-rs entities contain random numbers generated by a Pseudo Random Number Generator (PRNG). A PRNG is deterministic, therefore storing only the random seed used to generate those numbers is enough to keep all the required information: using the same PRNG and the same seed, the full chain of random values can be reconstructed when decompressing the entity.
In the library, entities that can be compressed are prefixed by Compressed. For instance, the type of a compressed FheUint256 is CompressedFheUint256.
In the following example code, we use the bincode crate dependency to serialize in a binary format and compare serialized sizes.
Compressed ciphertexts
This example shows how to compress a ciphertext encypting messages over 16 bits.
This example shows how to compress the server keys.
use tfhe::prelude::*;use tfhe::{ generate_keys, set_server_key, ClientKey, CompressedServerKey, ConfigBuilder, FheUint8,};fnmain() {let config =ConfigBuilder::default().build();let cks =ClientKey::generate(config);let compressed_sks =CompressedServerKey::new(&cks);println!("compressed size : {}", bincode::serialize(&compressed_sks).unwrap().len() );let sks = compressed_sks.decompress();println!("decompressed size: {}", bincode::serialize(&sks).unwrap().len() );set_server_key(sks);let clear_a =12u8;let a =FheUint8::try_encrypt(clear_a, &cks).unwrap();let c = a +234u8;let decrypted:u8= c.decrypt(&cks);assert_eq!(decrypted, clear_a.wrapping_add(234));}
Compressed public keys
This example shows how to compress the classical public keys.
It is not currently recommended to use the CompressedPublicKey to encrypt ciphertexts without first decompressing it. In case the resulting PublicKey is too large to fit in memory the encryption with the CompressedPublicKey will be very slow, this is a known problem and will be addressed in future releases.