QIFLib is a Python library for modeling, analyzing, and quantifying information leakage in probabilistic systems using the Quantitative Information Flow (QIF) framework.
It provides a clean, composable set of primitives — secrets, channels, hyper-distributions, vulnerability and uncertainty functions — so you can build end-to-end analyses of how much information an adversary could learn.
For more details see the book The Science of Quantitative Information Flow.
The documentation is available at https://qiflib.readthedocs.io.
- Secrets Modeling — define hidden states with flexible prior distributions.
-
Channels — represent probabilistic mappings
$p(y\mid x)$ from secrets to observations. -
Hyper-distributions — automatically compute joint
$p(x,y)$ , outer$p(y)$ , and inners$p(x\mid y)$ . -
Vulnerability Analysis — use
$g$ -vulnerability to quantify an adversary’s expected gain before and after observing outputs. -
Uncertainty Analysis — use
$\ell$ -uncertainty to measure the expected loss under optimal strategies. - Leakage Metrics — compute additive and multiplicative leakage.
- Flexible Functions — provide gain/loss as matrices or Python callables.
Traditional security analysis asks whether a secret can be inferred. QIF quantifies how much an adversary is expected to learn, under probabilistic models of system behavior and strategies.
Useful for:
- privacy-preserving data publishing,
- side-channel analysis,
- communication protocol evaluation,
- decision-making under uncertainty.
You can install via PyPI:
pip install qiflibor manuallly by copying this repository to your local machine and running:
pip install path/to/qiflib To verify if the package was installed correctly, you can run tests:
cd path/to/qiflib
python -m unittest discover testsfrom qiflib.core.secrets import Secrets
from qiflib.core.channel import Channel
from qiflib.core.hyper import Hyper
from qiflib.core.gvulnerability import GVulnerability
# Secrets & prior
secrets = Secrets(["x0", "x1"], [0.6, 0.4])
# Channel matrix: rows sum to 1
outputs = ["y0", "y1"]
C = [
[0.8, 0.2], # p(y|x0)
[0.1, 0.9], # p(y|x1)
]
channel = Channel(secrets, outputs, C)
# Hyper-distribution
hyper = Hyper(channel)
# Gain function (1 if correct guess, else 0)
actions = ["guess_x0", "guess_x1"]
def gfun(w, x): return 1.0 if w == x else 0.0
g = GVulnerability(secrets, actions, gfun)
print("Prior vulnerability:", g.prior_vulnerability())
print("Posterior vulnerability:", g.posterior_vulnerability(hyper))This project is licensed under the MIT License.