Этот инструмент реализует пороговое разделение секрета Шамира над GF(256): секрет делится на n долей, и любые k из них (порог) могут его восстановить, а k-1 и меньше ничего не раскрывают — секретность на уровне теории информации.
Два режима:
- Разделить: вставьте секрет (любой UTF-8 — пароль, API-ключ, seed-фразу, фразу восстановления), задайте порог
k и всего n (2 ≤ k ≤ n ≤ 255), получите n долей. Раздайте каждому держателю по одной.
- Восстановить: вставьте
k или больше долей (по одной в строке) для восстановления секрета через интерполяцию Лагранжа в x=0.
Как работает. Каждый байт секрета — свободный член случайного полинома степени k-1 над GF(256). Доля i — значение полинома в x=i. Для восстановления нужно k точек, чтобы однозначно определить полином степени k-1. Коэффициенты берутся из crypto.randomBytes() (CSPRNG ОС), никогда Math.random().
Ограничения — прочитайте:
- Только конфиденциальность, без целостности. Держатель доли может отправить поддельное значение при восстановлении; расчёт даст правдоподобный, но неверный секрет, и вы не узнаете. Если нужна защита от подмены, подпишите секрет (или его хэш) до разделения и проверьте после объединения.
- Пределы GF(256).
n ограничено 255 (размер поля), k должно быть ≥ 2.
- Формат доли. Каждая доля —
sss: + base64url из [координата x, y-байт₁, y-байт₂, …]. Сохраняйте строку целиком; обрезка ломает восстановление.
Сценарии. Эскроу/восстановление ключей (разделить мастер-ключ между руководителями), социальное восстановление для некастодных кошельков, распределение пароля так, что ни один человек не владеет им целиком, извлечение секрета по типу «dead man's switch».