利用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)攻擊者攻擊過程
- 安全分析結果