TinySMPC 🛡️
A tiny library for secure multi-party computation, in pure Python!
This code is intended for educational rather than practical purposes. It exposes a simple API, and the underlying implementation is written to be understandable and minimalistic.
Get Started
Read the short tutorial notebook, or run it in your browser with Deepnote:
Overview
The goal is to allow multiple users/computers to collaboratively compute a function over their secret data (e.g. average, equality, logistic regression), while not exposing anyone's secret data.
Create a few VirtualMachines
(think: separate computers that can communicate to each other).
alice = VirtualMachine('alice')
bob = VirtualMachine('bob')
charlie = VirtualMachine('charlie')
Create secret numbers on Alice, Bob, and Charlie's machines.
a = PrivateScalar(25, alice)
b = PrivateScalar(50, bob)
c = PrivateScalar(10, charlie)
Distribute an encrypted fraction of each number to each machine (this is secret sharing!).
shared_a = a.share([alice, bob, charlie])
shared_b = b.share([alice, bob, charlie])
shared_c = c.share([alice, bob, charlie])
Compute some arithmetic function directly on the encrypted shares.
shared_output = (shared_a * shared_b) - 5 * (shared_a + shared_c)
Decrypt the function's output by sending all encrypted shares to Charlie (or anyone).
shared_output.reconstruct(charlie)
>>> PrivateScalar(1075, 'charlie')
Alice, Bob, and Charlie have jointly computed a function on their data, without seeing anyone else's secret data!
Implementation
TinySMPC implements additive secret sharing for creating encrypted shares on private data.
On top of additive secret sharing, we implement several SMPC protocols, which allow us to directly perform computations on encrypted data.
Here's a summary of the encrypted operations that TinySMPC supports.
Supported? | Implementation | |
---|---|---|
Addition | ✅ | SPDZ algorithm. See shared_addition.py |
Subtraction | ✅ | In terms of addition and multiplication. |
Multiplication | ✅ | SPDZ algorithm. See shared_multiplication.py |
Division | ❌ (too complicated) | Possible with SecureNN. |
Exponentiation | ✅ (public integer only) | In terms of multiplication. |
Greater Than | ✅ (public integer only) | SecureNN algorithm. See shared_comparison.py |
Repo Structure
Top-level:
tutorial.ipynb
: An easy tutorial notebook for SMPC and TinySMPC.tests.ipynb
: Test notebook to verify that our SMPC protocols work correctly.
In the tinysmpc
directory:
tinysmpc.py
: The top-level module with the user-facing API (VirtualMachine
,PrivateScalar
,SharedScalar
).finite_ring.py
: Useful functions for operating on integers in a finite ring.fixed_point.py
: Fixed-point encoding for floats, so we can do SMPC on floats.secret_sharing.py
: The additive secret sharing protocol.shared_addition.py
: The SPDZ protocol for addition ofSharedScalars
.shared_multiplication.py
: The SPDZ protocol for multiplication ofSharedScalars
.shared_comparison.py
: The SecureNN protocol for comparison of aSharedScalar
and a public integer.