Pull to refresh

Почему я не лезу в криптографию

Cryptography *
Translation
Original author: Philip Hofstetter
Предлагаю вашему вниманию вольный перевод интересной заметки о тяжком бремени программистов, занимающихся криптографическими алгоритмами. Заметка — личный взгляд человека, который уважает таких программистов, но сам ни за что бы не полез в криптографию.

Мы, программисты, любим ошибаться. Мелкие баги, крупные баги, лень — возможности бесконечны.

Обычно узнаём об этом сразу же: у нас валятся тесты, где-нибудь в логах видны возникшие исключения, или мы слышим жалобы от наших клиентов — мол, то и сё перестало работать.

В большинстве случаев нам даже не важно, насколько этот баг опасен — его можно временно обойти, а приложение продолжит нормально функционировать в целом. Как только причина находится, мы фиксим баг и все довольны.

Но давайте представим, что вы допустили что-нибудь вроде ошибки на одну позицию. Нормально, бывает. А затем обнаруживаете, что даже с этой ошибкой результат работы функции остался неизменным. Как если бы ошибки вообще не было.

Представьте, что не смотря на правильные данные на выходе, из-за этой ошибки они на самом деле абсолютно бесполезны и вся ваша программа также стала абсолютно бесполезной.

Добро пожаловать в мир криптографии.

Криптография не может быть «немного глючной». Не может быть «в целом рабочей». Либо она работает на 100% верно, либо вы зря вообще взялись за эту работу. Слабое звено рвёт всю цепь.

Хуже: разглядывая данные, которые программа производит на выходе, вы не заметите подвоха. Вы шифруете что-то, на выходе какой-то рандомный хлам. Вы дешифруете этот хлам — видите исходный текст. Вроде работает. Да?

На прошлой неделе была статья о бреши в генераторе случайных чисел в алгоритме сервиса cryptocat — отличный тому пример.

Баг был вызван той самой ошибкой на одну позицию в их генераторе случайных чисел. На выходе у функции были по-прежднему случайные числа, и при детальном рассмотрении выглядели случайными. Эффект усилил тот факт, что мы привыкли считать написанный код корректным.

Но это всё не так. Баг присутствовал и случайные числа оказались недостаточно случайными.

Слабейшее звено сломано, все усилия ради обеспечения защиты оказались напрасными, что ещё хуже в данном случае, потому что единственным предназначением этого приложения и была защита.

Защита здесь — не просто дополнительная фича в комплекте к основным. В данном случае она и являлась основным функционалом.

Эта маленькая ошибка на одну позицию вмиг сломала приложение целиком, но была абсолютно невидимой при взгляде на возвращаемый результат. Написание теста для этого случая требовало бы специальных навыков и умений, да и вероятность допущения ошибки в тесте настолько же высока, насколько высока вероятность ошибки в самом коде, требующем тестирования.

Вот почему, друзья мои, я держусь подальше от криптографии. Я просто не настолько крут. Криптография — это мир, где обычного понимания сути, понимания низлежащей математики и умения писать тесты не хватает.

Вы обязаны ставить перед собой цель достичь совершенства. Если достичь не удаётся — вы безнадёжны.

Криптография — это то, что я лучше доверю другим. Либо они смогли достичь совершенства, таких я крайне уважаю, либо у них тоже не вышло, таким я посочувствую.

===
Автор перевода рекомендует заодно почитать habrahabr.ru/post/181372
Tags:
Hubs:
Total votes 101: ↑91 and ↓10 +81
Views 57K
Comments Comments 93