实验要求:
ProVerif
配置
Proverif
环境
实验要求
根据实验手册,安装
proverif
环境
验证
hello.pv
文件
HandShake Protocol
实验要求
学习
proverif
手册
3.1-3.3
部分与实验手册
验证
ex_handshark.pv
文件,分析
proverif
的验证结果,说明存在的攻击手段根
据
proverif
的分析结果,尝试改进
ex_handshake
协议,解决中间人攻击
Needham-Schroeder Protocol
实验要求
学习
Needham-Schroeder
协议,了解其基本原理与协议流程
利用
proverif
,分析附件中的
Needham-Schroeder
密钥共享协议的三个变体,说
明各个协议变体存在的缺陷,尝试给出攻击方式
根据分析结果,结合
proverif
手册第五章内容,尝试解决协议存在的缺陷
(一)ProVerif
1.安装
ProVerif
组件依赖 :OCaml graphviz
下列安装过程基于
ubuntu
OCaml:
sudo apt-get install ocaml
sudo apt-get install opam
graphviz :
sudo apt install graphviz
安装ProVerif:
到官网下载源码文件:
http://proverif.inria.fr/
解压:
tar -xzf proverif2.05.tar.gz
进入相应目录,安装Proverif:
cd ./proverif2.05
./build
-help参数可查看proverif可用:
2.验证hello.pv文件:
将hello.pv文件用proverif进行分析:
./proverif ./hello.pv
(二)HandShake Protocol
握手协议验证:
(* Symmetric Enc *)
type key.
fun senc(bitstring,key) : bitstring.
reduc forall m:bitstring,k:key;sdec(senc(m,k),k) = m.
(* Asymmetric Enc Structure *)
type skey.
type pkey.
fun pk(skey): pkey.
fun aenc(bitstring,pkey): bitstring.
reduc forall m:bitstring,k:skey;adec(aenc(m,pk(k)),k) = m.
(* Digital Signatures Structure *)
type sskey.
type spkey.
fun spk(sskey): spkey.
fun sign(bitstring,sskey) :bitstring.
reduc forall m:bitstring,k:sskey;getmess(sign(m,k)) = m.
reduc forall m:bitstring,k:sskey;checksign(sign(m,k),spk(k)) = m.
(* HandShake Protocol *)
free c:channel.
free s:bitstring [private].
query attacker(s).
let clientA(pkA:pkey,skA:skey,pkB:spkey) =
out(c,pkA);
in(c,x:bitstring);
let y = adec(x,skA) in
let (=pkB,k:key) = checksign(y,pkB) in
out(c,senc(s,k)).
let serverB(pkB:spkey,skB:sskey) =
in(c,pkX:pkey);
new k:key;
out(c,aenc(sign((pkB,k),skB),pkX));
in(c,x:bitstring);
let z = sdec(x,k) in
0.
process
new skA:skey;
new skB:sskey;
let pkA = pk(skA) in out(c,pkA);
let pkB = spk(skB) in out(c,pkB);
( (!clientA(pkA,skA,pkB)) | (!serverB(pkB,skB)) )
将以上代码写入并保存为handshake.pv文件,具体操作如下:
sudo apt install vim
vim handshake
写入后进行验证: