Documentation

Complexity.Crypto.Computational.CollisionResistant

Keyed collision-resistant hash families and compression functions #

In the uniform PPT model, an unkeyed deterministic function H : List Bool → List Bool with unrestricted inputs (valid := fun _ _ => true, or any domain predicate that accepts a fixed pair at every security parameter n) cannot be collision-resistant whenever a single colliding pair (m₁, m₂) exists, because one uniform algorithm can hardcode (m₁, m₂) as a constant and win for every n. (In the length-indexed compression setting validCompressionInput n x := (x.length == 2 * n), by contrast, a single hardcoded pair has fixed length and is valid at most at one parameter n.) Standard uniform formulations therefore index both compression and hash families H : List Bool → List Bool → List Bool by a public key k ← {0, 1}^n sampled uniformly at security parameter n; the adversary receives (1^n, k) and wins by outputting a pair (m₁, m₂) of valid inputs with m₁ ≠ m₂ and H k m₁ = H k m₂ ([BS23], Sections 8.1–8.2; [KL20], Section 5.1).

Parameterizing the experiment by a validity predicate valid : ℕ → List Bool → Bool accommodates both fixed-input-length compression families (validCompressionInput n x := (x.length == 2 * n), mapping 2n-bit inputs to n-bit outputs under an n-bit key) and arbitrary-input-length hash families (valid := fun _ _ => true).

Main definitions #

Main results #

References #

@[reducible, inline]

A collision finder receives the unary security parameter n and public hash key k and outputs a pair (m₁, m₂) of candidate colliding messages.

Instances For
    def Cslib.Crypto.isCollision (H : List Bool → List Bool → List Bool) (valid : ℕ → List Bool → Bool) (n : ℕ) (k m₁ m₂ : List Bool) :

    Test whether (m₁, m₂) is a valid collision for H k at security parameter n under the domain predicate valid.

    Instances For
      @[simp]
      theorem Cslib.Crypto.isCollision_eq_true_iff {H : List Bool → List Bool → List Bool} {valid : ℕ → List Bool → Bool} {n : ℕ} {k m₁ m₂ : List Bool} :
      isCollision H valid n k m₁ m₂ = true ↔ valid n m₁ = true ∧ valid n m₂ = true ∧ m₁ ≠ m₂ ∧ H k m₁ = H k m₂
      theorem Cslib.Crypto.isCollision_comm (H : List Bool → List Bool → List Bool) (valid : ℕ → List Bool → Bool) (n : ℕ) (k m₁ m₂ : List Bool) :
      isCollision H valid n k m₁ m₂ = isCollision H valid n k m₂ m₁

      Collision testing is symmetric in the two candidate messages.

      @[simp]
      theorem Cslib.Crypto.isCollision_self (H : List Bool → List Bool → List Bool) (valid : ℕ → List Bool → Bool) (n : ℕ) (k m : List Bool) :
      isCollision H valid n k m m = false
      noncomputable def Cslib.Crypto.collisionGame (H : List Bool → List Bool → List Bool) (valid : ℕ → List Bool → Bool) (adversary : CollisionFinder) (n : ℕ) :

      The keyed collision-finding experiment: sample a uniform n-bit key k, run adversary n k to obtain a candidate pair (m₁, m₂), and accept when isCollision H valid n k m₁ m₂ holds.

      Instances For

        Collision resistance of a keyed hash family H on the valid input domain valid: every uniform strict PPT collision finder has negligible success probability.

        Instances For
          @[reducible, inline]

          Unrestricted collision resistance on all bit strings List Bool.

          Instances For

            Collision resistance gives negligible collision-finding probability for every strict PPT adversary.

            Establish collision resistance by bounding every strict PPT adversary's success probability.

            theorem Cslib.Crypto.succProbability_collisionGame_le_of_extract {H₁ H₂ : List Bool → List Bool → List Bool} {valid₁ valid₂ : ℕ → List Bool → Bool} (extract : ℕ → List Bool → List Bool → List Bool → List Bool × List Bool) (adversary : CollisionFinder) (n : ℕ) (himp : ∀ (k : List Bool), k.length = n → ∀ (m₁ m₂ : List Bool), isCollision H₁ valid₁ n k m₁ m₂ = true → isCollision H₂ valid₂ n k (extract n k m₁ m₂).1 (extract n k m₁ m₂).2 = true) :
            Game.succProbability (collisionGame H₁ valid₁ adversary n).eval ≤ Game.succProbability (collisionGame H₂ valid₂ (fun (m : ℕ) (k : List Bool) => do let pair ← adversary m k pure (extract m k pair.1 pair.2)) n).eval

            If a deterministic map extract turns every valid H₁-collision under an n-bit key k into a valid H₂-collision under k, then postprocessing adversary by extract at parameter n never decreases the collision success probability.

            theorem Cslib.Crypto.CollisionResistantOn.of_extract {H₁ H₂ : List Bool → List Bool → List Bool} {valid₁ valid₂ : ℕ → List Bool → Bool} (hCR : CollisionResistantOn H₂ valid₂) (extract : ℕ → List Bool → List Bool → List Bool → List Bool × List Bool) (hextract : Turing.MultiTapeTM.ComputableInPolyTime (fun (p : ℕ × List Bool × List Bool × List Bool) => extract p.1 p.2.1 p.2.2.1 p.2.2.2) (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encUnary (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBits))) (Turing.MultiTapeTM.encPair Turing.MultiTapeTM.encBits Turing.MultiTapeTM.encBits)) (himp : ∀ᶠ (n : ℕ) in Filter.atTop, ∀ (k : List Bool), k.length = n → ∀ (m₁ m₂ : List Bool), isCollision H₁ valid₁ n k m₁ m₂ = true → isCollision H₂ valid₂ n k (extract n k m₁ m₂).1 (extract n k m₁ m₂).2 = true) :
            CollisionResistantOn H₁ valid₁

            Deterministic collision-extraction reduction: if a polynomial-time function extract turns every H₁-collision at parameter n (for all sufficiently large n and n-bit keys k) into an H₂-collision under the same key k, then collision resistance of H₂ implies collision resistance of H₁.

            theorem Cslib.Crypto.CollisionResistantOn.mono {H : List Bool → List Bool → List Bool} {valid₁ valid₂ : ℕ → List Bool → Bool} (hCR : CollisionResistantOn H valid₂) (hsub : ∀ᶠ (n : ℕ) in Filter.atTop, ∀ (m : List Bool), valid₁ n m = true → valid₂ n m = true) :

            Restricting the valid input domain preserves collision resistance.

            Finding collisions with probability bounded away from zero refutes collision resistance: a strict PPT adversary whose success probability is at least a fixed c > 0 at every security parameter.

            Validity predicate for a fixed-input-length 2n → n compression family: at security parameter n, valid inputs have length 2 * n.

            Instances For

              A keyed 2n → n collision-resistant compression family ([BS23], Section 8.2): computable in deterministic polynomial time, mapping 2n-bit inputs under an n-bit key to n-bit outputs, and collision-resistant on 2n-bit inputs.

              Instances For

                A keyed collision-resistant hash family on arbitrary-length bit strings (List Bool), mapping every message under an n-bit key to an n-bit digest.

                Instances For