利用AVISPA证明D2D协议

利用AVISPA证明UAKA-D2D协议

一、UAKA-D2D协议

符号说明
符号 含义
UEiUE_i/UIDiUID_i 使用者的设备ii/ii的身份码
HNiHN_i/HNIDiHNID_i UEiUE_i的本域网/UEiUE_i本域网的身份码
VNiVN_i/VNIDiVNID_i UEiUE_i的访问网/UEiUE_i访问网的身份码
KiK_i UEiUE_iHNiHN_i的共享密钥
Kv2vK_{v2v} VN1VN_1VN2VN_2的共享密钥
KDFKDF 密钥导出函数
KasmeiK^i_{asme} HNiHN_iVNiVN_i生成的漫游密钥
KD2DiK^i_{D2D} 由密钥KasmeiK^i_{asme}导出的D2DD2D函数密钥,用于生成D2DD2D会话密钥
FIDiFID_i 函数类的身份码
SIDISID_I D2DD2D会话的身份码
HINTiHINT_i UEiUE_i的会话密钥线索
macimac_i HINTiHINT_i的消息认证码
KsK_s D2DD2D会话密钥
第1阶段:系统设置

​ 初始化所有参数。

第2阶段:漫游UE注册
  1. UEi(i=1,2)UE_i(i=1,2)VNiVN_i发送注册请求。

    UEiVNi:(UIDi,HNIDi)UE_i \rightarrow VN_i:(UID_i,HNID_i)

  2. VNiVN_i收到请求后,先校验它是否与HNiHN_i存在漫游协议。若存在,则向HNiHN_i发送认证请求。

VNiUNi:(UIDi,VNIDi)VN_i \rightarrow UN_i:(UID_i,VNID_i)

  1. HNiHN_i收到请求后,先校验VNiVN_i的合法性,并判断是否与它存在漫游协议。若不存在,HNiHN_i拒绝该请求;反之,校验UEiUE_i是否为授权用户。若是,HNiHN_i生成包含漫游密钥KasmeiK^i_{asme}认证信息并发送给VNiVN_i

    HNiVNi:KasmeiHN_i \rightarrow VN_i : K^i_{asme}

    Kasmei=KDF(Ki,VNIDi,RANDi)K^i_{asme} = KDF(K_i, VNID_i, RAND_i)RANDiRAND_i是由HNiHN_i挑选的随机数。

  2. VNiVN_i使用所接受到的认证信息,使用标准EPSEPS AKAAKA认证过程与UEiUE_i进行相互认证。通过该认证过程,VNiVN_iUEiUE_i从漫游密钥KasmeiK^i_{asme}中导出了D2DD2D函数密钥KD2DiK^i_{D2D}

    VNiUEi:KD2DiVN_i \leftrightarrow UE_i : K^i_{D2D}

    KD2Di=KDF(Kasmei,FIDi,RANDi)K^i_{D2D} = KDF(K^i_{asme},FID_i,RAND_i')RANDiRAND_i'是由VNiVN_i选择的随机数,FIDiFID_iD2DD2D函数类的身份码(保证UEiUE_i在同一网络中被不同的D2DD2D函数类服务时,所得到的KD2DiK^i_{D2D}不同)。

    D2DD2D函数密钥KD2DiK^i_{D2D}将被用于生成D2DD2D会话密钥。

第3阶段:D2D查找与随机数协商

UE1UE_1UE2UE_2通过开放且独立且安全的带外信道共享秘密随机数RPR_P

第4阶段:生成D2D会话密钥
  1. 一个使用者设备(如UE1UE_1)启动会话密钥生成程序,向它的访问网VN1VN_1发送D2DD2D会话请求。

    UE1VN1:(UID1,UID2,VNID2)KD2D1UE_1\rightarrow VN_1:(UID_1,UID_2,VNID_2)_{K^1_{D2D}}

  2. VN1VN_1收到请求后,校验VN2VN_2的合法性并判断是否与其签署了用于D2DD2D服务的协同计算协议。若非,则拒绝该请求;反之,VN1VN_1生成此次D2DD2D会话的身份码SIDISID_I,选取随机数r1r_1,向VN2VN_2发送密钥协商请求。

    VN1VN2:(UID1,UID2,r1,SIDI)Kv2vVN_1 \rightarrow VN_2: (UID_1,UID_2,r_1,SID_I)_{K_{v2v}}

  3. VN2VN_2收到请求后,先校验VN1VN_1的合法性并判断是否与其签署了用于D2DD2D服务的协同计算协议。若非,则拒绝该请求;反之,VN2VN_2选取另一个随机数r2r_2,将其与UID1UID_1UID2UID_2一起发送给VN1VN_1
    VN2VN1:(UID1,UID2,r2)Kv2vVN_2 \rightarrow VN_1: (UID_1,UID_2,r_2)_{K_{v2v}}

  4. 完成随机数交换后,VN1VN_1VN2VN_2生成预共享密钥$R_K=r_1\oplus r_2 并向UE_1UE_2发送D2D$会话确认信息。

    VN1UE1:(UID2,RK,SIDI)KD2D1VN_1\rightarrow UE_1 : (UID_2,R_K,SID_I)_{K^1_{D2D}}

    VN2UE2:(UID1,RK,SIDI)KD2D2VN_2\rightarrow UE_2 : (UID_1,R_K,SID_I)_{K^2_{D2D}}

  5. UE1UE_1UE2UE_2收到信息后,提取其中的用户身份码,校验其是否与D2DD2D查找步骤中的身份信息相同。若两身份信息相匹配,UE1UE_1UE2UE_2调用DHDH密钥交换协议来生成D2DD2D会话密钥。

    首先,UE1UE_1UE2UE_2各自选择随机数aabb来生成他们的会话密钥线索,并利用共享密钥KMK_M计算HINT1HINT_1HINT2HINT_2的消息认证码mac1mac_1mac2mac_2

    UE1:HINT1=ga, mac1=HMACKM(HINT1,T1)UE_1:HINT_1 = g^a ,\ mac_1 = HMAC_{K_M}(HINT_1,T_1)

    UE2:HINT2=gb, mac2=HMACKM(HINT2,T2)UE_2:HINT_2 = g^b,\ mac_2 = HMAC_{K_M}(HINT_2,T_2)

    KM=RPRKK_M=R_P\oplus R_KT1T_1T2T_2分别是UE1UE_1UE2UE_2本地时钟的时间戳。

    然后,UE1UE_1UE2UE_2交换它们的线索、消息认证码和时间戳。

    UE1UE2:(HINT1,mac1,T1)UE_1\rightarrow UE_2: (HINT_1,mac_1,T_1)

    UE2UE1:(HINT2,mac2,T2)UE_2\rightarrow UE_1: (HINT_2,mac_2,T_2)

  6. 收到线索后,UE1UE_1UE2UE_2分别校验时间戳的新鲜性并通过计算它们所收到线索的消息认证码来校验它们所收到的消息是否正确。若双方均校验通过,则双方各自生成D2DD2D会话密钥KsK_s,并使用KsK_s来保护他们之间的通信。

    Ks=HINT1b=HINT2aK_s = {HINT_1}^b = {HINT_2}^a

在这里插入图片描述

二、利用AVISPA证明UAKA-D2D协议

  1. 创建角色
%%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
  1. 完成角色创建后,生成会话
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
  1. 完成会话创建后,创建环境
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
  1. 完成环境创建后,设置安全分析目标
%%goal
goal

secrecy_of secks1, secks2
authentication_on aut

end goal
  1. 执行代码
environment()
  1. 协议执行过程模拟

(1)协议流程模拟

在这里插入图片描述

(2)攻击者攻击过程

在这里插入图片描述

  1. 安全分析结果

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章