Never Decrypted: Reading the Row Without Revealing Which Row
Private information retrieval lets a server answer your query without ever learning which row you asked for -- the 1995-to-2026 mechanism and its honest cost.
Permalink1. The library that watches what you read
You look up a drug interaction, a phone number that just called you, a landmark in a photo. Transport encryption hides that lookup from everyone on the wire -- your ISP, the coffee-shop Wi-Fi, a national firewall -- but not from the party that matters: the server decrypts your query and sees exactly which row you asked for. In 2007 a peer-reviewed paper concluded that fixing this was hopeless on real hardware [1]; by 2024 the same idea ran silently on the phone in your pocket [2]. The gap between those poles is this article.
The problem sounds simple until you try to state it precisely: can you read one row of a database without the owner learning which row? Every tool you already trust misses the target. TLS encrypts the channel, so the eavesdropper sees ciphertext -- but the server terminates that channel, decrypts your request, and reads the index in the clear. The threat model has quietly inverted. The adversary is not on the network. The adversary is the party holding the data.
Diagram source
flowchart LR
C["Client: read row i"] -->|"query under TLS"| N["Network path"]
N -->|"ciphertext only"| S["Server holds all n rows"]
S -->|"TLS terminates here"| D["Server decrypts the query"]
D --> K["Server now knows i"]
E["Eavesdropper, ISP, Wi-Fi"] -.->|"sees nothing useful"| N A protocol that lets a client retrieve the -th record from a server-held database while the server provably learns nothing about -- not the index, not even a useful probability distribution over indices, nothing beyond the fact that some record was requested. Privacy is a property against the server itself, not against a network eavesdropper [3].
So how could anyone possibly hide the index from the server? There is exactly one obviously private answer, and it is a joke: have the server ship you the entire database, and read the row you want on your own machine. The server treats every client identically, so it learns nothing about . It also just moved records to answer a one-record question.
The only trivially private PIR protocol: the server sends its whole database, and the client reads the wanted record locally. It leaks nothing about because the server does the same thing for every query. Its price sets the bar -- bits crossing the wire and bits of database touched -- that every real scheme must beat [3].
That baseline gives us the measuring stick for the rest of the article: a two-axis ledger. The first axis is communication -- how many bits cross the wire per query. The second is server computation -- how many bits of the database the server must touch to answer one query. Downloading everything costs on both. Every generation of PIR is a different, quantified answer to one question: how far below can you push each axis, and what do you pay -- client storage, an extra hardness assumption, a preprocessing phase, a non-collusion requirement, or plain money?
The server is the adversary. Encryption in transit protects your data from everyone except the one party that decrypts and answers your query -- and that party sees exactly which row you read. PIR moves the guarantee from the wire to the query itself, and the honest bar it must beat is the ridiculous one: just download the whole database.
This is Part 4 of Never Decrypted, a series on computation that uses, transmits, and reasons about data without ever decrypting it. The single-server story here rests on homomorphic encryption, built in the companion post on fully homomorphic encryption; the private set lookups PIR resembles but does not solve live in the earlier post on OPRFs and private set intersection. If downloading everything is the only thing that obviously works, how could anyone ever do better -- and why did it take until the 2020s to ship?
2. 1995: the problem gets a name and a wall
The field begins with a single paper. In 1995, Benny Chor, Oded Goldreich, Eyal Kushilevitz, and Madhu Sudan defined private information retrieval, gave it the two-axis framing we just built, and in the same stroke proved that the honest bar cannot be beaten by one server alone [3]. Their model is deliberately austere: the database is a string of bits, the client wants bit , and "privacy" means the server's view is independent of . No cryptography, no assumptions -- just information.
Under that model they proved a wall: with a single server and perfect privacy, the client must download everything.
"To completely guarantee the privacy of the user, the whole database should be downloaded; namely bits should be communicated." -- Chor, Goldreich, Kushilevitz, and Sudan, 1995
The argument is a counting argument, and it rewards being felt in the gut rather than taken on faith -- as long as you run it in the right order. Start from what unconditional privacy forces: the whole transcript the server sees must be identical no matter which index the client wanted. If it shifted with even slightly, a server that studied the transcript could shift its guess, and privacy would not be perfect.
So the primitive is query-independence -- any transcript that can occur when the client wants row can also occur when it wants any other row . The more familiar statement, that the answer carries no information about , is a downstream consequence, not the starting point. "Possible" here means possible with positive probability over the client's own private coins -- the secret decoding randomness the server never sees. The client reconstructs its bit from the transcript using those coins, so one fixed transcript together with fixed coins yields exactly one output bit. Making that caveat explicit is what turns the intuition into a proof [3].
Now count the transcripts. Fix the wanted index and suppose fewer than transcripts are possible for it. There are possible databases, so two of them, and , must produce the very same transcript -- identical query and, crucially, identical server answer. By query-independence, that transcript is also reachable when the client instead wanted some index where the databases disagree, .
But faced with and its private coins, the client emits a single fixed bit. Correctness demands that bit equal when the database is and when it is -- and those differ. Contradiction. So at least transcripts must be possible, and merely naming one takes bits. The download bar is not lazy engineering; for one server with perfect privacy it is provably the only solution [3, 4]. It is a theorem.
Information-theoretic (unconditional) privacy means the server's view of your query is statistically independent of : even a server with unlimited computing power learns nothing, ever, under no assumptions. Computational privacy is weaker and cheaper: the server's view is merely indistinguishable from independent to an efficient adversary, and only while some problem (integer factoring, lattice hardness) stays hard. Break the assumption or add enough compute, and computational privacy can fail; information-theoretic privacy cannot [3, 4].
That distinction is the hinge of everything that follows, because the 1995 impossibility only bites under two conditions held at once: one server and unconditional privacy. Drop either and the wall has a door.
Relax "one server" -- put the database on two or more replicas that do not talk to each other -- and you keep perfect privacy while paying far less than in communication. That is the multi-server, information-theoretic line, where the next section builds a scheme by hand. Relax "unconditional" -- allow a computational hardness assumption -- and a single server can be private after all, the line that eventually ships. The impossibility did not close the field. It drew the two roads out of it. Cite the founding result carefully: the conference version is Chor, Goldreich, Kushilevitz, and Sudan at FOCS 1995, and the journal version is JACM 45(6), 1998. They are the same work; do not date the idea to 1998 or the journal to 1995 [3].
One server cannot beat the download bar without giving up perfect privacy. So what exactly breaks the impossibility when you add a second server -- and what new, fragile thing do you have to trust in exchange?
3. Two servers, one XOR, and privacy from nowhere
Here is the escape, and it is not the one you would guess. Do not encrypt anything. Instead, replicate the database onto two servers that never communicate, and split your question into two halves that each look like noise. The 1995 impossibility assumed one server; give the client two, and perfect privacy costs far less than a full download [3]. The tool is XOR and nothing else.
Work over bits. The database is bits, held identically by Server 1 and Server 2, and you want bit . The client picks a uniformly random mask -- an -bit string where each position is an independent coin flip -- and calls it . It builds by copying and flipping the one bit at position , then sends to Server 1 and to Server 2.
Each server computes the parity of the database bits its mask selects -- the XOR of over every where the mask is 1 -- and returns that single bit. The client XORs the two replies.
Watch what cancels. The two masks agree everywhere except position , so in the XOR of the two parities every database bit is counted twice and vanishes -- except , which was selected by exactly one of the masks. The client is left holding and nothing else.
Diagram source
sequenceDiagram
participant C as Client
participant S1 as Server1
participant S2 as Server2
Note over C: Pick random mask q1, build q2 as q1 with bit i flipped
C->>S1: Send mask q1
C->>S2: Send mask q2
S1-->>C: Parity of selected bits, a1
S2-->>C: Parity of selected bits, a2
Note over C: XOR a1 with a2, all bits but i cancel, recover D of i Now the privacy claim, which is where the magic actually lives. Server 1 sees , a uniformly random string -- every mask is equally likely, so it reveals nothing about . Server 2 sees , which is also uniformly random, because flipping a fixed position of a uniform string leaves it uniform. Each server, alone, learns nothing about your index in the strongest possible sense: not "cannot compute it efficiently," but "the string it received is statistically independent of ." No assumption, no cipher, no key.
// Two-server information-theoretic PIR: the whole idea on one screen.
// The n-bit DB is held by BOTH servers, which must NOT talk to each other.
const DB = [1, 0, 1, 1, 0, 0, 1, 0]; // n = 8 bits
const i = 5; // the row we want -- kept secret
// Client: pick a uniformly random mask, then flip only position i for q2.
const rnd = () => DB.map(() => Math.round(Math.random()));
const q1 = rnd();
const q2 = q1.map((b, j) => (j === i ? b ^ 1 : b));
// Each server returns the XOR (parity) of the DB bits its mask selects.
const answer = (q) => q.reduce((acc, b, j) => acc ^ (b & DB[j]), 0);
const a1 = answer(q1), a2 = answer(q2);
// Client XORs the two replies. Every bit but i cancels.
console.log("recovered D[i] =", a1 ^ a2, " actual =", DB[i]);
console.log("server 1 saw:", q1.join(""));
console.log("server 2 saw:", q2.join(""), "-- both look like pure noise"); Press Run to execute.
Run it and change : the recovered bit always matches, and each server's view is an unbiased coin-flip string that betrays nothing. This is the first genuine shift in understanding the article offers. The way past the impossibility was never encryption. It was replication plus XOR -- an idea from coding theory, not cryptography. That is not a coincidence. A PIR scheme is essentially a locally decodable code: any single database symbol can be recovered by reading only a few positions of an encoding. Yekhanin's survey makes the correspondence precise, and progress on one side has repeatedly moved the other [5].
Now the ledger, and the catch. The by-hand scheme names an arbitrary subset of all positions, so each query is itself bits long -- "each server sent only a single bit, but the messages sent by the user ... are bits long," as CGKS note [3]. Privacy came for free, but on the communication axis this buys nothing over downloading. The genuine sublinear win comes from shrinking the query description, and it is worth seeing rather than taking on faith.
Reshape the bits into a grid. Instead of a subset of everything, the client sends each server a random subset of the columns -- a subset to Server 1, and to Server 2 the same subset with the target's column toggled in or out. Each server returns one parity per row: a -bit vector whose entry for row is the XOR of the grid entries in row over just the columns it was handed.
XOR the two vectors and every column cancels except the target's, which survives in full; the entry in the target row is your bit. That is up and back per server -- communication, genuinely below [3].
The same crank turns further. Recurse on that -bit answer, or reshape into a three-dimensional cube of side and query a sub-cube, and communication falls to . The cube naively needs eight servers, one per corner, but a radius-1 covering code collapses them to two: every one of the eight corners lies within one bit-flip of either 000 or 111 -- 000 covers and 111 covers -- so two servers cover the whole cube and still reach (CGKS Table I) [3].
Server computation, though, does not improve -- each parity still sweeps a constant fraction of the database, so every server does work per query. And all of it rests on one load-bearing assumption that XOR cannot defend.
Multi-server PIR is private only if the replicas never pool what they received. Each query is uniformly random on its own, so each server alone learns nothing; but the two queries together determine exactly. Non-collusion is not a tuning knob -- it is the entire privacy guarantee, and a breach leaves no observable trace in the protocol [3].
The two-server escape is real, it is unconditional, and it is brittle: it demands at least two replicas that you trust never to whisper. The founding barrier was not even the end of the information-theoretic story. Dvir and Gopi shattered the two-decade-old two-server bound in 2015-16, reaching subpolynomial communication -- proof that the information-theoretic line still has room to move [6]. But most real deployments have exactly one server and no willing, non-colluding twin. Can a single server give you privacy, with no replica to trust?
4. One server, an encrypted question, and the wrong race
In 1997 Eyal Kushilevitz and Rafail Ostrovsky answered that question with a paper whose title is a thesis: "Replication Is Not Needed." A single server can be private after all -- if you stop demanding unconditional privacy and let the server compute on an encrypted query instead [7]. This is the birth of computational single-server PIR, and it is also, though nobody would notice for a decade, the birth of a strategic mistake.
The mechanism is the one the whole modern field still runs on. Lay the -bit database out as a matrix. To fetch the entry in column , the client sends an encrypted selection vector: ciphertexts that decrypt to 0 everywhere except a single encrypted 1 in position .
The server, using only the public key, folds each row of the matrix against that encrypted vector and produces one output ciphertext per row -- each an encryption of that row's entry in column . The client decrypts only the row it wanted. The server never learned , because it only ever touched ciphertext [7].
An additively-homomorphic encryption scheme lets anyone combine ciphertexts into an encryption of the sum of their plaintexts, with no secret key -- Kushilevitz-Ostrovsky used Goldwasser-Micali, whose security rests on quadratic residuosity. A selection vector is an encrypted indicator: ciphertexts of 0 in every position but the one you want, which holds an encrypted 1. Fold a database against it homomorphically and the server computes an encryption of exactly the selected entry, having never seen which entry that was [7].
Diagram source
flowchart TD
Q["Client encrypts a selection vector, a single 1 at column c hidden among 0s"] --> SV["Server holds the database as a matrix"]
SV --> F["For each row, fold the row against the encrypted vector using the public key"]
F --> R["Server returns one ciphertext per row, each encrypting that row entry in column c"]
R --> D["Client decrypts only the wanted row and reads the record"] That -up, -back fold is only Kushilevitz-Ostrovsky's base case. Its answer is itself a bundle of ciphertexts, of which the client wants exactly one -- so apply PIR again to that bundle, recursing levels (equivalently, viewing the database as an -dimensional hypercube and folding one axis per level). That drives the base case down to the the ledger records, for any constant [7].
That single-axis victory lit up a decade of relentless progress. Christian Cachin, Silvio Micali, and Markus Stadler drove communication to polylogarithmic in 1999, CMS rested on the -hiding assumption, a number-theoretic conjecture about the hidden prime factors of Euler's totient. We only name it; the number theory is not the point of this article [8, 9]. and by 2005 Craig Gentry and Zulfikar Ramzan reached constant communication rate, the response barely larger than the record itself [10]. On the communication axis, PIR looked finished. On paper, the problem was solved.
Then someone finally timed the other axis. In 2007 Radu Sion and Bogdan Carbunar measured single-server computational PIR on real hardware and published a verdict that stopped the field cold.
Deploying non-trivial single-server PIR on real hardware "would have been orders of magnitude less time-efficient than trivially transferring the entire database." -- Sion and Carbunar, 2007
Read that against the thesis. The whole point of PIR is to beat the trivial download. Sion and Carbunar showed that every clever single-server scheme, timed end to end, lost to the very baseline it was built to beat -- because the server still ground through expensive modular-exponentiation operations per query, and moving a few kilobytes over a fast network is cheaper than a server doing a billion big-integer multiplies [1]. The community had spent ten years shrinking the wrong number.
Worse, the computational wall was already a theorem. In work that culminated in the 2004 Journal of Cryptology, Amos Beimel, Yuval Ishai, and Tal Malkin proved that without preprocessing, any PIR server must do work -- it cannot answer a query while ignoring part of its database, or the ignored part could not have influenced the answer [11]. Sion and Carbunar had measured, on silicon, a floor that theory guaranteed.
Diagram source
gantt
title PIR milestones on two axes, 1995 to 2026
dateFormat YYYY
axisFormat %Y
section Communication axis
CGKS two-server IT-PIR :milestone, 1995, 0d
Kushilevitz-Ostrovsky single-server CPIR :milestone, 1997, 0d
CMS polylog communication :1999, 2001
Gentry-Ramzan constant rate :milestone, 2005, 0d
section Computation axis
Sion-Carbunar impractical verdict :milestone, 2007, 0d
XPIR lattice revival :milestone, 2016, 0d
SimplePIR near memory bandwidth :milestone, 2023, 0d
section Deployment
Apple ships keyword PIR :2024, 2026 Two honest caveats keep this from being a hit piece. First, the verdict was contested: in 2011 Femi Olumofin and Ian Goldberg re-measured with better implementations and argued that multi-server and even some single-server PIR already beat trivial download for realistic parameters [12]. Second, the theory cuts the other way too: Beimel, Ishai, Kushilevitz, and Malkin proved that any nontrivial single-server PIR implies one-way functions exist [13].
Here is the running ledger so far, one row per generation:
| Generation | Year | Communication | Server computation | What it pays |
|---|---|---|---|---|
| Trivial download | -- | moves the whole database | ||
| Two-server IT-PIR (CGKS) | 1995 | per server | needs 2+ non-colluding replicas | |
| Single-server CPIR (K-O) | 1997 | heavy public-key ops | a computational assumption | |
| Polylog CPIR (CMS) | 1999 | polylog | slow modular work | loses the wall-clock race |
| Constant-rate CPIR (Gentry-Ramzan) | 2005 | constant rate | slow modular work | loses the wall-clock race |
If server work is a theorem, single-server PIR seems condemned to lose the clock forever. There turn out to be exactly two honest ways out -- and confusing them is the most common mistake in the whole subject.
5. Two escapes from the computation trap
A theorem that says server work is unavoidable without preprocessing is not a dead end. It is a signpost with two arrows, because there are exactly two things you can change: keep the linear work but make each unit almost free, or break the "without preprocessing" clause and buy sublinear online time with an offline phase. The modern era of PIR is the parallel pursuit of both, and telling them apart is the single most important distinction in the subject.
Diagram source
flowchart TD
W["Omega(n) server work without preprocessing, a theorem"] --> A["Escape 4a: keep it linear, make each unit cheap"]
W --> B["Escape 4b: change the model with preprocessing and client state"]
A --> A1["XPIR, SealPIR, Spiral, SimplePIR, DoublePIR, FrodoPIR touch every bit at memory bandwidth"]
B --> B1["CGK, CHK, Piano, DEPIR buy genuinely sublinear online server time"] Escape 4a: linear is fine if each unit is cheap. Stop fighting the wall. If the server must touch every bit, make touching a bit cost almost nothing. In 2016 Carlos Aguilar-Melchor and colleagues built XPIR by throwing out slow modular exponentiation and replacing it with fast lattice arithmetic -- Ring-LWE homomorphic encryption, whose per-operation cost is a small-integer multiply, not a big-integer power.
Their paper says it plainly: "the conclusion of Sion and Carbunar is not valid anymore: cPIR is of practical value" [14]. The wrong-axis decade ended not by beating the floor but by making the floor cheap to stand on.
The line then sprinted. SealPIR (2018) compressed the client's query so a single ciphertext expands, server-side, into the full selection vector -- roughly a 274-times smaller query -- and added probabilistic batch codes to amortize many queries at once [15]. Spiral (2022) composed two lattice schemes to push the response rate toward 0.81, so the answer is barely larger than the record [16].
Then, in 2023, SimplePIR and DoublePIR shrank the server's online job to essentially one cheap matrix-vector product over a small modulus -- a single product in SimplePIR, plus a second, much smaller one in DoublePIR. They hit roughly 10 and 7.4 gigabytes per second per core, within a small factor of raw memory bandwidth [17].
SimplePIR's matrix-vector product is worth seeing in full, because it shows at once why the linear work is cheap and how the client scrubs off the encryption noise with no server-side decryption at all. Store the database as a matrix over a small plaintext modulus , and fix a public matrix that everyone derives from a short seed. Pick a ciphertext modulus and a scale . The scheme is four short steps:
- Setup, once. The server publishes a hint equal to the product . It depends only on the database and the public , never on a query, so it is computed a single time and reused by every client forever after.
- Query row . The client samples a secret vector and a tiny error , and sends one vector , where is the indicator with a single 1 in the target column. That is an ordinary LWE ciphertext -- uniform-looking -- so the server learns nothing about the column.
- Answer. The server returns . This one matrix-vector product is the entire online cost: about small-integer operations, roughly one multiply and one add per database byte.
- Recover. The client subtracts the hint mask and rounds: it computes and rounds to the nearest multiple of .
Why does that land on the wanted entry? Expand the answer and the structure falls out: , and the first term is exactly . The client downloaded and knows its own secret , so it recomputes that masking term and subtracts it away.
The vector is just the target column of the database, so what remains at row is times the wanted entry plus the small residual ; rounding to the nearest multiple of erases the residual and returns the entry. The hint cancels the mask; the rounding cancels the noise; and the server, having only ever multiplied by a ciphertext, never learns which entry you read [17].
// Toy SimplePIR: the server's entire online job is ONE matrix-vector product,
// and a precomputed hint lets the client cancel the LWE mask.
const p = 16, q = 1 << 20, DELTA = q / p; // plaintext modulus, ciphertext modulus, scale
const sqrtN = 4, n = 8; // DB is sqrtN x sqrtN; lattice dimension n
const mod = (x) => ((x % q) + q) % q;
const randInt = (hi) => Math.floor(Math.random() * hi);
// Database: a sqrtN x sqrtN matrix of plaintext values in [0, p).
const D = Array.from({length: sqrtN}, () => Array.from({length: sqrtN}, () => randInt(p)));
// Public matrix A (sqrtN x n), uniform mod q -- in practice derived from a short seed.
const A = Array.from({length: sqrtN}, () => Array.from({length: n}, () => randInt(q)));
// Setup, once and query-independent: hint = D * A (a sqrtN x n matrix).
const hint = D.map((row) => Array.from({length: n},
(_, k) => mod(row.reduce((acc, d, c) => acc + d * A[c][k], 0))));
// Client wants entry (iRow, iCol); iCol is hidden in the query, iRow never leaves the client.
const iRow = 2, iCol = 3;
const s = Array.from({length: n}, () => randInt(q)); // secret vector
const e = Array.from({length: sqrtN}, () => randInt(3) - 1); // small error in {-1,0,1}
// qu = A*s + e + DELTA * u_col -- an LWE encryption of the column indicator.
const qu = A.map((Arow, c) =>
mod(Arow.reduce((acc, a, k) => acc + a * s[k], 0) + e[c] + (c === iCol ? DELTA : 0)));
// Answer: ans = D * qu -- one matrix-vector product, the whole online server cost.
const ans = D.map((row) => mod(row.reduce((acc, d, c) => acc + d * qu[c], 0)));
// Recover: subtract the hint mask, then round off the small noise.
const mask = mod(hint[iRow].reduce((acc, h, k) => acc + h * s[k], 0));
const recovered = Math.round(mod(ans[iRow] - mask) / DELTA) % p;
console.log("recovered =", recovered, " actual D[iRow][iCol] =", D[iRow][iCol]);
console.log("the server only ever saw qu, an LWE ciphertext -- never iRow or iCol"); Press Run to execute.
The SimplePIR server "must touch every bit of the database to answer even a single client query." -- Henzinger, Hong, Corrigan-Gibbs, Meiklejohn, and Vaikuntanathan, 2023
FrodoPIR (2023) added the piece deployment needs: a client-independent offline phase, so the server precomputes one batch of state that every client reuses, and then named the honest price. Its measured cost is under one second per query, a response blow-up under 3.6 times, and about $1 for 100,000 queries [18]. That is the first time in this article we can write PIR's cost as a number you could put in a budget.
"Linear" was never the enemy. Slow linear was. Once each unit of the unavoidable work costs about one 32-bit multiply-add at memory bandwidth, the server's full sweep of the database finishes in the time it takes to stream that database through the CPU. The right question flips from "how few bits can I send?" to "how cheap can I make each unit of work I already cannot avoid?"
Escape 4b: change the model. The other door accepts a one-time cost to break the no-preprocessing clause, and buys something 4a can never have: genuinely sublinear online server time.
Sublinear server time means the server reads of its database per query -- strictly less than all of it. Beimel-Ishai-Malkin proved this is impossible without preprocessing: with no precomputed state, a bit the server never reads cannot influence the answer, so it must read bits. Sublinear communication and sublinear computation are different claims, and only the first is free [11].
An offline phase does work once -- independent of, or amortized across, future queries -- to build state (a per-client "hint," or public tables) that makes each later online query cheap. The floor only forbids sublinear server time in the no-preprocessing model. Preprocessing is the door through it, paid for in client storage, one-time compute, or table size [19].
Henry Corrigan-Gibbs and Dmitry Kogan opened this model for PIR in 2020, showing an offline phase could buy sublinear online time [19]. In 2022, Corrigan-Gibbs, Alexandra Henzinger, and Kogan achieved sublinear amortized time on a single server, holding about of client state, and proved a matching lower bound that says roughly that much state is necessary [20].
Piano (2024) then stripped the assumptions to the floor: sublinear online time from one-way functions only -- pseudorandom functions, no homomorphic encryption -- in about 150 lines of code [21, 22]. And the asymptotic endpoint arrived in Lin, Mook, and Wichs's 2023 STOC Best Paper.
A single-server PIR where, after a one-time public preprocessing of the database, the server answers each query in time with no per-client state at all. Lin, Mook, and Wichs achieved it in 2023 from Ring-LWE with no trusted setup: the asymptotic ideal -- stateless clients and sublinear server time together -- at the price of large preprocessed tables [23].
So the disambiguation, stated once and enforced for the rest of the article: 4a is fast-but-linear (touches every bit, stateless, simple), and 4b is sublinear-but-stateful-or-preprocessing-heavy (touches few bits, but holds client state or huge public tables). They are not competitors racing to one finish line. They are different trades. Two escapes, two price tags -- so which one actually ships to a billion phones, and why that one?
6. The 2026 toolbox, laid side by side
By 2026 there is no "best PIR." There are five living families, each parked at a different point on the same trade-off surface, and the honest way to present them is a single table that scores every one on the two-axis ledger plus the things the ledger hides: client storage, the hardness assumption, and the preprocessing model.
Family 1A, fast-linear single-server PIR, is the deployed line: SimplePIR and DoublePIR, Spiral, SealPIR, FrodoPIR, and two schemes newer than the breakthrough itself. YPIR (2024) removes the client hint entirely with "silent" preprocessing, reaching up to 83% of memory bandwidth with no offline communication [24]. Respire (2024) targets small records, retrieving one 256-byte record from a million-record database in about 6.1 KB of online communication [25].
Family 1B, sublinear-online preprocessing PIR, is CHK and Piano [20, 21]. Family 1C is DEPIR and its practicalization race [23]. Family 1D is the multi-server information-theoretic line [3, 6]. And Family 1E, keyword PIR, is an orthogonal layer that rides on top of any of the others.
| Scheme (year) | Server comp/query | Comm/query (+ one-time) | Client storage | Assumption | Preprocessing | Sublinear server? | Reported perf |
|---|---|---|---|---|---|---|---|
| Trivial download [3] | -- | none (IT) | none | No | streams the DB | ||
| Two-server IT-PIR, 1995 [3, 6] | /server | -- | none (IT) | none | No | -- | |
| SealPIR, 2018 [15] | 1 ciphertext (~274x smaller) | small keys | RLWE | none | No | batched | |
| Spiral, 2022 [16] | rate ~0.81 | keys | RLWE | none | No | ~1.9 GB/s | |
| SimplePIR, 2023 [17] | at 10 GB/s/core | 242 KB + 121 MB hint | 121 MB hint | LWE | client-dependent hint | No | 10 GB/s/core |
| DoublePIR, 2023 [17] | at 7.4 GB/s/core | 345 KB + 16 MB hint | 16 MB hint | LWE | client-dependent hint | No | 7.4 GB/s/core |
| FrodoPIR, 2023 [18] | online | KBs + offline | client-independent | LWE | client-independent | No | ~$1/100k, under 1 s |
| YPIR, 2024 [24] | , high throughput | ~2.5 MB, no hint | ~none | LWE/RLWE | silent, no offline comm | No | ~83% of bandwidth |
| Respire, 2024 [25] | ~6.1 KB (1M x 256 B) | ~17x DB in memory | RLWE | none | No | 200-400 MB/s | |
| CHK, 2022 [20] | amortized | sublinear | , stateful | OWF | offline/online | Yes | matching lower bound |
| Piano, 2024 [21] | online | sublinear | , stateful | OWF only | offline/online | Yes | ~12-40 ms, ~150 LoC |
| DEPIR, 2023 [23] | none (public tables) | Ring-LWE | public | Yes | theory to batch | ||
| Keyword PIR, 1997 [26] | inherits base | inherits base | inherits base | inherits base | inherits base | layer | -- |
Read the table as a map of trades, not a leaderboard. Family 1A wins wall-clock throughput and statelessness while conceding work per query. Within 1A, the axis being optimized is not the compute -- it is the offline hint. Trace the hint shrinking across 1A: SimplePIR needs a 121 MB per-client hint, DoublePIR cuts it to 16 MB, FrodoPIR makes the offline state client-independent so every client reuses it, and YPIR removes the client hint altogether with silent preprocessing [17, 18, 24]. Family 1B wins sublinear online server time from the minimal assumption, paying client storage and statefulness. Family 1C wins the asymptotic ideal -- stateless clients, server time -- at the price of enormous public tables that are only now becoming tractable. DEPIR's preprocessing is huge but shrinking fast: Okada, Player, Pohmann, and Weinert reported orders-of-magnitude optimizations and a first implementation in 2024 [27], and a 2026 preprint pushed the server state for an database from a prior 733 TB down to 171 GB, at about 21 ms amortized per query in a batch [28].
A layer that retrieves a record by a keyword or key -- a phone number, a URL, an image embedding -- rather than a numeric index, while hiding the keyword from the server. Chor, Gilboa, and Naor showed in 1997 how to run any search structure (a hash table, a binary search) inside any underlying PIR, turning index PIR into a private key-value store with no new hardness assumption. It is the form that actually ships [26].
The toolbox is real, fast, and honestly priced. So where, concretely, does it run for a billion people -- and what does that deployment quietly trade away?
7. PIR on a billion phones, and its honest bill
The thesis is now a shipping product. By 2024 Apple runs keyword PIR at consumer scale in two features, both on the homomorphic-encryption-based linear line -- family 1A -- and both wrapped in an Oblivious HTTP relay that hides the client's IP address from the answering server.
Enhanced Visual Search, in Photos, is the mass-scale one: it is on by default. When your phone wants to name a landmark in a photo, it computes an embedding of the image region, encrypts it under BFV, and runs a private nearest-neighbor search plus PIR against a global index Apple holds.
In Apple's own words, the system uses "homomorphic encryption (HE) along with technologies like private information retrieval (PIR) and private nearest neighbor search (PNNS)" and runs at "post-quantum 128-bit security" [2]; Apple's privacy note says it "privately matches places in your photos to a global index Apple maintains on our servers ... using homomorphic encryption" [29]. That Enhanced Visual Search ships on by default in iOS 18 and macOS 15 was surfaced less by Apple's launch messaging than by developers -- Jeff Johnson prominent among them -- who found the toggle already enabled and asked whether users had meaningfully consented [30, 31].
Live Caller ID Lookup is the opt-in, provider-dependent one: when enabled, it fetches caller-identification and spam information for an incoming number. Apple states it plainly: "Live Caller ID Lookup relies on Private Information Retrieval (PIR)," the implementation "relies on homomorphic encryption," it "implements the Brakerski-Fan-Vercauteren (BFV) HE scheme," and BFV is "quantum resistant" [32]. Unusually, the backend is open: Apple publishes a reference server and the swift-homomorphic-encryption library, so the deployed stack is not a black box [33].
Diagram source
flowchart LR
D["Device computes an embedding or a phone number"] --> E["Encrypt under BFV, client keeps the key"]
E --> O["Oblivious HTTP relay hides the client IP"]
O --> S["Server runs keyword PIR on ciphertext, never decrypts"]
S --> A["Encrypted answer travels back"]
A --> R["Device decrypts locally and reads the result"] Both features rest on BFV, a Ring-LWE scheme whose internals belong to the FHE post, not here; enough that BFV lets the server fold an encrypted query against its index without a key, and that its lattice hardness is plausibly post-quantum [34]. What matters for our ledger is which escape Apple chose, and it chose 4a: the server does full linear work per query, fast.
Why 4a and not the asymptotically superior sublinear lines? A labeled inference, not an Apple claim: a default-on, high-churn feature spread across a billion heterogeneous devices cannot ask each one to hold and periodically refresh bytes of client state, which is exactly what the sublinear 1B and 1C lines require. The stateless, linear-but-fast 1A line is the only family whose operational shape fits a mass-consumer deployment, so that is the one that ships [17, 21]. The answer is not that 4a is faster in the abstract -- it is that statelessness beats asymptotics when your client population is a billion phones that churn constantly. It ships, and it works. But every choice on that stack traded something away. How does an engineer who is not Apple actually pick?
8. The decision fan: no single winner
Put the families on trade-off axes instead of a leaderboard, and the shape of the choice becomes clear. Three questions route you to a family, and each answer pairs a strength with the limitation it leaves standing.
The first axis is how many servers you trust. Two or more replicas that will not collude buy unconditional privacy with no hardness assumption -- the information-theoretic multi-server line [3] -- but you must operate non-colluding infrastructure, which most single-vendor deployments cannot. One server needs a computational assumption instead of a replica.
The second axis is how much state the client can carry. Fast-linear 1A is stateless and simple, paying server work per query [17]. Sublinear 1B (CHK, Piano) cuts online work to but demands roughly bytes of per-client state and a client long-lived enough to amortize its offline phase [20, 21]. Doubly-efficient 1C keeps clients stateless and server time , but relocates the cost to enormous public tables [23].
The third axis is which assumption you will accept. Spiral and DEPIR want lattice homomorphic encryption; Piano wants only a pseudorandom function, the weakest cryptography that can do the job [16, 23, 21]. Weaker assumptions are safer and often faster per operation, but so far buy sublinearity only in the stateful model.
Diagram source
flowchart TD
Q1{"Two or more non-colluding servers?"} -->|"yes, unconditional privacy"| MS["1D multi-server IT-PIR"]
Q1 -->|"no, single server"| Q2{"Clients can hold sqrt n state?"}
Q2 -->|"no, stateless and high churn"| FL["1A fast-linear plus a keyword layer"]
Q2 -->|"yes, few long-lived clients"| SUB["1B Piano or CHK, sublinear online"]
Q2 -->|"want the asymptotic ideal, huge tables acceptable"| DE["1C DEPIR"] 9. Four walls, and the row you cannot trust
Now that PIR demonstrably works, it is worth seeing exactly how far it cannot go -- because several of the ceilings are theorems, not engineering backlog. Four walls, then a fifth thing PIR was never built to do.
Wall one: one server plus unconditional privacy equals download everything. This is the 1995 impossibility, and it is permanent. No cleverness beats it, because it is an information-theoretic counting bound: the baseline is not the worst case, it is the optimal case for that threat model [3].
Wall two: no preprocessing means server work. Sublinear server time is impossible in the no-preprocessing model, full stop [11]. This is the abstract statement of SimplePIR's practical confession that the server "must touch every bit of the database to answer even a single client query" [17]. You can move the cost with preprocessing, but you cannot make it vanish.
Wall four: the multi-server line is bounded by coding theory. Because a PIR scheme is essentially a locally decodable code, the best achievable multi-server communication is pinned to open questions about those codes -- which is why the two-server frontier is measured in the same breath as LDC lower bounds [5].
Then the ceiling that surprises people most, and the one the series turns on: basic PIR hides your index from the server, but it does nothing to hide the rest of the database from you.
Symmetric PIR additionally hides the database from the client: the client learns record and nothing about the other records, while the server still learns nothing about . That two-sided guarantee is exactly 1-out-of- oblivious transfer, where a sender holds messages, a receiver picks one, the receiver learns only that one, and the sender learns nothing about the choice. Gertner, Ishai, Kushilevitz, and Malkin showed how to upgrade PIR into SPIR and tied the two notions together [35].
Basic PIR gives only the server-side half of that guarantee. SPIR is the symmetric version -- privacy for both parties at once -- which is why it coincides with oblivious transfer, a strictly stronger and more expensive primitive than plain PIR [35]. A curious client running ordinary PIR can fish: nothing in the protocol stops it from asking for records it has no right to, because the whole design goal was to protect the client's query, not the server's data. If you need to protect the data from the client too, you do not want PIR, you want SPIR or oblivious transfer.
That third correction is not a settled theorem like the first four. It is a live gap -- the seam where privacy stops and integrity was never promised. It, and the size of DEPIR's tables, are where the frontier actually is.
10. The unfinished map
The mechanism is proven and shipping, which is exactly when the interesting problems start. Here is where a reader could actually push.
Shrink DEPIR's tables. Doubly-efficient PIR reaches the asymptotic ideal but pays with preprocessed state, and driving that toward while keeping online time is the central open engineering problem of the line [23]. The trajectory is steep and public: concrete optimizations and a first implementation in 2024 [27], open prototypes exploring algebraic-HE variants [36, 37], and a 2026 preprint cutting server state from hundreds of terabytes to hundreds of gigabytes for a fixed database size [28].
Make sublinear single-server PIR stateless. The 1B line buys sublinear online time only by holding about of per-client state, and CHK proved a matching lower bound suggesting that much state may be inherent to the client-hint model [20]. Whether a stateless client can get sublinear online time on a single server, outside the huge-table DEPIR regime, is open.
Close the integrity seam. This is the one that matters most for the series.
The rest of the frontier is a good to-do list:
- Keyword PIR at web scale -- private safe-browsing blocklists, Certificate Transparency lookups -- pushes throughput and record-size limits that Respire and YPIR are actively chasing [25, 24].
- Updatable and streaming databases strain the preprocessing lines, whose hints assume a database that does not change under them.
- Batching and multi-query lower bounds ask how much cheaper queries can be than times one, the question SealPIR's probabilistic batch codes opened [15].
- Metadata leakage beyond the index -- when and from where you queried -- is only partly handled by Apple's Oblivious HTTP and differential-privacy scaffolding [2].
- The multi-server communication frontier reopened by Dvir and Gopi is still moving [6].
The row-hiding mechanism is settled. The guarantees around it -- small preprocessing, verifiable answers, metadata hygiene -- are the next decade, and the next post. Before then, one practical question remains: given all this, how do you actually choose, this week?
11. Choosing, and when not to use PIR at all
Here is a procedure you can act on this week. Start by trying not to use PIR, because the trivial baseline is genuinely optimal below a break-even size, and then route by the constraints that actually bind.
| Situation | Use | Why |
|---|---|---|
| Small or rarely-queried database | Just download it | Below break-even the trivial baseline wins on every axis [32] |
| Mass-scale, stateless, high-churn, one provider | 1A fast-linear + keyword layer | Statelessness beats asymptotics at a billion clients [17] |
| One long-lived client, many queries, light crypto | Piano (1B) | Sublinear online from a PRF, about state [21] |
| Two or more non-colluding servers, want unconditional privacy | 1D multi-server IT-PIR | No hardness assumption, but needs true non-collusion |
| Need the asymptotic ideal, can afford huge tables | DEPIR (1C) | server time, stateless clients [23] |
| Must hide the database from the client too | SPIR / oblivious transfer, not PIR | Basic PIR does not protect the data [35] |
| Need the answer to be provably correct | Add integrity / verification | PIR guarantees privacy, not correctness |
| Private set intersection or contact discovery | OPRF / PSI, not PIR | A different primitive entirely |
The budgeting rule for the deployed line is simple because the work is linear: a fast-linear server sweeps its whole database once per query, so at roughly 10 GB/s per core a -gigabyte database costs about core-seconds of compute per query, plus a response several times larger than the record [17, 18]. Wrap the whole thing in Oblivious HTTP so the index is not the only thing you hide.
// Should you use PIR, or just download the database?
// PIR server work is LINEAR: it streams the whole DB past the CPU once.
const dbSizeGB = 8; // database size in gigabytes
const downlinkGbps = 0.1; // client download speed, gigaBITS per second
const pirThroughputGBs = 10; // SimplePIR-class server, gigaBYTES/s/core
const pirCores = 8;
// Time to just download the entire database (the trivial baseline).
const downloadSec = (dbSizeGB * 8) / downlinkGbps;
// Time for one PIR query: the server sweeps the DB once at its throughput.
const pirSec = dbSizeGB / (pirThroughputGBs * pirCores);
console.log("download everything:", downloadSec.toFixed(1), "s per query");
console.log("PIR linear scan: ", pirSec.toFixed(3), "s per query");
console.log(pirSec < downloadSec
? "PIR wins on wall-clock -- but you still pay server compute + response blow-up"
: "below break-even: just download it, simpler and leak-free"); Press Run to execute.
Libraries you can actually run today
Open implementations track the families in this article: SimplePIR and DoublePIR, Spiral, FrodoPIR, YPIR, and Respire on the fast-linear line; Piano on the sublinear line; and Apple's own swift-homomorphic-encryption with its live-caller-id-lookup-example reference backend for the deployed keyword-PIR stack [17, 16, 18, 24, 25, 21, 33].
Rules of thumb are cheap. Here are the questions people actually ask.
12. Frequently asked questions
Frequently asked questions about private information retrieval
Does PIR hide the database from me, the client?
No. Basic PIR hides your query from the server -- which row you read -- but does nothing to stop a curious client from fishing for records it did not ask for. Hiding the rest of the data from the client is a strictly stronger notion, Symmetric PIR, which is equivalent to 1-out-of- oblivious transfer [35].
Isn't PIR just TLS or encryption?
No. TLS hides your data from parties on the network, but the server terminates the TLS tunnel, decrypts your request, and sees exactly which record you wanted. PIR hides the index from the answering server itself -- a different guarantee against a different adversary, provably impossible to get for free from one server [3].
Does PIR require fully homomorphic encryption?
No. Any nontrivial single-server PIR implies one-way functions exist, so some assumption is necessary -- but a one-way function is enough, and Piano builds sublinear single-server PIR from just a pseudorandom function, no homomorphic encryption at all [13, 21]. Homomorphic encryption is the efficient path for the fast-linear line, not a logical requirement.
Is SimplePIR sublinear?
No, and this is the most common misconception. SimplePIR is linear-computation: its own authors state the server "must touch every bit of the database to answer even a single client query." Its breakthrough is throughput -- doing that linear sweep at roughly 10 GB/s per core -- not a lower asymptotic order [17].
Can a PIR server return the wrong row?
Yes. By construction, PIR guarantees privacy, not correctness. A malicious server can return a perfectly well-formed record that is simply the wrong one, and nothing in the protocol detects it. Catching that requires an added integrity or verifiability layer -- the seam the rest of this series follows [3].
In multi-server IT-PIR, what happens if the servers collude?
Privacy collapses to zero, silently. Each server's query is a uniformly random mask on its own, but XOR the two masks together and you get the indicator of exactly the index the client wanted. There is no failed decryption or anomaly to warn anyone -- non-collusion is the entire guarantee [3].
Is PIR quantum-safe, and is it ever cheaper than just downloading?
The lattice-based schemes are plausibly post-quantum -- Apple's deployed BFV runs at post-quantum 128-bit security [32]. And PIR only beats the trivial baseline above a break-even database size: below it, downloading everything is cheaper, simpler, and leaks nothing, which is why the honest cost is measured in cents per thousand queries and a response several times larger than the record, never zero [18].
13. Reading the row, and trusting it
Return to the three lookups from the opening: the drug interaction, the number that just called, the landmark in the photo. You can now explain, mechanism by mechanism, how each stays private. The query leaves your device as an encrypted selection vector or an encrypted embedding; the server folds its database against that ciphertext without a key; an Oblivious HTTP relay strips your IP on the way; the answer comes back sealed, and only your device opens it. The server answered a question about a row it never identified.
Thirty years turned an impossibility into a product. PIR lets a client fetch record while the server provably never learns -- won first on the communication axis (two-server XOR, then single-server homomorphic encryption, then polylogarithmic and constant-rate), then on the computation axis (fast-linear throughput and sublinear-preprocessing), and finally shipped to a billion phones. The baseline it beat was never lazy engineering: downloading everything is provably optimal for one server with perfect privacy, and PIR beats it at a cost you can name in dollars and gigabytes, but never zero.
The honest bill stays attached: linear server compute at cents per thousand queries, and a response several times larger than the record [18]. That is the real price of running keyword PIR by default in a billion camera rolls [2] -- and of the fact that a server sweeping every bit at memory bandwidth still never learns which bit you wanted.
Two threads run out of this post into the rest of Never Decrypted. The BFV and Ring-LWE machinery that lets the server compute on your encrypted query is built from first principles in the fully homomorphic encryption post; the private set operations PIR resembles but does not perform live in the OPRF and private set intersection post. And one honest sentence stays open, the same seam the FHE post left: PIR bought you privacy, not correctness [3].
You can read the row without revealing which row. Whether you can trust the row you got back is the next story.
Study guide
Key terms
- Private Information Retrieval (PIR)
- Fetching record i from a server-held database while the server provably learns nothing about i.
- Trivial-download baseline
- Send the whole database and read locally: perfectly private, and the provably optimal bar for one server with unconditional privacy.
- Two-axis ledger
- Scoring every scheme on communication (bits on the wire) and server computation (database bits touched per query), each n at the baseline.
- Non-collusion assumption
- Multi-server IT-PIR is private only if the replicas never compare the queries they received; a breach unmasks the index silently.
- Selection vector
- An encrypted indicator, all zeros but a single encrypted one, that the server folds against its database to extract the wanted record blindly.
- Sublinear server time and the Omega(n) floor
- Reading fewer than all n bits per query, provably impossible without preprocessing; distinct from sublinear communication.
- Doubly-Efficient PIR (DEPIR)
- Polylog server time with stateless clients after a one-time public preprocessing, at the cost of large tables.
- Keyword PIR
- Retrieving by a keyword rather than an index by running a search structure inside any underlying PIR; the form that ships.
- Symmetric PIR (SPIR)
- PIR that also hides the rest of the database from the client, equivalent to 1-out-of-n oblivious transfer.
References
- (2007). On the Computational Practicality of Private Information Retrieval (NDSS 2007). https://users.cs.fiu.edu/~carbunar/pir.pdf ↩
- (2024). Combining Machine Learning and Homomorphic Encryption (Apple Machine Learning Research). https://machinelearning.apple.com/research/homomorphic-encryption ↩
- (1998). Private Information Retrieval (FOCS 1995; JACM 45(6), 1998). https://people.csail.mit.edu/madhu/papers/1995/pir-journ.pdf ↩
- (2004). A Survey on Private Information Retrieval (Bulletin of the EATCS 82). https://www.cs.umd.edu/~gasarch/papers/pirsurvey.pdf ↩
- (2010). Private Information Retrieval (Communications of the ACM 53(4)). https://www.microsoft.com/en-us/research/publication/private-information-retrieval/ ↩
- (2016). 2-Server PIR with Subpolynomial Communication (STOC 2015 / JACM 2016). https://www.cs.princeton.edu/~zdvir/papers/DvirGopi14.pdf ↩
- (1997). Replication Is Not Needed: Single Database, Computationally-Private Information Retrieval (FOCS 1997). https://web.cs.ucla.edu/~rafail/PUBLIC/34.pdf ↩
- (1999). Computationally Private Information Retrieval with Polylogarithmic Communication (EUROCRYPT 1999). https://people.csail.mit.edu/silvio/Selected%20Scientific%20Papers/Private%20Information%20Retrieval/Computationally%20Private%20Information%20Retrieval%20with%20Polylogarithmic%20Communication.pdf ↩
- Phi-hiding assumption. https://en.wikipedia.org/wiki/Phi-hiding_assumption ↩
- (2005). Single-Database Private Information Retrieval with Constant Communication Rate (ICALP 2005). https://doi.org/10.1007/11523468_65 ↩
- (2004). Reducing the Servers' Computation in Private Information Retrieval: PIR with Preprocessing (J. Cryptology 2004). https://link.springer.com/content/pdf/10.1007/s00145-004-0134-y.pdf ↩
- (2011). Revisiting the Computational Practicality of Private Information Retrieval (FC 2011). https://cypherpunks.ca/~iang/pubs/mspir.pdf ↩
- (1999). One-Way Functions Are Essential for Single-Server Private Information Retrieval (STOC 1999). https://dblp.org/rec/conf/stoc/BeimelIKM99.html ↩
- (2016). XPIR: Private Information Retrieval for Everyone (PoPETs 2016). https://hal.science/hal-01396142/file/paper.pdf ↩
- (2018). PIR with Compressed Queries and Amortized Query Processing (SealPIR, IEEE S&P 2018). https://eprint.iacr.org/2017/1142 ↩
- (2022). Spiral: Fast, High-Rate Single-Server PIR via FHE Composition (IEEE S&P 2022). https://eprint.iacr.org/2022/368 ↩
- (2023). One Server for the Price of Two: Simple and Fast Single-Server PIR (SimplePIR/DoublePIR, USENIX Security 2023). https://www.usenix.org/conference/usenixsecurity23/presentation/henzinger ↩
- (2023). FrodoPIR: Simple, Scalable, Single-Server Private Information Retrieval (PoPETs 2023). https://petsymposium.org/popets/2023/popets-2023-0022.php ↩
- (2020). Private Information Retrieval with Sublinear Online Time (EUROCRYPT 2020). https://eprint.iacr.org/2019/1075 ↩
- (2022). Single-Server Private Information Retrieval with Sublinear Amortized Time (EUROCRYPT 2022). https://eprint.iacr.org/2022/081 ↩
- (2024). Piano: Extremely Simple, Single-Server PIR with Sublinear Server Computation (IEEE S&P 2024). https://eprint.iacr.org/2023/452 ↩
- (2024). Piano: Private Information Retrieval (CMU CSD PhD Blog). https://www.cs.cmu.edu/~csd-phd-blog/2024/piano-private-information-retrieval/ ↩
- (2023). Doubly Efficient Private Information Retrieval and Fully Homomorphic RAM Computation from Ring LWE (STOC 2023). https://eprint.iacr.org/2022/1703 ↩
- (2024). YPIR: High-Throughput Single-Server PIR without Offline Communication (ePrint 2024/270). https://eprint.iacr.org/2024/270 ↩
- (2024). Respire: High-Rate PIR for Databases with Small Records (CCS 2024). https://eprint.iacr.org/2024/1165 ↩
- (1998). Private Information Retrieval by Keywords. https://eprint.iacr.org/1998/003 ↩
- (2024). Towards Practical Doubly-Efficient Private Information Retrieval (FC 2024). https://ifca.ai/fc24/preproceedings/148.pdf ↩
- (2026). Towards Practical Doubly-Efficient Private Information Retrieval (ePrint 2026/243). https://eprint.iacr.org/2026/243 ↩
- (2024). Photos and Privacy (Enhanced Visual Search). https://www.apple.com/legal/privacy/data/en/photos/ ↩
- (2024). Apple Enables Enhanced Visual Search Without User Consent, Raising Privacy Alarms. https://www.iclarified.com/95961/apple-enables-enhanced-visual-search-without-user-consent-raising-privacy-alarms ↩
- (2024). Enhanced Visual Search in the Photos App. https://lapcatsoftware.com/articles/2024/12/3.html ↩
- (2024). Announcing Swift Homomorphic Encryption. https://www.swift.org/blog/announcing-swift-homomorphic-encryption/ ↩
- (2024). Getting Up-to-Date Calling and Blocking Information for Your App (Live Caller ID Lookup). https://developer.apple.com/documentation/sms_and_call_reporting/getting_up-to-date_calling_and_blocking_information_for_your_app ↩
- (2012). BFV: Fully Homomorphic Encryption without Modulus Switching / Somewhat Practical FHE (ePrint 2012/078). https://eprint.iacr.org/2012/078 ↩
- (1998). Protecting Data Privacy in Private Information Retrieval Schemes (STOC 1998). https://doi.org/10.1145/276698.276723 ↩
- (2024). Algebraic-HE Doubly-Efficient PIR, open implementation (ashe-depir). https://github.com/FeanorTheElf/ashe-depir ↩
- (2024). Doubly-Efficient PIR construction and open implementation (ePrint 2024/829). https://eprint.iacr.org/2024/829 ↩