Что нужно изменить в схеме, чтобы она не была чувствительна к длине секретного текста?
Ну, Вадим уже упомянул, что Shamir Secret Sharing должен выполняться в конечном поле; однако это не касается вашего вопроса.
В схеме Шамира один экземпляр может совместно использовать любое значение между $0$ и $p^k - 1$ (куда $p^k$ — это размер конечного поля, которое вы используете [1]). А с Шамиром нет разницы в безопасности между различными конечными полями, поэтому мы можем выбрать одно из практических соображений (например, количество секретов, которые вы хотите иметь возможность выдать, размер секрета, простота реализации различные операции с конечным полем).
Однако то, что вы хотите сделать, это поделиться паролем в качестве секрета; этот пароль довольно длинный и имеет переменную длину. Что ж, есть две очевидные альтернативы:
- Выберите $p^k$ (или премьер $р$ если ты пойдешь с $к-1$) достаточно большой, чтобы вместить любой пароль, которым вы хотите поделиться; например, если вы используете $р=2^{521}-1$ (что является простым), вы можете делиться паролями длиной до 65 символов. Это работает, однако недостатком является то, что такие большие значения необходимо обрабатывать с помощью библиотеки bignum. Если вы используете язык со встроенной библиотекой bignum (например, Python), это не проблема, а если нет, то, вероятно, будет проще использовать вторую идею.
С этой идеей, если бы у нас был пароль «letmein» (0x6c 0x65 0x74 0x6d 0x65 0x69 0x6e в ASCII), мы могли бы закодировать его как целое число 0x6c65746d65696e = 30510848210725230.
- Разделите пароль на несколько секретов и делитесь каждым секретом отдельно. Например, для 14-символьного пароля мы можем разделить его на 14 отдельных секретов (каждый секрет представляет собой один символ из пароля) и поделиться каждым символом, используя $р=257$ и $к=1$ (таким образом, каждая сторона получит в общей сложности 14 долей, по одной доле для каждого из 14 символов). С этой идеей безопасно использовать один и тот же идентификатор для всех акций, которые получает сторона; однако важно, чтобы каждый секрет генерировался с использованием независимой случайности (то есть каждый из 14 случайных полиномов генерировался отдельно).
С этой идеей мы закодировали бы пароль «letmein» как 8 независимых секретов 0x6c 0x65 0x74 0x6d 0x65 0x69 0x6e.
С этой второй идеей, если вы не хотите раскрывать длину секрета, вы можете всегда делиться фиксированным количеством секретов (это будет максимальная длина пароля, которым вы можете поделиться, скажем, 32) и для более коротких паролей заполните дополнительные секретные символы значением, которое не может встречаться в реальном пароле (для моего примера $р=257$, очевидным значением для использования будет $256$).
[1]: Для любого простого $р$ и любое целое число $к$, существует конечное поле размера $p^k$. Вероятно, вам было бы проще начать с использования поля с $к=1$ и $р$ простое число соответствующего размера - это делает операции сложения, вычитания и умножения намного ближе к стандартным алгоритмам, с которыми вы знакомы (деление все еще шаткое).