Бытовая криптография
Недавно столкнулся с интересной задачей. Мне потребовалось сообщить цифровой пароль "1234567890" другому человеку, используя открытый канал связи и не используя алгоритмы Диффи-Хеллмана и прочие наработки времен Алисы и Боба. Показалось отличной идеей разделить это число последовательно на два других X и Y, известных только мне и адресату (например, номера квартиры и дома), сообщить частное, описать делители и попросить произвести обратную операцию. Взяв X=17, а Y=151, я произвел операцию 1234567890/17/151 = 480938,0171406311. Моему собеседнику потребовалось бы умножить 480938,0171406311 на 17 и 151, получить число 1234567890, которое и оказалось бы искомым паролем.
Вроде как все надежно, теоретически злоумышленнику надо произвести свыше 100000 перемножений, что должно занять продолжительное время. Однако в рассуждения закралась серьезная ошибка - во-первых, их можно сделать в Excel за пару минут. А во-вторых, потенциальной вражине просто не потребуется вбивать все полученные произведения. Из перехваченной переписки будет ясно, что произведение-пароль должно получиться натуральным числом, а их будет очень мало.
Я составил таблицу произведения числа 480938,0171406311 и двух случайных чисел от 0 до 300. Как оказалось, натуральных (без десятичных дробей) среди них ничтожное количество и их можно отыскать простым условных форматированием ( A1-ЦЕЛОЕ (A1)=0 )
Как же бороться с таким упущением? Решение оказалось простым. Надо было к начальному паролю после запятой добавить с десяток случайных чисел, вроде 1234567890,646138 и уже это число делить на X и Y. После в конечной матрице будет невозможно опознать исходный пароль, так как он никак не будет отличаться от других произведений.
Полагаю, что этот метод передачи паролей пригодится в усложненном виде, если вдобавок ввести дополнительные делители. Тогда таблицу взлома придется делать применяя многомерные массивы, но случайная дробная часть искомого пароля сведет все усилия на нет.