Problem Statement
Imagine you have a set (no duplicate elements) e.g. S1 = {'a', 'b', 'c'}.
You wish to share a private (and ideally both small in size and integrity protected) representation of this set with another party (who could have pre-shared keys with you) where they can verify (yes or no) if some element of their choice e.g. 'b' is a part of the set S1.
What is the most simple combination of cryptographic primitives that you can use to solve this?
Directions so far
It would seem that hashing the set would be ideal (as opposed to simply encrypting) due to the size constraints.
If we wish to do opaque membership checks some sort of homomorphic encryption is likely needed.
I've read up on Private-Set-Intersection and Private-Set-Membership, however the implementations I found are not minimal and have other "kitchen-sink" functionality that is not desirable.
Some reading so far
- https://engineering.fb.com/2019/03/01/security/homomorphic-hashing/ (https://eprint.iacr.org/2019/227.pdf)
- https://github.com/google/private-membership
- Faster Private Set Intersection Based on OT Extension (pdf)
- Efficient Private Matching and Set Intersection (pdf)
- Faster Unbalanced Set Intersection (pdf)