Documentation

VCVio.CryptoFoundations.SymmEncAlg

Symmetric Encryption Schemes #

This file defines SymmEncAlg m M K C, a monad-generic symmetric encryption scheme with message space M, key space K, and ciphertext space C.

The struct follows the same pattern as AsymmEncAlg, KEMScheme, MacAlg, etc.: it is parameterized by an ambient monad m and uses plain Type parameters. Asymptotic security statements are expressed externally by quantifying over a family (sp : ℕ) → SymmEncAlg m (M sp) (K sp) (C sp).

Perfect secrecy is captured by perfectSecrecyAt (the canonical independence form), with equivalent formulations perfectSecrecyPosteriorEqPriorAt (cross-multiplied posterior/prior form) and perfectSecrecyJointFactorizationAt (factorization with named marginals); the _iff_ lemmas record the equivalences. perfectSecrecyAtAllPriors is the strong PMF-level quantification, equivalent to ciphertextRowsEqualAt over finite message spaces.

structure SymmEncAlg (m : TypeType u) [Monad m] (M K C : Type) :

A monad-generic symmetric encryption scheme over an ambient monad m, with message space M, key space K, and ciphertext space C.

  • keygen : m K

    Sample a key.

  • encrypt : KMm C

    Encrypt a message under a key.

  • decrypt : KCm (Option M)

    Decrypt a ciphertext under a key, returning none on failure.

Instances For
    def SymmEncAlg.CompleteExp {m : TypeType u} [Monad m] {M K C : Type} (encAlg : SymmEncAlg m M K C) (msg : M) :
    m (Option M)

    Round-trip experiment: sample a key, encrypt msg, then decrypt; used to state correctness via Complete.

    Instances For
      def SymmEncAlg.Complete {m : TypeType u} [Monad m] {M K C : Type} [MonadLiftT m PMF] [LawfulMonadLiftT m PMF] (encAlg : SymmEncAlg m M K C) :

      An encryption scheme is complete if decryption recovers every message with probability 1.

      Instances For
        def SymmEncAlg.PerfectSecrecyExp {m : TypeType u} [Monad m] {M K C : Type} (encAlg : SymmEncAlg m M K C) (mgen : m M) :
        m (M × C)

        Joint message/ciphertext experiment used to express perfect secrecy.

        Instances For
          def SymmEncAlg.PerfectSecrecyCipherExp {m : TypeType u} [Monad m] {M K C : Type} (encAlg : SymmEncAlg m M K C) (mgen : m M) :
          m C

          Ciphertext marginal induced by the perfect-secrecy experiment.

          Instances For
            def SymmEncAlg.PerfectSecrecyCipherGivenMsgExp {m : TypeType u} [Monad m] {M K C : Type} (encAlg : SymmEncAlg m M K C) (msg : M) :
            m C

            Ciphertext experiment conditioned on a fixed message.

            Instances For
              theorem SymmEncAlg.PerfectSecrecyExp_eq_bind {m : TypeType u} [Monad m] {M K C : Type} [LawfulMonad m] (encAlg : SymmEncAlg m M K C) (mgen : m M) :
              encAlg.PerfectSecrecyExp mgen = do let msgmgen (fun (x : C) => (msg, x)) <$> encAlg.PerfectSecrecyCipherGivenMsgExp msg
              theorem SymmEncAlg.PerfectSecrecyCipherExp_eq_bind {m : TypeType u} [Monad m] {M K C : Type} [LawfulMonad m] (encAlg : SymmEncAlg m M K C) (mgen : m M) :
              encAlg.PerfectSecrecyCipherExp mgen = do let msgmgen encAlg.PerfectSecrecyCipherGivenMsgExp msg
              theorem SymmEncAlg.probOutput_PerfectSecrecyExp_eq_mul_cipherGivenMsg {m : TypeType u} [Monad m] {M K C : Type} [MonadLiftT m PMF] [LawfulMonadLiftT m PMF] [LawfulMonad m] (encAlg : SymmEncAlg m M K C) (mgen : m M) (msg : M) (σ : C) :
              Pr[= (msg, σ) | encAlg.PerfectSecrecyExp mgen] = Pr[= msg | mgen] * Pr[= σ | encAlg.PerfectSecrecyCipherGivenMsgExp msg]
              theorem SymmEncAlg.probOutput_PerfectSecrecyCipherExp_eq_tsum {m : TypeType u} [Monad m] {M K C : Type} [MonadLiftT m PMF] [LawfulMonadLiftT m PMF] [LawfulMonad m] (encAlg : SymmEncAlg m M K C) (mgen : m M) (σ : C) :
              Pr[= σ | encAlg.PerfectSecrecyCipherExp mgen] = ∑' (msg : M), Pr[= msg | mgen] * Pr[= σ | encAlg.PerfectSecrecyCipherGivenMsgExp msg]
              def SymmEncAlg.perfectSecrecyAtAllPriors {m : TypeType u} [Monad m] {M K C : Type} [MonadLiftT m PMF] (encAlg : SymmEncAlg m M K C) :

              Strong perfect secrecy: ciphertexts are independent of messages for every prior distribution on messages (PMF-level quantification).

              Instances For
                def SymmEncAlg.ciphertextRowsEqualAt {m : TypeType u} [Monad m] {M K C : Type} [MonadLiftT m PMF] (encAlg : SymmEncAlg m M K C) :

                Equivalent channel-style formulation: every message induces the same ciphertext distribution.

                Instances For

                  Over a finite message space, strong perfect secrecy is equivalent to all ciphertext rows being equal.

                  def SymmEncAlg.perfectSecrecyAt {m : TypeType u} [Monad m] {M K C : Type} [MonadLiftT m PMF] (encAlg : SymmEncAlg m M K C) :

                  Standard perfect secrecy expressed as independence: Pr[(M, C)] = Pr[M] * Pr[C].

                  Instances For
                    def SymmEncAlg.perfectSecrecyPosteriorEqPriorAt {m : TypeType u} [Monad m] {M K C : Type} [MonadLiftT m PMF] (encAlg : SymmEncAlg m M K C) :

                    Posterior-equals-prior form, written in cross-multiplied form to avoid division.

                    Instances For
                      def SymmEncAlg.perfectSecrecyJointFactorizationAt {m : TypeType u} [Monad m] {M K C : Type} [MonadLiftT m PMF] (encAlg : SymmEncAlg m M K C) :

                      Joint-factorization form (same mathematical statement as independence, with explicit named priors/marginals).

                      Instances For
                        theorem SymmEncAlg.cipherGivenMsg_uniform_of_uniformKey_of_uniqueKey {m : TypeType u} [Monad m] {M K C : Type} [MonadLiftT m PMF] [LawfulMonadLiftT m PMF] [MonadLiftT m SetM] [EvalDistCompatible m] (encAlg : SymmEncAlg m M K C) [Fintype K] (deterministicEnc : ∀ (k : K) (msg : M), ∃ (c : C), support (encAlg.encrypt k msg) = {c}) (hKeyUniform : ∀ (k : K), Pr[= k | encAlg.keygen] = (↑(Fintype.card K))⁻¹) (hUniqueKey : ∀ (msg : M) (c : C), ∃! k : K, k support encAlg.keygen c support (encAlg.encrypt k msg)) (msg : M) (σ : C) :

                        Core uniformity lemma: uniform keygen plus unique key per (message, ciphertext) pair implies every (message, ciphertext) conditional has probability (card K)⁻¹. Both Shannon theorems follow from this.

                        theorem SymmEncAlg.ciphertextRowsEqualAt_of_uniformKey_of_uniqueKey {m : TypeType u} [Monad m] {M K C : Type} [MonadLiftT m PMF] [LawfulMonadLiftT m PMF] [MonadLiftT m SetM] [EvalDistCompatible m] (encAlg : SymmEncAlg m M K C) [Fintype K] (deterministicEnc : ∀ (k : K) (msg : M), ∃ (c : C), support (encAlg.encrypt k msg) = {c}) (hKeyUniform : ∀ (k : K), Pr[= k | encAlg.keygen] = (↑(Fintype.card K))⁻¹) (hUniqueKey : ∀ (msg : M) (c : C), ∃! k : K, k support encAlg.keygen c support (encAlg.encrypt k msg)) :
                        theorem SymmEncAlg.perfectSecrecyAt_of_uniformKey_of_uniqueKey {m : TypeType u} [Monad m] {M K C : Type} [MonadLiftT m PMF] [LawfulMonadLiftT m PMF] [MonadLiftT m SetM] [EvalDistCompatible m] [LawfulMonad m] (encAlg : SymmEncAlg m M K C) [Fintype K] (deterministicEnc : ∀ (k : K) (msg : M), ∃ (c : C), support (encAlg.encrypt k msg) = {c}) :
                        ((∀ (k : K), Pr[= k | encAlg.keygen] = (↑(Fintype.card K))⁻¹) ∀ (msg : M) (c : C), ∃! k : K, k support encAlg.keygen c support (encAlg.encrypt k msg)) → encAlg.perfectSecrecyAt

                        Constructive Shannon direction: if keygen is uniform and each (message, ciphertext) pair is realized by a unique key in support, then perfect secrecy holds.

                        deterministicEnc asserts encryption is deterministic in distribution (singleton support for each fixed (key, message)).

                        theorem SymmEncAlg.perfectSecrecyAtAllPriors_of_uniformKey_of_uniqueKey {m : TypeType u} [Monad m] {M K C : Type} [MonadLiftT m PMF] [LawfulMonadLiftT m PMF] [MonadLiftT m SetM] [EvalDistCompatible m] (encAlg : SymmEncAlg m M K C) [Finite M] [Fintype K] (deterministicEnc : ∀ (k : K) (msg : M), ∃ (c : C), support (encAlg.encrypt k msg) = {c}) :
                        ((∀ (k : K), Pr[= k | encAlg.keygen] = (↑(Fintype.card K))⁻¹) ∀ (msg : M) (c : C), ∃! k : K, k support encAlg.keygen c support (encAlg.encrypt k msg)) → encAlg.perfectSecrecyAtAllPriors

                        Constructive Shannon direction for all priors: uniform keys plus uniqueness imply perfect secrecy for all prior distributions on messages.