Алексею необходимо передать Виктории пятисимвольный пароль к учетной записи на сайте. Для того, чтобы пароль не был перехвачен, Виктория предлагает использовать следующий способ:
1. Алексей преобразует пароль (параметр psw) с помощью приведенной ниже функции, используя при этом известный только ему ключ (параметр key). Полученную строку отправляет Виктории.
char * E(char psw[5], char key[5])
{
char *res = new char[5];
for(inti = 0 ; i<5 ; i++)
{
res[i] = (psw[i] + key[i])%256;
}
return res;
}
2. Виктория с помощью этой же функции преобразует полученную строку, указывая ее в качестве параметра psw, но используя свой ключ, известный только ей. Результат преобразования отправляется Алексею.
3. Алексей передает в функцию, приведенную ниже, в качестве параметров полученную от Виктории строку и свой исходный ключ:
char * D(char msg[5], char key[5])
{
char *res = new char[5];
for(inti = 0 ; i<5 ; i++)
{
res[i] = (msg[i] - key[i])%256;
}
returnres;
}
4. Возвращаемое функцией значение отправляется Виктории, по которому она восстанавливает пароль.
Алексей отказался от предложения Виктории, сославшись на то, что если не обеспечить подтверждение подлинности абонентов, то нарушитель сможет узнать пароль при перехвате отправляемых по сети строк. Прав ли Алексей? Какой пароль передавался Виктории, если в первом сообщении была перехвачена посланная Алексеем строка ”lptwq ”.
Способ передачи пароля, предложенный Викторией, есть не что иное, как протокол Шамира-Ривеста-Адлемана передачи секретного ключа k от абонента A к абоненту B:
(1) A -> B : Eka(k)
(2) A <- B: Ekb(Eka(k))
(3) A -> B: Dka(Ekb(Eka(k))),
где E – коммутирующее шифрующее преобразование: Ek1(Ek2(x)) = Ek2(Ek1(x)) при всех сообщениях x и для любых ключей k1 и k2, D – преобразование, которое расшифровывает шифрующее преобразование E.
Алексей прав, говоря о том, что если не обеспечить подтверждение подлинности абонентов, то нарушитель сможет узнать пароль при перехвате отправляемых по сети строк, что подтверждается наличием одной из известных слабостей протокола Шамира-Ривеста-Адлемана, которая основана на симметричности сообщений участников.
Использование атаки, реализующей описанную слабость данного протокола, может выглядеть следующим образом:
(1) A -> C(B) : Eka(k)
(2) A <- C(B) : Eka(k)
(3) A -> C(B) : k
Это позволяет ответить на второй вопрос задачи – для того, чтобы прочитать пароль, нарушителю достаточно осуществить доступ к сети от имени Виктории и повторить первое сообщение Алексея, а затем прочитать сообщение от Алексея. Это и будет словом, которое Алексей хотел передать Виктории. То есть, необходимо сообщение «plwsq» передать Алексею от имени Виктории и прочитать ответ – «mhonk». Это и есть пароль, который Алексей собирался передать Виктории.