Алексею необходимо передать Виктории пятисимвольный пароль к учетной записи на сайте. Для того, чтобы пароль не был перехвачен, Виктория предлагает использовать следующий способ:
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. Возвращаемое функцией значение отправляется Виктории, по которому она восстанавливает пароль.
Способ передачи пароля, предложенный Викторией, есть не что иное, как протокол Шамира-Ривеста-Адлемана передачи секретного ключа 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
Это позволяет ответить на второй вопрос задачи – для того, чтобы прочитать пароль, нарушителю достаточно осуществить доступ к сети от имени Виктории и повторить первое сообщение Алексея, а затем прочитать сообщение от Алексея. Это и будет словом, которое Алексей хотел передать Виктории. То есть, необходимо сообщение «wskjq» передать Алексею от имени Виктории и прочитать ответ – «tocek». Это и есть пароль, который Алексей собирался передать Виктории.