利用AVISPA证明UAKA-D2D协议
一、UAKA-D2D协议
符号说明
符号 | 含义 |
---|---|
/ | 使用者的设备/的身份码 |
/ | 的本域网/本域网的身份码 |
/ | 的访问网/访问网的身份码 |
与的共享密钥 | |
与的共享密钥 | |
密钥导出函数 | |
由为生成的漫游密钥 | |
由密钥导出的函数密钥,用于生成会话密钥 | |
函数类的身份码 | |
会话的身份码 | |
的会话密钥线索 | |
的消息认证码 | |
会话密钥 |
第1阶段:系统设置
初始化所有参数。
第2阶段:漫游UE注册
-
向发送注册请求。
-
收到请求后,先校验它是否与存在漫游协议。若存在,则向发送认证请求。
-
收到请求后,先校验的合法性,并判断是否与它存在漫游协议。若不存在,拒绝该请求;反之,校验是否为授权用户。若是,生成包含漫游密钥的认证信息并发送给。
,是由挑选的随机数。
-
使用所接受到的认证信息,使用标准 认证过程与进行相互认证。通过该认证过程,和从漫游密钥中导出了函数密钥。
,是由选择的随机数,是函数类的身份码(保证在同一网络中被不同的函数类服务时,所得到的不同)。
函数密钥将被用于生成会话密钥。
第3阶段:D2D查找与随机数协商
和通过开放且独立且安全的带外信道共享秘密随机数。
第4阶段:生成D2D会话密钥
-
一个使用者设备(如)启动会话密钥生成程序,向它的访问网发送会话请求。
-
收到请求后,校验的合法性并判断是否与其签署了用于服务的协同计算协议。若非,则拒绝该请求;反之,生成此次会话的身份码,选取随机数,向发送密钥协商请求。
-
收到请求后,先校验的合法性并判断是否与其签署了用于服务的协同计算协议。若非,则拒绝该请求;反之,选取另一个随机数,将其与、一起发送给。
-
完成随机数交换后,和生成预共享密钥$R_K=r_1\oplus r_2 UE_1UE_2D2D$会话确认信息。
-
和收到信息后,提取其中的用户身份码,校验其是否与查找步骤中的身份信息相同。若两身份信息相匹配,和调用密钥交换协议来生成会话密钥。
首先,和各自选择随机数和来生成他们的会话密钥线索,并利用共享密钥计算和的消息认证码和。
,和分别是和本地时钟的时间戳。
然后,和交换它们的线索、消息认证码和时间戳。
-
收到线索后,和分别校验时间戳的新鲜性并通过计算它们所收到线索的消息认证码来校验它们所收到的消息是否正确。若双方均校验通过,则双方各自生成会话密钥,并使用来保护他们之间的通信。
二、利用AVISPA证明UAKA-D2D协议
- 创建角色
%%UE1
role role_UE_init(UE1,UE2,VN1,VN2: agent,
K1D2D: symmetric_key,
H: hash_func,
G,RP: text,
Snd,Rcv: channel(dy))
played_by UE1 def=
local State:nat,
Ra,T1,T2,RK,KM,SIDI:text,
HINT1,HINT2,Mac1,Mac2,Ks:message
const secks1,secks2,aut:protocol_id
init State:=0
transition
% Beginning.If UE1 recieves 'start' signal,then UE1 send (UE1,UE2,VN2) to VN1.
1. State=0 /\ Rcv(start) =|> State':=1 /\ Snd({UE1.UE2.VN2}_K1D2D)
% 5. If UE1 receives (UE2,RK,SIDI), UE1 computes HINT1,mac1 and generates T1, then sends them to UE2.
2. State=1 /\ Rcv({UE2.RK'.SIDI'}_K1D2D) =|> Ra':=new() /\ HINT1':= exp(G,Ra') /\ T1':=new() /\ KM':= xor(RK',RP) /\ Mac1':={H(HINT1'.T1')}_KM' /\ Snd(HINT1'.Mac1'.T1') /\ witness(UE1,UE2,aut,KM') /\ State':= 2
3. State=2 /\ Rcv(HINT2'.Mac2'.T2') =|> Ks':=exp(HINT2',Ra) /\ secret(Ks',secks1,{UE1,UE2}) /\ request(UE1,UE2,aut,KM) /\ State':=3
end role
%%UE2
role role_UE_resp(UE1,UE2,VN1,VN2: agent,
K2D2D: symmetric_key,
H: hash_func,
G,RP: text,
Snd,Rcv: channel(dy))
played_by UE2 def=
local State:nat,
Rb,T1,T2,RK,KM,SIDI:text,
HINT1,HINT2,Mac1,Mac2,Ks:message
const secks1,secks2,aut:protocol_id
init State:=0
transition
% 5. If UE2 receives (UE1,RK,SIDI), UE2 computes HINT2,mac2 and generates T2, then sends them to UE1.
2. State=0 /\ Rcv({UE1.RK'.SIDI'}_K2D2D) =|> Rb':= new() /\ HINT2':= exp(G,Rb') /\ T2':=new() /\ KM':= xor(RK',RP) /\ Mac2':= {H(HINT2'.T2')}_KM' /\ Snd(HINT2'.Mac2'.T2') /\ State':= 1
3. State=1 /\ Rcv(HINT1'.Mac1'.T1') =|> Ks':=exp(HINT1',Rb) /\ secret(Ks',secks2,{UE1,UE2}) /\ request(UE2,UE1,aut,KM) /\ State':=2
end role
%%VN1
role role_VN_init(UE1,UE2,VN1,VN2: agent,
K1D2D,Kv2v: symmetric_key,
SIDI: text,
Snd,Rcv: channel(dy))
played_by VN1 def=
local State: nat,
R1,R2,RK: text
init State:=0
transition
%2. If VN1 recieves (UE1,UE2,VN2) from UE1,then VN1 send (UE1,UE2,r1,SIDI) to VN2
1. State=0 /\ Rcv({UE1.UE2.VN2}_K1D2D) =|> R1':=new() /\ Snd({UE1.UE2.R1'.SIDI}_Kv2v) /\ State':=1
%4. After exchanging randoms with VN2,VN1 send confirmation message (UE2,RK,SIDI) to UE1
2. State=1 /\ Rcv({UE1.UE2.R2'}_Kv2v) =|> RK':=xor(R1,R2') /\ Snd({UE2.RK'.SIDI}_K1D2D) /\ State':=2
end role
%%VN2
role role_VN_resp(UE1,UE2,VN1,VN2: agent,
K2D2D,Kv2v: symmetric_key,
SIDI: text,
Snd,Rcv: channel(dy))
played_by VN2 def=
local State: nat,
R1,R2,RK: text
init State:=0
transition
%3. If VN2 recieves (UE1.UE2.r1,SIDI) from VN1,then VN2 send (UE1,UE2,r2) to VN1
1. State=0 /\ Rcv({UE1.UE2.R1'.SIDI'}_Kv2v) =|> R2':=new() /\ Snd({UE1.UE2.R2'}_Kv2v)
%4. After exchanging randoms with VN1,VN2 send confirmation message (UE1,RK,SIDI) to UE2
/\ RK':=xor(R1',R2') /\ Snd({UE1.RK'.SIDI}_K2D2D) /\ State':=1
end role
- 完成角色创建后,生成会话
role session(UE1,UE2,VN1,VN2 : agent,
K1D2D, K2D2D, Kv2v : symmetric_key)
def=
local SUE1,RUE1,SUE2,RUE2,SVN1,RVN1,SVN2,RVN2: channel (dy),
G,RP,SIDI:text,
H: hash_func
composition
role_UE_init(UE1, UE2, VN1, VN2, K1D2D, H, G, RP, SUE1, RUE1)
/\ role_UE_resp(UE1, UE2, VN1, VN2, K2D2D, H, G, RP, SUE2, RUE2)
/\ role_VN_init(UE1, UE2, VN1, VN2, K1D2D, Kv2v, SIDI, SVN1, RVN1)
/\ role_VN_resp(UE1, UE2, VN1, VN2, K2D2D, Kv2v, SIDI, SVN2, RVN2)
end role
- 完成会话创建后,创建环境
role environment()
def=
const secks1,secks2,aut: protocol_id,
ue1,ue2,vn1,vn2 : agent,
k1D2D, k2D2D,kv2v: symmetric_key
intruder_knowledge = {ue1, ue2, vn1, vn2}
composition
session(ue1, ue2, vn1, vn2, k1D2D, k2D2D, kv2v)
end role
- 完成环境创建后,设置安全分析目标
%%goal
goal
secrecy_of secks1, secks2
authentication_on aut
end goal
- 执行代码
environment()
- 协议执行过程模拟
(1)协议流程模拟
(2)攻击者攻击过程
- 安全分析结果