Шифры замены
Теперь посмотрим, как обычно практически выполняется шифрование заменой с помощью ЭВМ. Самый простой и эффективный способ сделать текст нечитаемым - спрятать его, смешав с последовательностью случайных чисел, заданной ключом, с помощью операции XOR( Операция XOR выполняет следующие действия: (О XOR 0)-0, (О XOR 1)=1, (1 XOR 0)=1, (1 XOR 1)=0. ). При этом информация сообщения прячется в шуме - самом информативном, по определению Шеннона, сигнале. Все правильно, песчинку лучше прятать на пляже, рыбу в море, а информацию в шуме.
Есть и другие обоснования выбора случайных чисел для шифрования заменой. Можно исходить из того, что криптоаналитик попытается снизить неопределенность чтения шифровки, зная статистические свойства нашей последовательности. А как только человеку становится известным чье-то намерение, то его поведение соответственно меняется. Поэтому если криптоаналитик знает наше намерение использовать последовательность, где 1 встречается с вероятностью р, а 0 с вероятностью 1-р, то, зная теорию игр, он тоже с вероятностью р будет предполагать наличие 1. Вероятность его успехов будет равна:
Р(Р)=Р-Р+(1-Р)-(1-Р)
Эта функция достигает минимума при р=0.5, что выпадает при случайном выборе из 0 и 1 с равновероятными исходами. Далее, если биты в случайной последовательности с одинаковой вероятностью принимают значения 0 и 1, то биты в шифровке будут обладать тем же свойством. Докажем это. Пусть вероятность нулевого бита в тексте равна р, а единичного соответственно 1-р. Нулевой бит в шифровке появляется, когда соответствующие биты последовательности и текста оба равны либо О, либо 1. Значит, вероятность появления нулевого бита в шифре равна:
Р=0.5-р+0.5-(1-р)=0.5
Более того, если биты в используемой для шифрования случайной последовательности статистически независимы друг от друга, то и в шифровке они становятся такими же. Текст превращается во что угодно, то есть в шум. Из-за специфики операции XOR процедура шифрования совпадает с процедурой расшифрования. Например, обозначив через t вектор бит сообщения, у вектор случайной последовательности и s шифровки, получаем t=s XOR у и s=t XOR у. Приведем пример программной реализации этого шифра на языке QuickBasic, называемого далее просто шифром замены. Такие шифры образуют подмножество многоалфавитных шифров замены, которые мы рассматривали выше.
'пример шифрования заменой
DECLARE SUB CodeAndPrint (Password!, Map%())
DEFINT I-N: CLS
DIM Map (40) : CONST Password = -231.157
' сообщение
FOR i = 1 TO 40
Map(i) = ASC ("A")
NEXT
FOR i = 1 TO 40
PRINT CHR$ (Map (i) ) ;
NEXT
'шифровка
CALL CodeAndPrint (Password, Map())
' расшифровка
CALL CodeAndPrint ( Password, Map ( ) )
END
SUB CodeAndPrint (Password, Map())
x = RND (Password)
FOR i = 1 TO 40
Map(i) = INT(32 * RND) XOR Map(i)
NEXT
FOR i = 1 TO 40
PRINT CHR$ (Map (i) ) ;
NEXT
END SUB
В результате работы программы появляются три строки, представляющие собой: верхняя - исходный текст, средняя - шифрованный, а нижняя - расшифровку:
АААААААААААААААААААААААААААААААААААААААА
ЦСТЙЙШАШЬЦБНЫЩЛЮЫБЮЛРШБТОЙУФИИЪЪТЯЭЗЦЯЗС
АААААААААААААААААААААААААААААААААААААААА
У машинного многоалфавитного шифра замены с помощью операции XOR есть ряд очень слабых мест, которые нужно знать и учитывать использовании этого шифра. Серьезную неприятность может доставить обратимость этого шифра, так как для расшифровки применяется то же самое преобразование, что и для зашифровки. В том случае, если одно и то же сообщение должно быть послано нескольким адресатам и шифруется одним и тем же шифром может произойти так, что длина сообщения изменится из-за сбоя или ошибки. В этом случае будет получено 2 сообщения разной длины. Так, если имеем две шифровки s' и s", которые отличаются тем, что исходный текст сообщения оказался сдвинутым на один символ:
S'(i)=T(i)+Y(i);S"(i+1)=T(i+1)+Y(i)
где t - текст, а у - ключ, то, находя их сумму, получим сумму текста со сдвигом:
S(i)=S'(i)+S"(i+1)=T(i)+T(i+1).
Исходный текст можно получить, подобрав S0, которое неизвестно, в выражении:
T(n)=S0+S1+S2+...+Sn
Следующий пример демонстрирует эту технику. Пусть по двум шифровкам, полученным из текста, сдвинутого на один символ, образована следующая их сумма:
ЗВГЮШВЪСЮШТБПРЩВЦТЮТТБПРГВТЬ S(i)
Подбором S0 получаем текст исходного сообщения:
ГЕИЕЭЯШИЕЭОПЮНЕЗЭОЛЭОПЮНРТЛХ | S0=29 | |
ДЖИЖЮ ЩЙЖЮПРЯОХИЮПМЮПРЯОСУМЭ | S0=30 | |
ЕЭКЭЯАЪКЗЯРС ПЗЙЯРНЯРС ПТФНИ | S0=31 | |
ЖИЛИ БЫЛИ СТАРИК СО СТАРУХОЙ | S0=32 |
Другая неприятность с машинным многоалфавитным шифром замены может возникнуть, если в сообщении встречаются большие участки пробелов или нулевых символов. Допустим, например, что линия связи недозагружена, но в то время, когда нет сообщений, аппаратура шифрования не выключается. Поэтому когда сообщений нет и t=0, шифровка будет представлять собой "чистую" последовательность ключа. Если в это время с помощью специальной аппаратуры перехватить шифровку, представляющую собой ключ s=y, то можно наложить на нее текст своего сообщения s'=s+t=t+y и передать искаженную шифровку по каналу связи. Получатель, расшифровав ее:
s'+y=s+t+y=t+y+y=t
получит переданный ему перехватчиком текст сообщения. А так как этот текст поступит в шифрованном виде, то его содержимому могут поверить, а это уже никак не допустимо. Так как перехватчик не знает, свободна ли линия, то будет накладывать свой текст на непрерывный шифрованный сигнал наугад несколько раз. Даже если в это время по линии шла передача - не беда, скорее всего возникшие искажения будут интерпретированы как помехи в канале связи.