Homomorphic refresh from decryption circuits #
Gentry's refresh algorithm encrypts the public bits of an old ciphertext and evaluates a decryption circuit using those encryptions and an encrypted old secret key. Connecting two decryption circuits to NAND derives a homomorphic NAND operation [Gentry2009, Section 2].
The old ciphertexts need only have the declared width: they may be outputs of earlier homomorphic evaluations. The base evaluation guarantee applies because its immediate inputs are fresh encryptions of bits. The two copies of the encrypted secret key may be identical.
Bootstrappable asserts membership of the actual circuits in the permitted set. Refresh is
constructed below, and its correctness is proved rather than bundled into that assumption.
These results establish functional correctness and fixed output width. They do not yet establish
uniform polynomial running time, a leveled evaluator, IND-CPA security, or fixed-key FHE.
Main definitions #
Cslib.Crypto.Homomorphic.DecryptionCircuits: circuits computing the base decryption algorithm.Cslib.Crypto.Homomorphic.Scheme.Bootstrappable: permitted decryption and NAND augmentations.Cslib.Crypto.Homomorphic.Scheme.refresh,.refreshNand: explicit probabilistic programs.
Main results #
Cslib.Crypto.Homomorphic.Scheme.decrypt_refresh: refresh preserves the decrypted bit.Cslib.Crypto.Homomorphic.Scheme.decrypt_refreshNand: NAND refresh computes NAND of decrypted bits, including for old ciphertexts outside the support of fresh encryption.Cslib.Crypto.Homomorphic.Scheme.length_refresh,.length_refreshNand: refreshed ciphertexts have the same width as base ciphertexts, independent of prior evaluation depth.
References #
Actual circuits computing decryption on the specified fixed-width inputs. Existence alone does not certify uniform circuit generation; that is a separate computational obligation.
- circuit (n : ℕ) : Circuits.Circuit Circuits.Boolean.signature (secretWidth n + ciphertextWidth n) 1
Secret-key bits precede ciphertext bits.
- correct (n : ℕ) (sk c : List Bool) : sk.length = secretWidth n → c.length = ciphertextWidth n → (self.circuit n).eval Circuits.Boolean.interpretation (BitString.ofList (secretWidth n + ciphertextWidth n) (sk ++ c)) 0 = E.decrypt n sk c
The circuit computes decryption on all well-sized keys and ciphertexts, including outputs of earlier homomorphic evaluations.
Instances For
Gentry's permitted-circuit condition for identity and NAND augmentations. This condition does not postulate a refresh algorithm or a correctness theorem for one.
The identity augmentation is the decryption circuit itself.
- nand_mem (n : ℕ) : E.permitted n ⟨secretWidth n + ciphertextWidth n + (secretWidth n + ciphertextWidth n), augmentNand (D.circuit n)⟩
NAND of two decryptions is permitted by the base evaluator.
Instances For
Refresh an old ciphertext using its public bits and an encrypted old secret key.
Instances For
Refresh and NAND two old ciphertexts. The same encrypted secret key is used in both blocks.
Instances For
Refresh preserves decryption of every well-sized old ciphertext, whether fresh or evaluated.
NAND refresh computes NAND of the old decryptions. No fresh-encryption hypothesis is needed for either old ciphertext, and the encrypted secret key is shared between the two input blocks.
Refresh has the same output width as the base scheme.
NAND refresh has the same output width as the base scheme, independent of prior depth.