Documentation

Complexity.Crypto.Computational.Homomorphic.FixedKey.Bootstrapping

Fully homomorphic encryption from a circular-secure bootstrappable scheme #

One sampled base key and its self-encrypted secret define a fixed-key scheme permitting every finite Boolean circuit, without a depth parameter in key generation. The actual algorithms have perfect correctness, unchanged polynomial secret and ciphertext widths, polynomial decryption circuits, uniform native efficiency and IND-CPA security. FixedKey.evaluate_spec additionally allows prior evaluation outputs as inputs and preserves their width and plaintext under that same key.

The input assumptions concern the base scheme and its actual decryption circuits. In particular, Encryption.CircularSecure is the explicit joint one-key real-versus-zero experiment, in addition to ordinary base IND-CPA. This is a conditional bootstrapping construction, not an instantiation of the premises by a concrete lattice scheme. No circuit privacy or exact concrete-security loss is asserted.

Main results #

References #

theorem Cslib.Crypto.Homomorphic.FixedKey.fullyHomomorphic {E : Scheme} {secretWidth ciphertextWidth : ℕ → ℕ} (D : DecryptionCircuits E secretWidth ciphertextWidth) (hE : E.Correct) (hwidth : E.FixedWidth secretWidth ciphertextWidth) (hboot : Scheme.Bootstrappable D) (hsecure : Encryption.INDCPA E.keyGen E.encrypt) (hcircular : Encryption.CircularSecure E.keyGen E.encrypt) (hkeyGen : Probability.IsPPTOn Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBits) E.keyGen) (hencrypt : Probability.IsPPTOn (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBool)) Turing.MultiTapeTM.encBits fun (p : ℕ × List Bool × Bool) => E.encrypt p.1 p.2.1 p.2.2) (hevaluate : Probability.IsPPTOn (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits (Turing.MultiTapeTM.encPair (Circuits.Boolean.encCircuit 1) (Turing.MultiTapeTM.encList Turing.MultiTapeTM.encBits)))) Turing.MultiTapeTM.encBits fun (p : ℕ × List Bool × ((n : ℕ) × Circuits.Circuit Circuits.Boolean.signature n 1) × List (List Bool)) => E.evaluate p.1 p.2.1 p.2.2.1 p.2.2.2) (hD : Turing.MultiTapeTM.ComputableTidilyInPolyTime (fun (n : ℕ) => ⟨secretWidth n + ciphertextWidth n, D.circuit n⟩) Turing.MultiTapeTM.encUnary (Circuits.Boolean.encCircuit 1)) :
have F := scheme D; F.Correct ∧ (∀ (n : ℕ) (c : (m : ℕ) × Circuits.Circuit Circuits.Boolean.signature m 1), F.permitted n c) ∧ F.FixedWidth secretWidth ciphertextWidth ∧ PolynomiallyBounded secretWidth ∧ PolynomiallyBounded ciphertextWidth ∧ (PolynomiallyBounded fun (n : ℕ) => ((decryptionCircuits D).circuit n).size) ∧ Probability.IsPPTOn Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBits) F.keyGen ∧ (Probability.IsPPTOn (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBool)) Turing.MultiTapeTM.encBits fun (p : ℕ × List Bool × Bool) => F.encrypt p.1 p.2.1 p.2.2) ∧ Turing.MultiTapeTM.ComputableTidilyInPolyTime (fun (p : ℕ × List Bool × List Bool) => F.decrypt p.1 p.2.1 p.2.2) (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBits)) Turing.MultiTapeTM.encBool ∧ (Probability.IsPPTOn (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits (Turing.MultiTapeTM.encPair (Circuits.Boolean.encCircuit 1) (Turing.MultiTapeTM.encList Turing.MultiTapeTM.encBits)))) Turing.MultiTapeTM.encBits fun (p : ℕ × List Bool × ((n : ℕ) × Circuits.Circuit Circuits.Boolean.signature n 1) × List (List Bool)) => F.evaluate p.1 p.2.1 p.2.2.1 p.2.2.2) ∧ Encryption.INDCPA F.keyGen F.encrypt

A circular-secure bootstrappable base scheme yields one compact, efficient, IND-CPA scheme for all finite Boolean circuits. All conclusions refer to scheme D; its key generator takes only the security parameter, and its decryption circuits are exactly those generated by D. The stronger evaluate_spec also certifies arbitrary repeated evaluation.