利用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. 安全分析結果

在這裏插入圖片描述

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