
Какая связь есть между умножением методом русских крестьян и современной криптографией? В отличие от обычно изучаемых процедур умножения, его можно запросто адаптировать под вычисление степеней, а не произведений; и в некоторых криптосистемах требуется вычисление именно степеней.
Должен сразу признаться, что статья не будет посвящена тому, как русским крестьянам удавалось обмениваться информацией втайне от своих помещиков.
Умножение методом русских крестьян
Если вы не знали о нём раньше, то это довольно любопытный подход к умножению, который не требует запоминания таблиц умножения — для него достаточно способности удваивать и делить пополам целые числа. Не очень понятно, как он относится к русским крестьянам: похоже, так же, как «датская сдоба» к Дании. Этот метод был известен ещё древним египтянам, которые явно жили намного раньше русских крестьян.
Общее описание метода просто, но не слишком информативно. Тем не менее, давайте начнём с него.
Если нам нужно перемножить два целых числа
Гораздо понятнее всё станет, если привести пример. Так что давайте выполним умножение
Теперь мы складываем правые значения, у которых левые значения нечётны, что даёт нам
Что, как можно легко убедиться, является результатом
Разумеется, интересно то, почему эта загадочная процедура работает?
Если посмотреть в левую колонку, и пройтись до самого верха, записывая
Затем, как мы видим, повторяющееся удвоение колонки
То есть таким методом мы можем перемножать любые целые числа, и более того — алгоритм достаточно эффективен. Нужно признать, что он не так эффективен, как обычно изучаемые сейчас способы со столбиками или таблицами, но, по крайней мере, для него не нужно запоминать таблицы умножения.
Это всё довольно мило, но примечательно то, что метод можно слегка преобразовать для выполнения гораздо более сложных вычислений, которые очень полезны в современной криптографии (с открытым ключом).
Возведение в степень методом русских крестьян
Мы внесём в алгоритм два небольших изменения; оба будут касаться только колонки
- Вместо удвоения мы будем возводить в квадрат
- Вместо сложения в конце мы будем умножать.
Для каждой строки в таблице вместо умножения
Давайте посмотрим, как это будет работать с теми же значениями
Умножение соответствующих членов даёт
Что на самом деле равно
Но в отличие от умножения, такой метод не просто достаточно эффективен: он очень эффективен.
Если мы хотим найти
Но благодаря этому алгоритму количество необходимых возведений в квадрат максимум примерно в
Разумеется, для этого мы должны уметь умножать, но это нас устраивает: алгоритм умножения позволяет нам умножать удвоением и сложением, а адаптированная версия позволяет возводить в степень возведением в квадрат и умножением. Это выгодная сделка.
Краткое знакомство с RSA
Смысл этого в том, что способ реализации криптографии с открытым ключом RSA (Rivest-Shamir-Adleman) (и некоторые другие) подразумевает, что для шифрования и расшифровки сообщений нам нужно вычислять степени.
Процедура работает следующим образом: мы выбираем закрытую пару простых чисел
Затем мы подбираем число
Теперь мы представляем сообщение как целое число
Благодаря магии теории чисел (на самом деле это не магия, а малая теорема Ферма) исходное сообщение будет являться остатком от деления
В принципе, этого хватит, в Интернете есть и так множество других описаний, часто проиллюстрированных значениями
И тут возникает одна проблема.
На практике значения
Но это не единственная проблема.
Значение
Ответом снова будет теория чисел. Одно из очень удобных свойств вычисления остатков заключается в том, что неважно, на каком этапе расчётов мы их находим. Если нам нужно узнать остаток от какой-то величины при делении на
RSA русских крестьян
Итак, теперь мы видим, как вычислить зашифрованное сообщение. Можно использовать адаптированное умножение по методу русских крестьян, но теперь мы можем добавить последний штрих — когда квадрат числа превышает
Давайте посмотрим, как это работает, на примере нахождения остатка от деления
Что даёт нам
И это на самом деле (фух!) является остатком от деления
Но вот неожиданная развязка. Это алгоритм вычисления степени, который обычно называется возведением в степень (повторяющимся) возведением в квадрат. И на самом деле этот алгоритм (или его небольшая вариация) используется в реализации криптографии с открытым ключом (например, в RSA), в которой применяется вычисление степеней.
Вот к чему мы пришли. Алгоритм умножения, который применялся людьми, не знавшими таблицы умножения, превратился в алгоритм возведения в степень, который лежит в основе современных криптографических методов.
Благодарности
На MathsJam Gathering 2017 Элен Смит и Линда Голденберг выступили с докладом о техниках умножения, в том числе о методе русских крестьян. Именно тогда до меня наконец дошло, что алгоритм повторного возведения в квадрат является адаптацией умножения русских крестьян, и я понял, что стоит поделиться этим осознанием с читателями. Через двадцать минут Оливер Мастерс рассказал о матрице Фибоначчи и упомянул алгоритм повторного возведения в квадрат для возведения в степень матрицы. К счастью, он не связал его с алгоритмом умножения. Ещё через пять минут Колин Райт (@ColinTheMathmo) подвёл итог докладам и упомянул об этой связи. Но к тому моменту я уже всё равно принял решение написать эту статью, что и сделал.