通過OTAA方式入網(wǎng)的設(shè)備,通訊時(shí)使用的KEY需要通過服務(wù)器獲得,在入網(wǎng)之間,設(shè)備無法通訊。
相關(guān)的OTAA入網(wǎng)流程已經(jīng)在上一章中講解過了,有興趣的可以去看看**LoRaWAN協(xié)議(五)__OTAA入網(wǎng)方式詳述**
這一章講解的是OTAA中的密鑰生成過程。
其中使用到的庫函數(shù)都是從semtech的官方庫中來的,官方庫代碼鏈接:LoRaMac-node。
詳解
設(shè)備在通訊時(shí),會(huì)使用的密鑰有NwkSKey 和AppSKey。
生成的公式如下:
NwkSKey = aes128_encrypt(AppKey, 0x01 | AppNonce | NetID | DevNonce | pad16)
AppSKey = aes128_encrypt(AppKey, 0x02 | AppNonce | NetID | DevNonce | pad16)
可以看到相關(guān)的參數(shù)一共有四個(gè):
1.AppNonce
2.NetID
3.DevNonce
4.pad16
其中AppNonce、NetID、pad16 是產(chǎn)生于服務(wù)器的,DevNonce產(chǎn)生于node設(shè)備本身。
還是使用LoRaWAN協(xié)議(五)這篇文章中使用的包數(shù)據(jù)來進(jìn)行分析。
這里,我們調(diào)用官方庫的接口,因?yàn)槲覀冞@里只是熟悉協(xié)議,并不是要研究Key的生成算法。
如果不明白數(shù)據(jù)協(xié)議的,可以去看LoRaWAN協(xié)議(五)這篇文章
提取DevNonce
1.GW->NS JSON包,從中提取出來DevNonce,
data為MAC層數(shù)據(jù),為join_request message,其數(shù)據(jù)包格式為
base64解碼:
x00 x01 x00 x00 x20 x00 xc5 x26
x2c x16 x10 x16 x20 x00 x77 x4a
x00 x54 x7b x40 x2d xe1 x9a
得到的數(shù)據(jù):
可以得到DevNonce的值為0x7b54
提取AppNonce、NetID、CFList
2.NS->GW JSON包,其中txpk.data為包含了MAC層數(shù)據(jù)內(nèi)容
data base64 decode:
x20 xfa x80 x29 x74 x3b x2d x2f
xc2 x99 x85 x42 x0f x2f x0a xde
x4e
根據(jù)LoRaWAN specification 可知,join_accept message的格式如下:
但是這個(gè)數(shù)據(jù)是加密的,需要使用AppKey進(jìn)行解密
所以,我們需要先使用AppKey解密join_accept message
payload為join_accept message,此處為
x20 xfa x80 x29 x74 x3b x2d x2f
xc2 x99 x85 x42 x0f x2f x0a xde
x4e
解密之后的數(shù)據(jù)存放在LoRaMacRxPayload數(shù)組中。
uint8_t LoRaMacAppKey[] = {0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C};
LoRaMacJoinDecrypt( payload + 1, size - 1, LoRaMacAppKey, LoRaMacRxPayload + 1 );
LoRaMacRxPayload[0] = payload[0];
可以得到解析之后的數(shù)組
0x20 0x43 0x75 0xcb 0x24 0x0 0x0 0x2
0x0 0x0 0x48 0x3 0x0 0x82 0xc9 0xd0
0xf9
根據(jù)協(xié)議,我們可以得到:
AppNonce:x43 x75 xcb
NetID:x24 x0 x0
DevNonce:0x7b54
pad16:沒有
至此,我們就具備生成密鑰的所有參數(shù)了
產(chǎn)生AppSKey 和 NwkSKey
最后,我們再調(diào)用
LoRaMacJoinComputeSKeys( LoRaMacAppKey, LoRaMacRxPayload + 1, LoRaMacDevNonce, LoRaMacNwkSKey, LoRaMacAppSKey );
就可以生成AppSKey和NwkSKey了。
得到的NwkSKey為
0xde 0x3 0x33 0x1a 0xeb 0x42 0x54 0xe9
0x72 0x7b 0x6f 0xaf 0xbf 0x13 0xdb 0x3d
得到的AppSKey為
0xe0 0x46 0x9e 0x44 0x9c 0x57 0x47 0x8c
0xbe 0xa7 0x25 0xda 0x84 0xf0 0x13 0x97
對比之間抓包的AS->NS的入網(wǎng)信息
AS->NS 發(fā)送入網(wǎng)信息,可以知道,生成的密碼是正確的了。
當(dāng)然最好是進(jìn)行實(shí)際負(fù)載的驗(yàn)證,我也寫了兩個(gè)小程序進(jìn)行了驗(yàn)證,證明了這兩個(gè)Key確實(shí)是正確的。
兩個(gè)小程序的鏈接:
decode_aes_base64
generate_key
至此,我所知的OTAA入網(wǎng)方面的協(xié)議就完了。
編輯:hfy
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
8873瀏覽量
84972 -
lorawan
+關(guān)注
關(guān)注
3文章
309瀏覽量
23777
發(fā)布評論請先 登錄
相關(guān)推薦
評論