Proverif的输出结果
Attack Derivation:解释攻击者为了破坏性质必须采取的行动。
Attack Trace:能够在输入文件所给出的进程中执行的trace
。
输出的三种结果:
- true:结果被证实了,攻击没有发生,不会输出[Attack derivation]和 [Attack trace]。
- false:性质被证伪了,输出[Attack derivation]和 [Attack trace],主要关注 [Attack trace]。
- cannot be proved:性质证明不了,观察它的攻击源[Attack derivation]有时可以手动构建一个攻击
trace
。
握手协议输出实例
可以分为三部分:
- 从
Abbreviations
:到A more detailed...
描述了导致这个攻击的推导过程。 - 从
A more detailed...
到A trace has been found.
描述了攻击trace
。 - 最后的
RESULT
行给出了验证结果。
*
:attacker (M)
指在攻击者的知识里是持有M
的
abbreviateDerivation=false
:禁止使用缩写名称。
explainDerivation=false
:显示内部表示的Horn子句,而不是去显示进程的信息。
traceDisplay=long
:获得进程的状态等详细信息。
绘制攻击trace图
proverif -graph C:\proverif2.02pl1\graph session3.pv
格式:proverif -graph 存储pdf的路径 xxx.pv
分析上图的trace
。
诚实进程创建两个私钥,将生成的私钥发送给攻击者,~M = pk(skA_2)
,~M_1 = spk(skB_2)
。
获得两个进程,clientA
和serverB
。
clientA将自己的公钥发送到公共信道上,~M_2 = pk(skA_2)
,攻击者收到后存放在M_2
中。
然后攻击者将自己的公钥发送给serverB
。
serverB
生成会话密钥k_2
,执行事件{20}event acceptsServer(k_2,pk(a_1))
。
serverB
发送aenc(sign((spk(skB_2),k_2),skB_2),pk(a_1))
到公共信道上,攻击者存放在~M_3
中。
攻击者执行adec(~M_3,a_1)
,获得sign((spk(skB_2),k_2),skB_2)
,利用spk(skB_2)
可以获得(spk(skB_2),k_2)
。
攻击者发送aenc(adec(~M_3,a_1),~M) =aenc(sign((spk(skB_2),k_2),skB_2),pk(skA_2))
给clientA
。
clientA
执行事件{13}event acceptsClient(k_2)
。
clientA
通过公共信道发送senc(s,k_2)
,攻击者存放到~M_4
中。
clientA
执行事件{15}event termClient(k_2,pk(skA_2))
。
注意:Query event(termClient(x_2,y_1)) ==> event(acceptsServer(x_2,y_1)) is false.
因为对比事件{15}event termClient(k_2,pk(skA_2))
而言,事件{20}event acceptsServer(k_2,pk(a_1))
的第二个参数不同,pk(skA_2)≠pk(a_1)
,一个是clientA
的公钥,一个是攻击者的。