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字节 | 1字节 | 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),在左边也有链接,谢谢大家。
**
LoRaWAN协议(六)--OTAA KEY生成过程的更多相关文章
- LoRaWAN协议(五)--OTAA入网方式详述
前言 OTAA(Over-The-Air Activation),是LoRaWAN的一种空中入网方式.当node在上电的时候处于非入网状态时,需要先入网才能和服务器进行通信.其操作就是node发送jo ...
- LoRaWAN协议(四)--入网方式概述
前言 在LoRaWAN中,node最终和服务器能够正常数据交互,需要先入网,入网的本质,也就是获得一些通信相关的参数,有以下几个: NwkSKey AppSKey DevAddr DevEui 其中 ...
- LoRaWAN协议(三)--Server端数据协议
LoRaWAN Server 端架构 LoRaWAN 的server包括 NS(Network server).AS(application server).CS(Custom server).... ...
- HTTP协议 (六) 状态码详解
HTTP协议 (六) 状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果 ...
- {MySQL完整性约束}一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业
MySQL完整性约束 阅读目录 一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业 一 ...
- LoRaWAN协议(一)------架构解析
摘自:http://www.cnblogs.com/answerinthewind/p/6200497.html LoRaWAN协议(一)-----架构解析 (1)LoRaWAN分层 LoRaWAN总 ...
- LoRaWAN协议(二)--LoRaWAN MAC数据包格式
名词解析 上行:终端的数据发送经过一个或多个网关中转到达网络服务器. 下行:由网络服务器发送给终端设备,每条消息对应的终端设备是唯一确定的,而且只通过一个网关中转. LoRaWAN Classes L ...
- LoRaWAN协议(一)--架构解析
LoRaWAN 分层 总体架构一共分为4部分: LoRaWAN从底层到最后用户拿到数据的通讯过程通讯大致可分为三段: MOTE <---> GW (MAC层) GW <---> ...
- LoRaWAN协议(七)--完整数据流程
以下的GW指Gateway 所用指令: root@lora-iot-sk:~# tcpdump -i lo -nn -x 'length>100' 入网流程 GW -> NS join_r ...
随机推荐
- 【转】使用Fiddler进行HTTP断点调试。
这是Fiddler又一强大和实用的工具之一.通过设置断点,Fiddler可以做到: 1. 修改HTTP请求头信息.例如修改请求头的UA, Cookie, Referer 信息,通过“伪造”相应信息达到 ...
- Linq to Sql 聚合查询
//输出体重最大的同学,并要求最大体重得大于39,并按照体重大下,对分组结果进行排序. var result = from query in linq.Student group query by q ...
- 5.webService拦截器
CXF为什么要设计拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. 拦截器分类 1.按所处的位置分:服务器端拦截器,客户端拦截器 2.按消息的方向分:入 ...
- WIN8 平台应用隐私声明
隐私权声明 本应用连接网络仅为控制硬件设备,不会收集你的个人信息,也不共享你个个人信息. 应用名称 雅典娜监控平台移动客户端 关于本应用 本应仅为控制设备应用,不关注任何配置相关信息,所有数据均来自服 ...
- 解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译)
解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译) http://improve.dk/orcamdf-rawdatabase-a-swiss-a ...
- Dynamic CRM 2013学习笔记 系列汇总
这里列出所有 Dynamic CRM 2013学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址: Dynamic CRM 2013学习笔记 系列汇总 ...
- asp.net identity 2.2.0 在MVC下的角色启用和基本使用(一)
基本环境:asp.net 4.5.2 第一步:在App_Start文件夹中的IdentityConfig.cs中添加角色控制器. 在namespace xxx内(即最后一个“}”前面)添加 角色控制类 ...
- bootstrap-datetimepicker.js 设置开始时间的Bug。
原地址:http://www.malot.fr/bootstrap-datetimepicker 修改的地方有三处: 1. var months = this.setTitle('.datetimep ...
- 那些年使用Hive踩过的坑
1.概述 这个标题也是用血的教训换来的,希望对刚进入hive圈的童鞋和正在hive圈爬坑的童鞋有所帮助.打算分以下几个部分去描述: Hive的结构 Hive的基本操作 Hive Select Hive ...
- 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq
5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...