Blog/Two Checksums Shrink Private Lookups by 27%
FrontierCS 2Case studyOctober 17, 2026

Two Checksums Shrink Private Lookups by 27%

QuarterPIR, a EUROCRYPT 2024 scheme, lets a client read a database without revealing what it reads. Muse Wonder 1.0 cut its bytes per lookup by 27%, with privacy unchanged. We build the scheme up from a 16-entry example to show how.

By FrontierCS 2 Team
Solution checked by Bo PengPrinceton University

In its FrontierCS 2 run on the QuarterPIR task, Muse Wonder 1.0 cut the bytes of each private lookup by 27%, with privacy unchanged. The fix is a trick from RAID-6 disk arrays: two checksums can rebuild two lost values. Every model on the leaderboard ran the task once, and seven of twelve passed. No other passing run saved more than 96 of the 1,760 bytes per lookup. Muse Wonder 1.0 saved 480.

The Task

FrontierCS 2 removes the core of a paper’s released code, and an agent writes it back. The authors’ code is the human reference. A run passes only if its final version beats it on every metric of every hidden workload.

QuarterPIR, a EUROCRYPT 2024 scheme by Ghoshal, Zhou and Shi [1], lets a client read one database entry without the server learning which. The task removes the server’s request handler, and the agent may redesign both messages. A pass needs fewer bytes on every lookup, faster times and no more client memory.

What a Hint Is

Picture the database as rows of entries. The client prepares for lookups by reading the whole database once, and from that one pass it keeps hints. A hint is one entry per row, such as B, G, I and O. The client stores only the XOR of their values, the hint’s parity \(h\).

Think of four people and their pay. You remember only the total pay of the four. Later you ask for the total with one of them swapped for a stranger whose pay you know. The difference gives you the pay of the person you swapped out. Whoever answers sees four names and cannot tell which one you care about.

A hint works the same way. To read G, the client asks for the parity of B, F, I and O, with G swapped for a spare entry F whose value it stored. XORing the reply with \(h\) leaves \(G \oplus F\), and one more XOR gives G.

THE CLIENT STORESThe parity of its hintA spare entry of row 2Fand its valueBoth come from one pass overthe database, before anylookup.SERVER DATABASErow 1row 2row 3row 4ABCDEFGHIJKLMNOPthe client’s hintthe positions the request asks forREAD G1Ask for the parity of2XOR the reply with:B, I and O cancel3XOR with F:The server sees one position perrow. It cannot tell which onewas swapped.
Figure 1. One private lookup on 16 entries. The server sees one position per row and cannot tell which one was swapped.

The client keeps many hints, enough that every entry lies in some hint. Each hint serves one lookup. For every row the client also keeps backup hints to replace used ones. Each backup hint stores its parity and the value of its own entry in that row.

Keys and the List

A real database has thousands of rows, so a request cannot name an entry in each. QuarterPIR puts the rows in groups, 128 rows to a group. In the example, rows 1 and 2 form group 1, and rows 3 and 4 form group 2. A key is 16 bytes that the server expands into one position per row of a group. A hint has one key per group, and its keys rebuild its entries, so the client stores only a short id and the parity.

A request sends one key per group and one list. The list writes out the positions of one group, the group of the wanted entry, with the wanted entry swapped for a spare. That group gets random bytes in place of a key, so the server cannot tell which group the list is for.

The server XORs what each key picks in its group. That XOR is the group parity, \(K_b\) for group \(b\). It then tries the list in each group in turn, together with the group parities of the other groups. That gives one candidate per group, and the client keeps the candidate of its own group.

REQUEST FOR Grandomkey 22, 2group 1group 2listG is in group 1, so group 1goes as the list, with randombytes in place of its key.The list names one positionper row of a group. It doesnot say which group.THE SERVER TRIES EACH GROUPgroup 1group 2ABCDEFGHIJKLMNOPrandom byteskey 2the listGroup parities, each key in its group:The list applied in group 1 and 2:REPLYCandidates, one per groupGroup paritiesThe client uses, thegroup that holds G.andtravel in everyreply. The client rarelyneeds either.
Figure 2. The server XORs what each key picks in its group, the group parity, and tries the list in every group. It returns one candidate per group and every group parity, and the client keeps the candidate of its own group.

Why Every Reply Carries the Group Parities

A hint serves one lookup. After reading G, the client replaces the used hint with a backup hint for row 2, say A, H, L, M. At setup it stored that hint’s parity, its parity in group 1, \(A \oplus H\), and the value of H. It swaps H for G, which it just read, so the new parity is \(h' = A \oplus G \oplus L \oplus M\). The keys do not change, so in group 1 they still pick A and H. Ghoshal, Zhou and Shi [1] show that this keeps the table of hints distributed as before.

Now the client reads M with this hint, as Figure 3 follows. Group 2 holds M, so it goes as the list L, N, with N in place of M. Group 1 must go as a key. The old key picks A and H, with no G. The server must see a key that picks G, or over time the hints it sees would lack the entries read before, and that would reveal them. The paper makes the same point [1]. So the client draws a fresh key that picks G, and that key also picks a new entry in row 1, D.

The server’s candidate for group 2 is the list plus the group parity of group 1, \(L \oplus N \oplus D \oplus G\). XORing it with \(h'\) gives \(A \oplus D \oplus M \oplus N\). The client knows N, which leaves M and an error, \(A \oplus D\). It cannot remove the error alone, because it does not know D.

The fix is the group parity of group 1, \(K_1 = D \oplus G\). The hint’s own parity in group 1 is \((A \oplus H) \oplus H \oplus G = A \oplus G\). XORing the two gives \(A \oplus D\), and M follows.

The client cannot ask for \(K_1\) alone, since that would reveal that its last read lay in group 1. So the server sends the group parity of every group, every time. At full size that is 32 values, 512 bytes, half the reply.

1After reading Gbackup hintAHLMnew hintAGLMstored at setup: its parity, its parityin group 1,, and the value of2Reading M: the requestgroup 2, the listLNgroup 1, its old keyAHno G, and the server must see Ga fresh key, picks GDG3The server’s candidatefor group 2: the list, plus thegroup parity of group 14XOR it withN is known, which leavesand the errorThe client does not know.5The fixserver:client:XOR the two:,andfollows.6Why every reply has allAsking foralone wouldreveal that the last read layin group 1. So the server sendsevery group parity, every time:32 values, 512 B, half the reply.
Figure 3. Reusing a refreshed hint leaves an error that only the group parity \(K_1\) can fix, so every reply carries every group parity.

The Two Checksums

Muse Wonder 1.0 sends two sums of the group parities instead of all of them. The group parities of the server and the hint’s own parities agree in every group but two: the group of the wanted entry and the group of the inserted one. The client knows both groups. A plain sum and a weighted sum give it two equations, and it solves for the difference it needs.

GIVENThe server’s group paritiesThe client’s own, from its hintThe two sides differ only in group,which holds the wanted entry, andgroup, which holds the inserted one.The client stores two sums of itsown: the hint’s parity, and,one extra value per backup hint.THE TWO CHECKSUMSTwo sums replace them allplain sumweighted sumGroups where the sides agree cancel:Two equations, two unknowns. Theclient solves for, the differencein groupthat it needs.is XOR;multiplies in a finite field.IN ORDINARY NUMBERSServer4719Client4216Sums: 21 and 13Weighted by 1 to 4: 57 and 35Two sums on each side givethe two differences.
Figure 4. Two sums on each side give two equations in the two differences. The right panel works the same step in ordinary numbers.

Addition is XOR, and the weights multiply in the finite field with \(2^{128}\) elements, so each sum is 16 bytes. The client stores one extra value per backup hint. At full size the reply falls from 1,024 bytes to 544.

BYTES OF ONE LOOKUP AT 67 MILLION ENTRIESHuman reference512 keys224 list512 candidates512 group parities1,760request, 736reply, 1,024Muse Wonder 1.0512 keys224 list512 candidates32: the two checksums1,280reply, 544
Figure 5. One lookup at 67 million entries, to scale. Half of the reply of the human reference is group parities; two 16-byte checksums replace them.

The checksums are not tied to QuarterPIR. A later scheme by Shi, Peng, Li, Hong and Zhou [2], to appear at IEEE S&P 2027, uses a technique similar to QuarterPIR’s, and the same checksums could nearly halve its reply as well.

Why Privacy Is Unchanged

The benchmark fixes what the server may see, so a new reply needs no new proof. The server receives only a public function of the request of the authors’ client.

TRUSTED HARNESSIssues every lookup.Computes the requestis what the authors’ clientwould send for.Checks that the solution’sclient sent exactly.THE AGENT WRITESReductionRuns in its own process andgetsalone, withoutor any client state.It can drop or re-encode,not add to it.SERVERSees onlyIts view is a public functionof the authors’ view, so itlearns no more about.Its reply is free: the servercomputes it itself.
Figure 6. The server sees only \(f(R)\), a public function of the authors’ request \(R\), so it learns no more than before.

Results

All 4,000 lookups returned the right entry. The run scored 58.1, against 27.3 for the human reference.

Muse Wonder 1.0 against the human reference
0%25%50%75%100%Share of the human referenceBytes per lookup1,760 bytes1,280 bytesServer time per lookup856 µs100 µsClient setup122.2 s18.7 sLookup time, end to end4.42 ms0.62 msClient storage85.3 MB53.1 MB0%25%50%75%100%Share of the human referenceBytes per lookup1,760 bytes1,280 bytesServer time per lookup856 µs100 µsClient setup122.2 s18.7 sLookup time, end to end4.42 ms0.62 msClient storage85.3 MB53.1 MB
Human referenceMuse Wonder 1.0
At 67 million entries, in the same run

The checksums were in the first submission. The rest of the run made the code faster.

Muse Wonder 1.0 on QuarterPIR: score against cost
020406080$0$5$10$15$20$25$30Cost of the run so far in US$Human reference 27.3First submission, 41.91,280 bytes per lookup52 bytes at 65,536 entriesFinal score 58.1020406080$0$10$20$30Cost of the run so far in US$Human reference 27.3First submission, 41.91,280 bytes per lookup52 bytes at 65,536 entriesFinal score 58.1
Cost as the model gateway estimated it

The patch below is the final submission, the code the hidden workloads scored.

How the Other Models Did

Every other passing run saved 8 to 96 bytes per lookup. GPT-6.1 Sol scored highest, 58.2, with fewer bytes on the small database and faster timings. Kimi K3 sent 736 bytes but kept 606.8 MB on the client, and failed.

QuarterPIR: bytes per lookup of each model
6008001,0001,2001,4001,6001,800Bytes per lookup at 67 million entriesHuman reference 1,760Kimi K3736, but 606.8 MB on the clientMuse Wonder 1.01,280GPT-6.1 Sol1,664Gemini 4 Argon1,664Claude Opus 5.51,728GLM 5.3 Flash1,728DeepSeek V4.1 Flash1,728GLM 5.31,744GPT-6 Astra1,752Qwen 3.8 Max1,760Muse Spark 1.31,7606001,0001,4001,800Bytes per lookup at 67 million entriesHuman reference 1,760Kimi K3736, but 606.8 MB on the clientMuse Wonder 1.01,280GPT-6.1 Sol1,664Gemini 4 Argon1,664Claude Opus 5.51,728GLM 5.3 Flash1,728DeepSeek V4.1 Flash1,728GLM 5.31,744GPT-6 Astra1,752Qwen 3.8 Max1,760Muse Spark 1.31,760
PassesFails
Each model’s run on the hidden workloads

References

  1. Ashrujit Ghoshal, Mingxun Zhou and Elaine Shi. Efficient pre-processing PIR without public-key cryptography. In Advances in Cryptology, EUROCRYPT 2024. IACR ePrint 2023/1574.
  2. Chang Shi, Bo Peng, Zhechen Li, Cheng Hong and Mingxun Zhou. Achieving tight space-time tradeoff and practical performance in preprocessing PIR with multi-level recursion. In IEEE Symposium on Security and Privacy, S&P 2027, to appear. IACR ePrint 2026/1273.
All posts Back to top

Keep reading

Two Faster Clocks for a Hardware Priority Queue

Two Faster Clocks for a Hardware Priority Queue

BBQ, an NSDI 2024 circuit, picks the next packet a network card sends. Gemini 4 Argon and Claude Opus 5.5 each gave it a faster clock than its authors did, one with the same memory and one with registers in its place. We build the circuit up from a 16-priority example to show both.