Простое число формы, позволяющей быстрое модульное сокращение.
В математике простое число Солинаса или обобщенное простое число Мерсенна — это простое число , имеющее вид где — многочлен низкой степени с малыми целыми коэффициентами . [1] [2] Эти простые числа позволяют использовать быстрые алгоритмы модульного сокращения и широко используются в криптографии . Они названы в честь Жерома Солинаса.![{\ displaystyle f (2 ^ {m})}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Этот класс чисел включает в себя несколько других категорий простых чисел:
- Простые числа Мерсенна , имеющие вид
![{\displaystyle 2^{k}-1}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- Простые числа Крэндалла или псевдо-Мерсенна, которые имеют вид малых нечетных . [3]
![{\displaystyle с}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Модульный алгоритм сокращения
Пусть – монический многочлен степени с коэффициентами в и предположим, что это простое число Солинаса. Учитывая число , содержащее до бит, мы хотим найти число, соответствующее модулю только с таким количеством битов, как , то есть с не более чем битами.![{\displaystyle f(t)=t^{d}-c_{d-1}t^{d-1}-...-c_{0}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle d}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle \mathbb {Z} }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle p=f(2^{m})}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle n<p^{2}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle 2md}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle п}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\ displaystyle p}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\ displaystyle p}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle MD}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Сначала представьте в базе :![{\displaystyle п}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle 2^{м}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle n=\sum _{j=0}^{2d-1}A_{j}2^{mj}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Затем сгенерируйте матрицу, пошагово умножая регистр сдвига с линейной обратной связью , определенный полиномом : начиная с целочисленного регистра , сдвигайте вправо на одну позицию, вводите слева и добавляйте (покомпонентно) выходное значение раз. вектор на каждом шаге (подробнее см. [1]). Позвольте быть целым числом в регистре th на шаге th и обратите внимание, что первая строка задается как . Тогда, если мы обозначим целочисленным вектором, заданным формулой:![{\displaystyle d}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle X=(X_{i,j})}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle d}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle \mathbb {Z} }](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle е}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle d}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle [0|0|...|0|1]}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle 0}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle [c_{0},...,c_{d-1}]}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle X_{i,j}}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle j}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle я}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle X}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle (X_{0,j})=[c_{0},...,c_{d-1}]}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle B=(B_{i})}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
,
можно легко проверить, что:
.
Таким образом, представляет собой -битное целое число, соответствующее .![{\displaystyle B}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle MD}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle п}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
При разумном выборе (опять же, см. [1]) этот алгоритм включает лишь относительно небольшое количество сложений и вычитаний (и никаких делений!), поэтому он может быть намного более эффективным, чем наивный алгоритм модульной редукции ( ).![{\displaystyle е}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle np\cdot (n/p)}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Примеры
Четыре из рекомендованных простых чисел в документе NIST «Рекомендуемые эллиптические кривые для использования федеральным правительством» являются простыми числами Солинаса :
- р-192
![{\displaystyle 2^{192}-2^{64}-1}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- р-224
![{\displaystyle 2^{224}-2^{96}+1}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- р-256
![{\displaystyle 2^{256}-2^{224}+2^{192}+2^{96}-1}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
- р-384
![{\displaystyle 2^{384}-2^{128}-2^{96}+2^{32}-1}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Curve448 использует простое число Солинаса.![{\displaystyle 2^{448}-2^{224}-1.}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Смотрите также
Рекомендации
- ^ Солинас, Джером А. (1999). Обобщенные числа Мерсенна (PDF) (Технический отчет). Центр прикладных криптографических исследований Университета Ватерлоо. КОРР-99-39.
- ^ Солинас, Джером А. (2011). «Обобщенное простое число Мерсенна». В Тилборге, фургон Henk CA; Яджодиа, Сушил (ред.). Энциклопедия криптографии и безопасности . Спрингер США. стр. 509–510. дои : 10.1007/978-1-4419-5906-5_32. ISBN 978-1-4419-5905-8.
- ^ Патент США 5159632, Ричард Э. Крэндалл, «Метод и устройство для обмена открытыми ключами в криптографической системе», выдан 27 октября 1992 г., передан NeXT Computer, Inc.