Предлагаю вашему вниманию вольный перевод интересной заметки о тяжелом бремени программистов, работающих над криптографическими алгоритмами.
Примечание — личное мнение человека, который уважает таких программистов, но сам никогда не влезет в криптографию.
Мы, программисты, любим ошибаться.
Маленькие ошибки, большие ошибки, лень — возможности безграничны.
Обычно мы об этом узнаём сразу: у нас разваливаются тесты, где-то в логах видны возникшие исключения или мы слышим жалобы от клиентов — мол, то-то и то-то перестало работать.
В большинстве случаев нас даже не волнует, насколько опасен этот баг — его можно временно обойти, и приложение в целом продолжит нормально функционировать.
Как только причина будет найдена, мы исправим ошибку и все будут довольны.
Но давайте представим, что вы сделали что-то вроде ошибки на одну позицию .
Это нормально, такое случается.
И тут вы обнаруживаете, что даже при этой ошибке результат функции остался неизменным.
Как будто ошибки вообще не было.
Представьте, что, хотя вывод верен, из-за этой ошибки он фактически совершенно бесполезен, и вся ваша программа также совершенно бесполезна.
Добро пожаловать в мир криптографии.
Криптография не может быть «немного глючной».
Он не может быть «в целом работающим».
Либо оно работает на 100% правильно, либо вообще не стоило браться за эту работу.
Слабое звено разрывает всю цепочку.
Худший: глядя на данные, которые программа выдаёт на выходе, вы не заметите подвоха.
Вы что-то шифруете, а на выходе получается какой-то случайный мусор.
Расшифровываешь эту чушь - видишь оригинальный текст. Кажется, это работает. Да? На прошлой неделе была статья о пробелах в генераторе случайных чисел в алгоритме сервиса cryptocat является отличным примером этого.
Ошибка была вызвана той же ошибкой для одной позиции в их генераторе случайных чисел.
На выходе функции по-прежнему были случайные числа, и при ближайшем рассмотрении они выглядели случайными.
Эффект усиливался тем, что мы привыкли считать написанный код правильным.
Но это не правда.
Произошла ошибка, и случайные числа были недостаточно случайными.
Самое слабое звено разорвано, все усилия по обеспечению защиты оказались напрасными, что в данном случае еще хуже, ведь единственной целью этого приложения была защита.
Защита здесь — это не просто дополнительная функция, включенная в состав основных.
В данном случае это был основной функционал.
Эта небольшая ошибка в одну позицию мгновенно сломала все приложение, но была совершенно незаметна при взгляде на возвращаемый результат. Написание теста для этого случая потребует специальных навыков и умений, а вероятность допустить ошибку в тесте так же высока, как и вероятность ошибки в самом коде, требующем тестирования.
Друзья мои, именно поэтому я держусь подальше от криптовалют. Я просто не такой уж и крутой.
Криптография — это мир, где обычного понимания сути, понимания лежащей в основе математики и умения писать тесты недостаточно.
Вы должны поставить перед собой цель достичь совершенства.
Если вам не удастся достичь цели, вы безнадежны.
Криптография — это то, что я бы предпочел оставить другим.
Либо они смогли достичь совершенства, я их чрезвычайно уважаю, либо у них тоже не получилось, я им сочувствую.
=== Автор перевода рекомендует читать одновременно habrahabr.ru/post/181372 Теги: #мнение #криптография #цена ошибки #рандомизация #офф-бай #криптография
-
Магия Ветра И Шелка
19 Oct, 24 -
Логика Adobe
19 Oct, 24 -
Судебные Иски По Поводу... Патентов На Wi-Fi
19 Oct, 24 -
Об Идентичности В Логотипах
19 Oct, 24 -
Пять Тупиковых Диалогов Лидера И Менеджера
19 Oct, 24