A Guide to Fully Homomorphic Encryption

I've spent one year at 0xPARC building a performant, production-grade fully homomorphic encryption (FHE) library from the ground up. As a way to wrap up my time at 0xPARC and pass on what I've learned to the next generation of FHE builders (LLMs included!), I made this guide. It's written with a variety of archetypes in mind, from founders who want to build with our library and engineers who want a deeper understanding of the underlying mathematics, to interns, researchers, and cryptographers who will work on the system itself — or, more broadly, anyone curious about what 0xPARC does.

Depending on what you're here for, different parts will be more useful:

Today, the technical content on FHE is scattered across ePrint papers and GitHub codebases. What writing exists tends toward two extremes: high-level surveys that don't explain any details, or deep dives into a single optimization. This guide aims to fill the gap: it is the first full-stack explanation of how FHE works end-to-end, and how the resulting system manages to be genuinely fast. I hope it plays some part in bringing more people into the FHE world.

How to read this guide

Two conventions show up throughout this guide: lies and exercises.

Lies: for ease of understanding, the text occasionally tells little lies. Lies are marked with a dotted underline like this; hover (or tap on mobile) to see the real story.

Exercises: the text also drops in short exercises, rendered inline as tinted boxes like the one below. They're designed to slow you down and make sure you're understanding the material.

Exercise: like this!

Contents

Note: CKKS is just one specific instantiation of FHE; Section 1.2 surveys the broader landscape of FHE schemes, and Part 2 explains why we chose to build CKKS.

Other resources

In addition to this guide, here are some existing resources for learning about CKKS.

Each of these is great, and each strikes its own balance between depth and breadth. This guide is meant to complement them by doing three things that none of the above do: explain CKKS with all of its optimizations in mind, show how everything is actually built in practice, and explain how real programs are built with CKKS. The goal of this guide is to convince you not just that CKKS is possible, but that it is performant.

Please email hello@holdenmui.com for comments and/or corrections!