Foundations, Operations & Research

Security has a rigorous side and a practical side. This page covers the formal foundations — how cryptographers prove a scheme is secure and how those proofs compose into larger systems — and the research frontiers reshaping both attack and defense, from secure multi-party computation and differential privacy to the quantum threat and AI on both sides of the fight. It also serves as the hub for the operational disciplines that grew out of this material: incident response, security operations, and compliance and governance now each have their own dedicated page, linked below.

The Operations Disciplines

The day-to-day practice of running security used to live on this page. It has been split into three focused guides, each covering one discipline end to end. Start here when you need the practical playbooks.

Guide What it covers
Incident Response & Forensics The IR lifecycle (NIST SP 800-61 / SANS PICERL), the first critical minutes after detection, digital forensics, chain of custody, blameless post-mortems, and MTTD/MTTR metrics
Security Operations Building and running a SOC: SIEM log pipelines, detection engineering with MITRE ATT&CK, continuous monitoring, threat hunting, and offensive validation via pentests and red/blue/purple teaming
Compliance & Governance Turning security into a program: GDPR and PCI DSS, SOC 2 and ISO 27001 attestation, risk assessment, the human firewall, and the KPIs and maturity models that prove it works

Formal Security: Proving Systems Safe

How do we know our security measures actually work? This is where formal security models come in—mathematical frameworks that prove security properties. Rather than testing a scheme against the attacks we happen to think of, a security proof establishes a guarantee against every attacker in a defined class, reducing the security of the scheme to a problem we believe is hard (like factoring or computing discrete logarithms). The two cornerstones are the security game, which defines what “secure” means for a single primitive, and the composability frameworks, which let us reason about whole systems built from many primitives.

Security Games: Defining What “Secure” Means

A security definition is an experiment (a “game”) played between a challenger and an adversary $\mathcal{A}$. The challenger sets up the scheme and answers the adversary’s queries; the adversary tries to break some property. The scheme is secure if no efficient adversary can win the game with probability meaningfully better than guessing. The canonical example is IND-CPA (indistinguishability under chosen-plaintext attack): an encryption scheme is IND-CPA secure if an adversary, given the encryption of one of two messages it chose itself, cannot tell which message was encrypted.

# IND-CPA Game (Indistinguishability under Chosen Plaintext Attack)
def ind_cpa_game(encryption_scheme, adversary):
    # 1. Generate keys
    public_key, private_key = encryption_scheme.generate_keys()

    # 2. Adversary can encrypt anything they want
    # (simulating real-world where attacker can trigger encryptions)

    # 3. Adversary chooses two messages
    m0, m1 = adversary.choose_messages(public_key)

    # 4. We randomly encrypt one of them
    b = random.choice([0, 1])
    ciphertext = encryption_scheme.encrypt(public_key, [m0, m1][b])

    # 5. Adversary tries to guess which one
    guess = adversary.guess(ciphertext)

    # 6. Adversary wins if they guess correctly
    return guess == b

# Secure if: Pr[adversary wins] ≈ 1/2 (random guessing)
# If adversary can win significantly more than 50%, encryption is broken!

The security goal is captured by the adversary’s advantage — how much better than a coin flip it does:

\[\mathrm{Adv}^{\mathrm{IND\text{-}CPA}}_{\mathcal{A}} = \left\lvert \Pr[\text{guess} = b] - \tfrac{1}{2} \right\rvert\]

A scheme is IND-CPA secure if this advantage is negligible for every probabilistic polynomial-time adversary — that is, it shrinks faster than the inverse of any polynomial in the security parameter $\lambda$ (the key length). Formally, a function $\nu(\lambda)$ is negligible if for every constant $c$ there is an $N$ such that $\nu(\lambda) < \lambda^{-c}$ for all $\lambda > N$:

\[\forall c > 0 \ \ \exists N \ \ \forall \lambda > N: \ \nu(\lambda) < \lambda^{-c}\]

This “negligible advantage against any efficient adversary” template generalizes far beyond encryption. The same structure defines:

  • IND-CCA — like IND-CPA but the adversary also gets a decryption oracle (it may decrypt any ciphertext except the challenge), modeling attackers who can probe a system’s responses. This is the right notion for real protocols like TLS.
  • EUF-CMA (existential unforgeability under chosen-message attack) — for signatures and MACs: the adversary, after requesting signatures on messages of its choice, cannot produce a valid signature on any new message.
  • Pseudorandomness — a PRF is secure if no adversary can distinguish its outputs from those of a truly random function, given oracle access to one or the other.

Most proofs proceed by reduction: assume an adversary $\mathcal{A}$ breaks the scheme with non-negligible advantage, then build an algorithm $\mathcal{B}$ that uses $\mathcal{A}$ as a subroutine to solve a problem assumed hard (factoring, discrete log, LWE). Because the hard problem is believed intractable, no such $\mathcal{A}$ can exist. A closely related technique, the hybrid argument, proves indistinguishability between two distributions by interpolating a sequence of intermediate “hybrid” games, each negligibly close to the next, so the endpoints are negligibly close overall.

Universal Composability: Building Secure Systems

A scheme proven secure in isolation can still fail when combined with others — its proof only guarantees security in the specific stand-alone game it was analyzed in. Real systems run many protocols concurrently, sharing state and feeding each other’s outputs as inputs. The Universal Composability (UC) framework, introduced by Ran Canetti, gives security definitions that survive arbitrary composition.

The core idea is the real/ideal paradigm. We define an ideal functionality $\mathcal{F}$ — an incorruptible trusted party that simply does the right thing (e.g., “receive both inputs, return only the agreed output”). A protocol $\pi$ UC-realizes $\mathcal{F}$ if no environment $\mathcal{Z}$ — an adversarial program that chooses inputs, sees outputs, and interacts with everything — can distinguish between two worlds:

  • the real world, where parties run $\pi$ against a real adversary, and
  • the ideal world, where parties just hand inputs to $\mathcal{F}$ and a simulator $\mathcal{S}$ tries to fake the adversary’s view.
flowchart TB
    Z["Environment Z<br/>(chooses inputs, sees outputs)"]
    subgraph REAL["Real world"]
        P["Parties run protocol π"]
        A["Adversary A"]
    end
    subgraph IDEAL["Ideal world"]
        F["Ideal functionality F<br/>(trusted, does the right thing)"]
        Sim["Simulator S<br/>(fakes A's view)"]
    end
    Z --> REAL
    Z --> IDEAL
    P <--> A
    F <--> Sim
    REAL -. "Z cannot tell which world it is in" .- IDEAL
\[\forall \mathcal{A}\ \exists \mathcal{S}\ \forall \mathcal{Z}: \quad \mathrm{REAL}_{\pi,\mathcal{A},\mathcal{Z}} \ \approx_c\ \mathrm{IDEAL}_{\mathcal{F},\mathcal{S},\mathcal{Z}}\]

If the environment cannot tell the two apart ($\approx_c$ denotes computational indistinguishability), then $\pi$ leaks nothing the ideal functionality wouldn’t — whatever else is running alongside it. That last clause is the payoff: the UC composition theorem guarantees that if $\pi$ securely realizes $\mathcal{F}$, you may replace any call to $\mathcal{F}$ inside a larger protocol with $\pi$ and the larger protocol stays secure.

# Example: Secure voting system combining multiple protocols
# - Encryption (for ballot privacy)
# - Digital signatures (for voter authentication)
# - Zero-knowledge proofs (to verify vote validity)
# - Commitment schemes (to prevent vote changing)

# UC Framework proves: If each component UC-realizes its ideal
# functionality, the combined system also UC-realizes the ideal
# "secure voting" functionality — no fresh whole-system proof needed.

This modularity is what makes large secure systems tractable to reason about: prove each building block once against its ideal functionality, then compose freely. The cost is that UC is a demanding standard — many natural protocols are not UC-secure without extra setup assumptions such as a common reference string or trusted hardware, a limitation made precise by impossibility results for UC commitments and zero-knowledge in the plain model.

Research Frontiers

Beyond the established foundations, several research areas are actively reshaping what security can deliver. Each tackles a problem that classical cryptography couldn’t: computing on data you’re not allowed to see, learning from data without exposing individuals, distributing trust without a central authority, or surviving the arrival of quantum computers.

Secure Multi-Party Computation

Imagine multiple hospitals wanting to collaborate on cancer research without sharing patient data. Secure multi-party computation (MPC) lets a set of parties jointly compute a function over their private inputs while revealing only the output — no party learns anything about another’s input beyond what the result itself implies.

# Each hospital has private patient data
hospital_a_data = [patient_records_a]
hospital_b_data = [patient_records_b]
hospital_c_data = [patient_records_c]

# Using MPC, they can compute statistics without sharing data
result = secure_multiparty_computation(
    function="calculate_treatment_effectiveness",
    inputs=[hospital_a_data, hospital_b_data, hospital_c_data]
)

# Each hospital learns only the final result
# No individual patient data is ever shared!

The classic illustration is Yao’s Millionaires’ Problem: two millionaires want to learn who is richer without revealing their actual wealth. The two foundational techniques are Yao’s garbled circuits (one party encrypts a boolean circuit so the other can evaluate it without learning intermediate wire values) and secret-sharing-based protocols in the GMW / BGW line, where each input is split into shares such that any unauthorized subset of parties learns nothing. A common building block is Shamir secret sharing, which splits a secret $s$ into $n$ shares using a random degree-$(t-1)$ polynomial $f$ with $f(0) = s$; any $t$ shares reconstruct $s$ by Lagrange interpolation, while any $t-1$ reveal nothing:

\[f(x) = s + a_1 x + a_2 x^2 + \cdots + a_{t-1} x^{t-1} \pmod{p}\]

Security models distinguish semi-honest adversaries (who follow the protocol but try to infer extra information) from malicious adversaries (who deviate arbitrarily); the latter requires more expensive protocols with consistency checks. MPC is no longer purely theoretical — it underpins privacy-preserving analytics, private set intersection (used in contact discovery and ad measurement), and threshold signing for cryptocurrency custody.

Differential Privacy

How can we publish useful statistics about a dataset while provably protecting every individual in it? Differential privacy (DP) answers this with a precise mathematical guarantee: the output of a computation should be almost the same whether or not any single person’s data is included. An adversary seeing the result therefore cannot confidently tell if you participated at all.

def differentially_private_average(data, epsilon=1.0):
    # Add carefully calibrated noise
    true_average = sum(data) / len(data)

    # Laplace noise scaled to sensitivity/epsilon
    sensitivity = max_value - min_value
    noise = numpy.random.laplace(0, sensitivity/epsilon)

    private_average = true_average + noise

    # Result is useful for analysis but doesn't reveal
    # information about any individual
    return private_average

Formally, a randomized mechanism $\mathcal{M}$ is $\varepsilon$-differentially private if for every pair of neighboring datasets $D$ and $D’$ (differing in one individual’s record) and every set of outputs $S$:

\[\Pr[\mathcal{M}(D) \in S] \le e^{\varepsilon}\,\Pr[\mathcal{M}(D') \in S]\]

The parameter $\varepsilon$ (the privacy budget) tunes the trade-off: smaller $\varepsilon$ means stronger privacy and noisier, less useful answers. The amount of noise needed depends on the query’s sensitivity $\Delta f$ — the most its output can change when one record is added or removed. The Laplace mechanism achieves $\varepsilon$-DP by adding noise drawn from $\mathrm{Laplace}(0, \Delta f / \varepsilon)$:

\[\mathcal{M}(D) = f(D) + \mathrm{Lap}\!\left(\frac{\Delta f}{\varepsilon}\right)\]

Two properties make DP composable and practical. Composition: running an $\varepsilon_1$- and an $\varepsilon_2$-private query yields at most $(\varepsilon_1 + \varepsilon_2)$-privacy, so a fixed budget can be spent across many queries. Post-processing: any function applied to a DP output stays DP, so released results can be freely analyzed without eroding the guarantee. DP is deployed at scale — the U.S. Census Bureau used it for the 2020 census, and Apple and Google use local DP (noise added on-device before data ever leaves) for telemetry.

Blockchain Security

Beyond cryptocurrency, blockchains enable security models that don’t depend on a single trusted authority. The core primitive is an append-only, tamper-evident ledger: each block commits to the previous block’s hash, so altering any historical record would change every subsequent hash and be immediately detectable.

# Transparent Certificate Authority
class BlockchainCA:
    def issue_certificate(self, domain, public_key):
        cert = {
            "domain": domain,
            "public_key": public_key,
            "timestamp": time.now(),
            "issuer": self.identity
        }

        # Add to public blockchain
        # Anyone can verify certificates
        # Impossible to issue fake certs without detection
        blockchain.add_block(cert)

The hard problem a blockchain solves is distributed consensus under adversarial conditions — getting mutually distrusting nodes to agree on a single history despite faulty or malicious participants. This is the Byzantine fault tolerance problem: a protocol stays correct as long as fewer than a threshold of nodes misbehave (classically, fewer than one-third). Two consensus families dominate:

  • Proof of Work (Bitcoin) — nodes compete to solve a hash puzzle; rewriting history requires redoing all the work, so an attacker needs a majority of total hash power (the “51% attack” threshold).
  • Proof of Stake (Ethereum post-Merge) — validators are chosen in proportion to staked capital and lose their stake (“slashing”) for misbehaving, making attacks economically self-defeating.

The security ideas generalize well beyond currency. Certificate Transparency is essentially an append-only log of issued TLS certificates that makes mis-issuance publicly detectable — the same auditability the snippet above sketches. The major caveat is that on-chain integrity does not extend to off-chain code: smart contracts are programs, and bugs in them (reentrancy, integer overflow, oracle manipulation) have caused nine-figure losses. The ledger faithfully records the theft.

The Quantum Threat

Quantum computers threaten to break most current public-key encryption. A classical computer factoring a 2048-bit RSA modulus needs far longer than the age of the universe; a sufficiently large quantum computer running Shor’s algorithm could do it in hours or days, because Shor’s algorithm factors integers and computes discrete logarithms in polynomial time. That single result undermines RSA, Diffie–Hellman, and elliptic-curve cryptography simultaneously — essentially all of today’s public-key infrastructure. Symmetric ciphers fare better: Grover’s algorithm gives only a quadratic speedup on brute-force search, so doubling the key length (e.g., AES-256) restores the security margin.

No machine can run Shor’s algorithm at that scale yet, but the resource estimates keep falling. In 2025 Craig Gidney revised his own widely cited 2019 figure of ~20 million noisy qubits down to under one million qubits, factoring RSA-2048 in under a week — a reminder that the threat timeline depends on algorithmic and error-correction progress, not just qubit counts, and that it moves in the attacker’s favor.

The response — post-quantum cryptography (lattice-based, hash-based, code-based, and multivariate schemes) — is covered in full in Cryptography → The Quantum Threat. NIST finalized its first three standards in August 2024: ML-KEM (Kyber, FIPS 203) for key encapsulation, and ML-DSA (Dilithium, FIPS 204) plus the hash-based SLH-DSA (SPHINCS+, FIPS 205) for signatures, with the lattice signature FN-DSA (Falcon) and the code-based HQC — chosen in 2025 as a backup KEM built on different math than ML-KEM — following as later standards. Operationally, two concerns drive action today, before large quantum computers exist:

  • “Harvest now, decrypt later.” An adversary can record encrypted traffic now and decrypt it once a quantum computer is available. Any data that must stay confidential for a decade or more is already at risk, which is why hybrid post-quantum key exchange (X25519 combined with ML-KEM) is already the default in TLS 1.3 stacks such as Chrome and OpenSSL.
  • Crypto-agility. The practical task is inventorying where systems use RSA/ECC and being ready to swap in the standardized algorithms without re-architecting everything.

AI: Both Sword and Shield

AI is reshaping both attack and defense, and the two are locked in an escalating loop. Three distinct threads are worth separating, because they are often conflated.

AI for defense. Machine learning excels at the volume-and-anomaly problems that overwhelm human analysts: establishing behavioral baselines and flagging deviations across billions of events (the UEBA model), triaging and summarizing alerts, and drafting response steps. Large-language-model “SOC copilots” now sit inside detection platforms, turning natural-language questions into queries and condensing an incident’s evidence into a narrative. The gain is speed; the risk is over-trust, since a confident but wrong summary can send an investigation down the wrong path.

AI for attack. AI lowers the cost of scaling offense — hyper-personalized phishing at volume, deepfake voice and video for social engineering (increasingly used against IT help desks to bypass MFA), and ML-guided fuzzing that widens automated vulnerability discovery. It compresses the time from a leaked credential to a working intrusion, shrinking defenders’ margin.

Attacks on AI. Distinct from either is the security problem of AI systems themselves. Models can be subverted through adversarial examples (inputs perturbed to force misclassification), data poisoning (corrupting the training set), model extraction (reconstructing a model through its API), and, for large language models, prompt injection (smuggling instructions through untrusted input) — the top entry in the OWASP Top 10 for LLM Applications. These ML-specific attacks are treated in Attacks & Network Defense → Machine Learning Under Attack.

The defensive trajectory bends toward Zero Trust — assuming compromise and verifying continuously rather than trusting the perimeter — which pairs naturally with continuous ML-driven monitoring. Its full treatment lives in Attacks & Network Defense → Zero Trust.


See Also