Это то, над чем я работаю.
Я хотел бы, чтобы «маленький» ниже был намного меньше, чем то, что следует. Но это будет работать для ваших целей для набора двоичных строк $S$, криптографический хэш $Ч(х)$и общий ключ $к$.
$H(S)=\text{сортировка} \{H(x) | х \в S\}$. Назовите это публичным свидетелем $S$. Вы можете скрыть размер набора, включив случайные хэши в заданный модуль длины. Это будет публичный свидетель, не честный, но дающий основную идею.
Предполагая размер $х$ обычно намного больше, чем $Ч(х)$, представление свидетеля $Ч(С)$ за $S$ мало по сравнению с представлением для $S$.
Если вы хотите ограничить это теми, у кого есть предварительно общий симметричный ключ k: (я использую $+$ для добавления, чтобы отличить от набора «такой, что»)
$H^2(k+S)=\text{sort} \{H(k+H(k+x)) | х \в S\}$. Добавьте контрольную сумму с ключом для проверки целостности.
$\text{свидетель для S}: H^2(k+S) + H(k+H^2(k+S))$
Опять же, чтобы скрыть размер $S$ вы всегда можете добавить случайные хэши к максимальному размеру или (несовершенно) к модулю размера.
Проверка членства: отправить $(n,H(k+n) \bigoplus H(k+x))$ куда $n$ является возрастающим числом (может подразумеваться, например, как метка времени). Получатель может раскрыть $Ч(к+х)$ а затем вычислить $Ч(к+Н(к+х))$ чтобы увидеть, есть ли он в наборе свидетелей.