LoRaWAN协议(六)–OTAA KEY生成过程

前言

通过OTAA方式入网的设备,通讯时使用的KEY需要通过服务器获得,在入网之间,设备无法通讯。

相关的OTAA入网流程已经在上一章中讲解过了,有兴趣的可以去看看**LoRaWAN协议(五)__OTAA入网方式详述**

这一章讲解的是OTAA中的密钥生成过程。

其中使用到的库函数都是从semtech的官方库中来的,官方库代码链接:LoRaMac-node

详解

设备在通讯时,会使用的密钥有NwkSKey 和AppSKey。

生成的公式如下:

  • NwkSKey = aes128_encrypt(AppKey, 0x01 | AppNonce | NetID | DevNonce | pad16)
  • AppSKey = aes128_encrypt(AppKey, 0x02 | AppNonce | NetID | DevNonce | pad16)

可以看到相关的参数一共有四个:
1.AppNonce
2.NetID
3.DevNonce
4.pad16

其中AppNonce、NetID、pad16 是产生于服务器的,DevNonce产生于node设备本身。

还是使用LoRaWAN协议(五)这篇文章中使用的包数据来进行分析。

这里,我们调用官方库的接口,因为我们这里只是熟悉协议,并不是要研究Key的生成算法。

如果不明白数据协议的,可以去看LoRaWAN协议(五)这篇文章

提取DevNonce

1.GW->NS JSON包,从中提取出来DevNonce,

{
    "rxpk": [
        {
            "tmst": 532505620,
            "chan": 6,
            "rfch": 0,
            "freq": 471.9,
            "stat": 1,
            "modu": "LORA",
            "datr": "SF12BW125",
            "codr": "4/5",
            "lsnr": -17,
            "rssi": -81,
            "size": 23,
            "data": "AAEAACAAxSYsFhAWIAB3SgBUe0At4Zo="
        }
    ]
}

data为MAC层数据,为join_request message,其数据包格式为

MHDR APPEUI DevEUI DevNonce MIC
1字节 8字节 8字节 2字节 4字节

base64解码:

\x00 \x01 \x00 \x00 \x20 \x00 \xc5 \x26
\x2c \x16 \x10 \x16 \x20 \x00 \x77 \x4a
\x00 \x54 \x7b \x40 \x2d \xe1 \x9a

得到的数据:

字段 内容
MHDR \x00
AppEUI \x01 \x00 \x00 \x20 \x00 \xc5 \x26 \x2c
DevEUI \x16 \x10 \x16 \x20 \x00 \x77 \x4a \x00
DevNonce \x54 \x7b
MIC \x40 \x2d \xe1 \x9a

可以得到DevNonce的值为0x7b54

提取AppNonce、NetID、CFList

2.NS->GW JSON包,其中txpk.data为包含了MAC层数据内容

{
    "txpk": {
        "tmst": 537505620,
        "freq": 471.9,
        "rfch": 0,
        "powe": 14,
        "modu": "LORA",
        "datr": "SF12BW125",
        "codr": "4/5",
        "ipol": true,
        "size": 17,
        "data": "IPqAKXQ7LS/CmYVCDy8K3k4"
    }
}

data base64 decode:

\x20 \xfa \x80 \x29 \x74 \x3b \x2d \x2f
\xc2 \x99 \x85 \x42 \x0f \x2f \x0a \xde
\x4e

根据LoRaWAN specification 可知,join_accept message的格式如下:

MHDR AppNonce NetID DevAddr DLSettings RxDelay CFList(pad16) MIC
1字节 3字节 3字节 4字节 4字节 1字节 0/16字节 4字节

但是这个数据是加密的,需要使用AppKey进行解密

所以,我们需要先使用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

解密之后的数据存放在LoRaMacRxPayload数组中

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];

可以得到解析之后的数组

0x20 0x43 0x75 0xcb 0x24 0x0 0x0 0x2
0x0 0x0 0x48 0x3 0x0 0x82 0xc9 0xd0
0xf9
字段 解密前 解密后
MHDR \x20 \x20
AppNonce \xfa \x80 \x29 \x43 \x75 \xcb
NetID \x74 \x3b \x2d \x24 \x0 \x0
DevAddr \x2f \xc2 \x99 \x85 \x2 \x0 \x0 \x48
DLSettings \x42 \x3
RxDelay \x0f \x0
CFList(pad16)
MIC \x2f \x0a \xde \x4e \x82 \xc9 \xd0 \xf9

根据协议,我们可以得到:

AppNonce:\x43 \x75 \xcb
NetID:\x24 \x0 \x0
DevNonce:0x7b54
pad16:没有

至此,我们就具备生成密钥的所有参数了

产生AppSKey 和 NwkSKey

最后,我们再调用 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的入网信息

AS->NS 发送入网信息,可以知道,生成的密码是正确的了。

{
    "join": {
        "moteeui": "4a770020161016",
        "complete": {
            "frame": "IPqAKXQ7LS/CmYVCDy8K3k4",
            "networkkey": "de03331aeb4254e9727b6fafbf13db3d"
        }
    }
}

当然最好是进行实际负载的验证,我也写了两个小程序进行了验证,证明了这两个Key确实是正确的。

两个小程序的链接:

至此,我所知的OTAA入网方面的协议就完了。

如果本文有什么错误,或者对LoRaWAN有什么不理解的,欢迎联系我,邮箱(454626653@qq.com),在左边也有链接,谢谢大家。

说明:LoRa应用学习站通过公开互联网收集、整理并转载有关LoRa及物联网应用解决方案,以供广大LoRa应用开发者和爱好者共同学习交流和参考运用到实际生产生活中。本站所有转载的文章、图片、音频、视频等资料的版权归版权所有人所有并衷心感谢您的付出,由于本站采用的非本站原创文章及图片等内容无法一一联系确认版权者,如果本网所选内容的文章原创作者认为其作品不宜放在本站,请及时通过以下留言功能通知我们采取适当措施,避免给双方造成不必要的经济损失。如果您希望保留本文在LoRa学习站,但希望文章末尾提供对作者的致谢或者产品、网站交换链接的,也请将需求写入以下留言栏中,谢谢您的支持。让我们共同努力,打造万物互联的未来美好生活!

您的留言或需求: