Просто чтобы добавить некоторые дополнительные детали к отличный ответ кодлу:
Чтобы поделиться некоторыми секретными данными, используя Секрет Шамира над конечным полем $\mathrm{GF}(k)$, вам сначала нужно закодировать эти данные как $м ¥ 1$ элементы поля (которые естественным образом представляются целыми числами в диапазоне от $0$ к $к-1$), а также назначьте каждому общему ресурсу, который вы хотите создать, отдельный ненулевой элемент поля в качестве идентификатора общего ресурса (т. е. $х$ координата, в которой полином, генерирующий долю, оценивается для получения этой доли).
Затем вы применяете процесс генерации акций, который даст вам несколько акций, каждая из которых состоит из $м$ элементы поля $\mathrm{GF}(k)$ (плюс идентификатор общего доступа). По построению эти доли распределены равномерно и $t-1$ мудрый независимый, где $t$ - параметр порога реконструкции схемы, означающий, что любое подмножество $s <t$ акций неотличимы от $s$ последовательности $м$ элементы поля выбираются независимо равномерно случайным образом. В частности, как слабое следствие этого, все элементы поля, составляющие доли, обязательно равномерно распределены между $0$ и $к-1$, включительно.
Теперь предположим, что секретные данные, которыми вы хотите поделиться, являются двоичными и закодированы в виде строки $n$ биты. Если вы используете бинарное поле, такое, что $к = 2^б$ (и если $n$ является кратным $b$), то отобразить секрет в последовательность элементов поля очень просто: просто вырежьте $n$-битовая строка в $m = \frac nb$ кусочки $b$ битов, каждый из которых естественным образом отображается на элемент поля. А так как каждый элемент $\mathrm{GF}(2^b)$ также однозначно отображается в строку $b$ биты, ваши акции также могут быть представлены как $n$битовые строки (плюс идентификатор общего ресурса) просто путем объединения (двоичных представлений) элементов поля в каждом общем ресурсе.
(Если длина данных $n$ является переменной и не обязательно является целым числом, кратным $b$, вам может понадобиться применить некоторые набивка недвусмысленно указать его длину перед тем, как поделиться им, но это все еще лишь небольшая сложность. И если ваши данные закодированы как восьмибитные байты, и вам не нужно более 255 общих ресурсов, вы можете просто использовать $\mathrm{GF}(2^8)$ и пропустить заполнение.)
Что, если вы не хотите использовать бинарное поле? Тогда у вас есть несколько вариантов:
Выберите самый большой $b$ такой, что $ 2 ^ б < к $, разбить данные на $b$битовые фрагменты, сопоставьте их с элементами поля и поделитесь ими. Основным недостатком этого является то, что случайные элементы поля в акциях будут нет вписаться $b$ биты (поскольку $ 2 ^ б < к $), поэтому вам нужно будет закодировать их, используя $б+1$ биты каждый, тратя по крайней мере $м$ бит на акцию. (Кодирование переменной длины после совместного использования здесь не поможет, так как вы не можете сжать равномерно случайные данные. Кодирование переменной длины перед совместное использование небезопасно, поскольку в этом случае длина вашего общего ресурса приведет к утечке информации о секрете.)
Вы также не можете организовать оба $b$ и $б+1$ быть удобными «круглыми» значениями, такими как 8, 16, 32, 64, 128 или 256, что означает, что либо ваши фрагменты данных, либо фрагменты общего доступа неизбежно будут иметь неудобную длину. Например, допустим, вы хотите поделиться 256-битными ключами шифрования; вы могли либо выбрать $б = 256$, и в этом случае ваши доли будут иметь длину 257 бит (и, если вы хотите использовать простое поле, вам нужно будет выполнять вычисления по модулю 257-битного простого числа), или $б = 255$, и в этом случае вам нужно будет разделить ключи на два элемента поля, что приведет к 512-битным долям. Или вы могли бы использовать, скажем, $б = 32$ (и, скажем, простое поле $\mathrm{GF}(2^{32}+15)$, что немного неудобно для работы с использованием 64-битной арифметики, но не невозможно, особенно если вам не нужно выполнение с постоянным временем) и в итоге 33$ \умножить на 8 = 264$ бит делится после некоторого перемешивания битов, что может быть приличной золотой серединой.
Используйте общее преобразование системы счисления из двоичного в базовое. $к$ для оптимального кодирования ваших данных (т.е. интерпретировать $n$-битные двоичные данные в виде числа из $0$ к $2^n-1$, затем выразить это число в основе $к$) и обратное преобразование системы счисления с основания $к$ чтобы преобразовать акции обратно в двоичные файлы. Вы все равно будете тратить несколько битов, поэтому ваши акции будут длиннее, чем данные, но только на постоянную величину. Недостатком является то, что преобразование системы счисления медленнее и сложнее в реализации, чем простое перетасовка битов. Кроме того, вам почти наверняка понадобится какая-то схема заполнения, если длина вашего секрета не фиксирована. (И обязательно всегда используйте $m = \lceil n \log_k 2 \rceil$, даже если ваше секретное значение уместилось бы в меньшем количестве базовых $к$ цифры, чтобы избежать утечки информации о секрете из-за длины общего ресурса.)
Теперь ни одно из этих осложнений не является непреодолимым, но они делать усложняют реализацию и делают совместное кодирование менее эффективным. Для сравнения, даже если вам придется реализовать $\mathrm{GF}(2^b)$ арифметика с нуля сама, с бинарным полем все же проще.