logo
Коды и шифры

Защита программ и данных

Целостность программ и данных можно обеспечивать как с помощью шифрования, так и без него. Программы состоят из блоков кода. Данные обычно также хранят и передают блоками или пакетами. Если каждый блок преобразовать в набор чисел, к которым затем применяется некоторая математическая функция, то полученное в результате значение можно как зашифровать, так и оставить без изменения. В любом случае это окончательное значение функции можно записать в конце блока в качестве контрольной суммы. Если кто-нибудь захочет изменить что-либо в этом блоке, то он должен не только уметь вычислить для нового блока значение математической функции, но и осуществить зашифрование там, где это потребуется. Если он не умеет делать это, то контрольная сумма не совпадет, и станет очевидно, что блок подвергся изменению. В 50-х годах для программ и данных, хранившихся на магнитной ленте, применялась одна из первых, и самых простых вариаций этого подхода - использование проверок на четность. В этом случае никакого шифрования не производилось. Для каждого шестиразрядного (впоследствии восьмиразрядного) символа в данном блоке вычислялась контрольная сумма, называемая поперечной проверкой на четность, а другая контрольная сумма, называемая продольной проверкой на четность и основанная на подсчете числа единиц в каждом из шести (или восьми) отдельных битовых потоков, вычислялась в конце блока. Эти контрольные суммы обычно строились так, что каждый поток из нулей и единиц содержал нечетное число единиц. Этого было достаточно для поиска и исправления одиночной ошибки в блоке. Если блок содержал две или более ошибок, то исправить их было нельзя, а иногда нельзя было и обнаружить. Запоминающие устройства выполняли эти проверки автоматически и заново считывали каждый блок, не прошедший проверку на четность. Пыль на ленте могла вызвать ошибки при считывании, и частенько можно было видеть, как ленты перематываются туда-сюда, прежде чем двинуться дальше. Поскольку проверочные биты вычислялись самим компьютером, то в случае действительного обнаружения единичной ошибки не было никаких трудностей при восстановлении данных. Проверки на четность были разработаны не для защиты от злоумышленников, которым было вполне по силам изменить и данные, и контрольные суммы, а предназначались только для защиты данных от пыли, в том числе от сигаретного пепла, и от машинных сбоев. Выяснилось, что курение в машинном зале, широко распространенное в первые годы, часто является причиной ошибок при записи, и оно было впоследствии запрещено. Время от времени случалось, что данные на магнитной ленте в порядке, а неисправны были проверочные схемы в самих лентопротяжных механизмах. Операторы ЭВМ быстро выяснили это, а в США также и то, что если в определенное место лентопротяжного механизма вставить монету достоинством в четверть доллара, то проверочная схема отключается.

Как только стало возможно установить связь между компьютерами, чтобы они могли обмениваться "сообщениями" (например, программами или данными), возник вопрос, как добиться того, чтобы эти сообщения не "искажались" при передаче ни случайно, ни преднамеренно. И если проверка на четность могла обеспечить защиту от случайных искажений, особенно при использовании более совершенных кодов, исправляющих ошибки (таких, которые описаны в [1.1].[1.2] и [1.3]), то злоумышленник всегда мог вычислить необходимую контрольную сумму для любого измененного им блока и тем самым избежать обнаружения. Так пришли к осознанию необходимости шифрования с использованием системы, которую злоумышленник не сможет воспроизвести.