У меня болит голова, когда я смотрю на этот пролог-код, и я не могу, кажется, обернуться вокруг того, что нужно сделать ...
По сути, код пытается взломать данный протокол, что означает наличие секретных данных, о которых злоумышленник хочет получить информацию.
Таким образом, злоумышленник пытается атаковать, чтобы получить этот секрет. Для этого он должен успешно запустить протокол.
successfulRun(Init_1,Init_2,Init_3,RespGet_1,RespGet_2,RespGet_3,Resp_1,Resp_2,Resp_3,XchdGet_1)
Init, Resp и Xchd - это имена отправленных сообщений.
Этот предикат в основном говорит, что успешный запуск - это когда отправляется некий Init_X (X являются частями сообщения), получатель Init_X отправляет RespGet_X в качестве ответа, злоумышленник перехватывает RespGet_X и отправляет Resp_X сам, а получатель Resp_X отправляет XchdGet_X в качестве ответа .
Тогда у меня полный прогон, который я принимаю к сведению.
asserta(fullRun(Init_1,Init_2,Init_3,RespGet_1,RespGet_2,RespGet_3,Resp_1,Resp_2,Resp_3,XchdGet_1))
Секрет раскрывается, если злоумышленник узнает секрет после успешного запуска.
Если секрет не раскрыт, знания, полученные во время атаки, должны быть удалены (потому что на самом деле вы не сможете атаковать один экземпляр взаимодействия дважды).
Затем начинается новая попытка атаки.
Если атака удалась и секрет был раскрыт, пишется небольшая информация о том, как злоумышленник получил секрет.
tryToAttack(Secret) :-
successfulRun(Init_1,Init_2,Init_3,RespGet_1,RespGet_2,RespGet_3,Resp_1,Resp_2,Resp_3,XchdGet_1),
asserta(fullRun(Init_1,Init_2,Init_3,RespGet_1,RespGet_2,RespGet_3,Resp_1,Resp_2,Resp_3,XchdGet_1)),
(
(
leaks(Secret),!
);
(
\+leaks(secret),
(
deleteAttackKnowledge;
(
tryToAttack(Secret),
true
)
)
)
),
writeAttackPattern(Secret,Init_1,Init_2,Init_3,RespGet_1,RespGet_2,RespGet_3,Resp_1,Resp_2,Resp_3,XchdGet_1).
Хорошо, вот где начинается проблема:
Во время успешного запуска знание атаки извлекается. Это знание утверждается как факт! Если бы оно не было постоянным, проблем не было бы. Таким образом, альтернативой может быть не делать знание атаки постоянным.
Если прогон прошел успешно, но у нас уже был полный прогон, как это, я хочу сделать еще один прогон с самого начала, который отличается от последнего прогона. Я также хочу, чтобы все знания об атаках, полученные во время последнего запуска, были удалены.
Проблема, которую я вижу: если я поставлю
(
fullRun(...),
deleteAttackKnowledge
)
в конце successRun Пролог пытается вернуться к init или соответственно, где злоумышленник создает свои сообщения. Если Пролог возвращается к респ, новый прогон не получает знания об атаке от respGet.
Я хочу
1. сделать бег
2. посмотреть, был ли этот пробег уже сделан
3. Если это уже сделано, удалите все знания об атаках и перейдите к (1), выполнив другой прогон.
successfulRun(Init_1,Init_2,Init_3,RespGet_1,RespGet_2,RespGet_3,Resp_1,Resp_2,Resp_3,XchdGet_1) :-
init(Init_1,Init_2,Init_3),
canBuild(Init_1),
canBuild(Init_2),
canBuild(Init_3),
respGet(RespGet_1,RespGet_2,RespGet_3,Init_1,Init_2,Init_3),
extractAttackKnowledge(RespGet_1),
extractAttackKnowledge(RespGet_2),
extractAttackKnowledge(RespGet_3),
resp(Resp_1,Resp_2,Resp_3),
canBuild(Resp_1),
canBuild(Resp_2),
canBuild(Resp_3),
xchdGet(XchdGet_1,Resp_1,Resp_2,Resp_3),
extractAttackKnowledge(XchdGet_1).
Примечания для успешного запуска:
init, соответственно: что посылает злоумышленник
respGet, XchdGet: что отправляет другая сторона после сообщения от злоумышленника
canBuild: может ли злоумышленник создать часть сообщения из своего знания (начальное знание + знание атаки)?
extractAttackKnowledge: извлекает новые знания об атаках из частей сообщения
Заранее спасибо,
Даниэль В.
P.S .: Пожалуйста, не стесняйтесь комментировать, если что-то неясно.