Commit 4b10dc715af36157e8326162b7c492809dca31a6
1 parent
45e2d76b
V 0.0.5
1、通讯协议-教育新版-表决器部分 添加第八章 AES加密
Showing
4 changed files
with
94 additions
and
3 deletions
img/AES_multiplepack.png
0 → 100644
346 KB
img/AES_singlepack.png
0 → 100644
63.5 KB
img/AES_timecode.png
0 → 100644
15.9 KB
通讯协议-教育新版-表决器部分.md
... | ... | @@ -3003,15 +3003,106 @@ BIN/GDB   表示改型号下 不同的MCU 类型 BIN文件识别符 |
3003 | 3003 | |
3004 | 3004 | ## 7.2 键盘入网申请 |
3005 | 3005 | |
3006 | - 组网确认使用(0x18/0x19) 确认方式如下: | |
3006 | +  组网确认使用(0x18/0x19) 确认方式如下: | |
3007 | 3007 | |
3008 | 3008 | | **字节** | **标识符** | **描述** | |
3009 | 3009 | | --- | --- | --- | |
3010 | 3010 | | 4-7 | SN1 | 第一个SN号,高位在前<br>全00为空 | |
3011 | 3011 | | 8 | SN1-CMD | 对第一个SN号键盘的确认状态<br>键盘据此命令做不同的提示或操作<br>01 数据提交正确(或自由登陆OK)<br>02 数据格式不对,数据提交无效(或自由登陆失败,密码不对)<br>03 不在投票状态,数据提交无效<br>04 没有投票权限,数据提交无效(包括不在白名单)<br><font color="#dd0000">10 失败 11 成功在主频点 12入网ok,但换频点2 13换频点3 14换频点4 19系统容量满 20没在白名单<br>51 - 151 组网成功分配的组呼编号</font><br>0xFn 表示有n个未阅读短信? | |
3012 | 3012 | |
3013 | -# 八、版本历史 | |
3014 | - | |
3013 | +# 八、加密 | |
3014 | +##8.1 加密层 | |
3015 | +###8.1.1 加密方法 | |
3016 | +  采用AES256加密,每32字节独立加密一次,适配无线硬件底层32字节收发。 | |
3017 | +32字节加密尽量前后相关,也就是有1个字节变化,密文内容都变化。待算法选定和验证,同时加解密时间要求小于500us。 | |
3018 | +###8.1.2 密钥 | |
3019 | +  平常收发双方都用LinkKey(32字节)加密,LinkKey错误,解密数据错误。 | |
3020 | +  所以双方有个约定LinkKey(私钥)的过程,LinkKey也不可能明文传输,一般是通过PublicKey(公钥)进行加密。PublicKey是产品设计时候就约定好的,两边一样。 | |
3021 | +  私钥的传输,根据我们的系统,设计为仅配对的时候交换。配对时间比较短,同时管理上要求安全环境,公钥被获取、私钥被获取的概率降低。同时正常投票时候,没有私钥的传输过程,降低破解概率。 | |
3022 | +  对接收方,由于有两个Key,一种方案是先LinkKey解密后判断是否正确,不正确后用PublicKey解密,但必须都和通讯协议相关才能知道是否秘钥对。第2种方案是约定特殊状态,特殊状态下才用PublicKey解密,例如配对模式、离线后在广播频点等。我们采用第2种方式。 | |
3023 | +  秘钥的生成方法,根据随机数、硬件序列号等相关生成,具体看最后代码。 | |
3024 | +  秘钥包括公钥,在硬件上不能明文储存,避免破解。 | |
3025 | +###8.1.3 配对设计 | |
3026 | +  平常基站在广播频点,用公钥加密,广播原来的连接信息。键盘在广播频点接收,自动换公钥解密,所以所有基站的连接信息都能获取,所以键盘能按老体系跑起来。 | |
3027 | +  基站进入配对后,在广播频点发连接信息,外还发送特殊的私钥传输信息。 | |
3028 | +  键盘手动操作进入都配对状态后,在广播频点监听连接,获取ATC码和频点、私钥后,然后切换到主频点,提交配对信息并收到确认,配对成功。如果是有组网过程的,先入网,再提交配对信息。 | |
3029 | +###8.1.4 免配对 | |
3030 | +  工厂测试需要免配对,客户应用中快速更新秘钥,也需要免配对过程。 | |
3031 | +基站进入免配对状态后,LinkKey暂时采用PublicKey,同时广播频点的连接信息,标注自己是免配对的。ATC码也改成免配对ATC码。 | |
3032 | +  键盘离线后,在广播频点用PublicKey监听,(可以加1秒收不到原先基站的连接信息后),听到基站连接信息并且是免配对的,也进入免配对模式,临时改用新的ATC码,LinkKey用PublicKey。 | |
3033 | +###8.1.5 白名单 | |
3034 | +  白名单键盘和基站,都在广播频点用PublicKey加密通讯。键盘提出申请后,如果有合适基站,基站发应答,应答里面要包含现在通讯的LinkKey、ATC码、频点。 | |
3035 | +##8.2 传输层设计 | |
3036 | +###8.2.1 防非法拷贝指令 | |
3037 | +  如果黑客用设备,在空中拷贝了一条指令,虽然是加密的密文,但如果黑客重发这条指令,基站和键盘端用LinkKey解密后,指令是正确的,就会错误执行。 | |
3038 | +  一般用指令中添加带时间特性的滚动码解决这个问题。接收到指令后,先判断滚动码是否合理,不合理,认为是非法指令。 | |
3039 | +  我们采用简单的2字节滚动码方案,首先,要求键盘提交的信息,滚动码和基站的滚动码相同(或在一定的范围,根据实际调试数据决定),基站才认为键盘提交信息是ok的。同时,基站发送的滚动码,是按一定时间依次递增的,这样,超过一定时间的滚动码,键盘不认,解决黑客重发一条指令的问题。 | |
3040 | +  这个滚动码暂时定义为TimeCode,暂时0-32767之间变化,高位1做备用。基站变化间隔暂定每次发包都递增1。 | |
3041 | +###8.2.2 单包 | |
3042 | +  添加TimeCode后,就占用了平常无线包32字节的空间,所以要考量原有协议体系,单包、多包怎么适配,包括多包上传、多包透传下载。 | |
3043 | +  原有协议,是4字节ATC码,加28字节的协议指令,而且28字节基本都有用全,如果少2字节,改动比较麻烦。 | |
3044 | +  解决方案是只用2字节的ATC码。因为加密体系,还有32字节的秘钥,这个秘钥就相当于ATC码了。 | |
3045 | +  这样,原先的单包上传、单包下载类的指令,都不需要改动。也就是加密体系的单包格式是: | |
3046 | +TimeCode(2B)+ATC(2B)+指令(28字节)=32字节。 | |
3047 | +相当于: | |
3048 | + | |
3049 | +###8.2.3 多包 | |
3050 | +  多包,就是超过30字节后怎么传输,主要适配原先的多包透传下载、S6的快速设置。 | |
3051 | +方案1:【暂采用方案1】 | |
3052 | +  传输层对超过30字节的数据,自动分割成多个30字节片段,连续发送。例如,32字节,就分成2包发送,每包前面都是2字节的TimeCode。 | |
3053 | +但第1包里面有连续多包标志和信息,一般还带长度、CRC值,便于接收端判断是否接收完整和正确。 | |
3054 | +  缺点,第1包后每包传输少了2字节。 | |
3055 | +  优点,对接收端,每次都拼接30字节即可,里面具体格式可以变动,比较灵活。 | |
3056 | +方案2: | |
3057 | +  第1包是有特定格式的,携带后面包数,第1包后面都是32字节,不带TimeCode和ATC。 | |
3058 | +  优点,某些情况下比方案1少传输1包,应用层不需了解多包是怎么实现的,例如对应用层而言,接收到的多包数据都是经过crc效验了的正确数据。 | |
3059 | +  缺点,传输层编码和解码复杂一点,还有一些约定的限制,例如一次不超过1024字节,应用层发送需要指定包号。同时协议确定了就不能改了,扩充性不如方案1。 | |
3060 | +##8.3 具体协议指令的变动 | |
3061 | +###8.3.1 单包 | |
3062 | + | |
3063 | +###8.3.2 透传多包 | |
3064 | + | |
3065 | +###8.3.3 快速设置 | |
3066 | +  接收程序,判断新的一包HEAD里面的CMD是0x37的时候,也做后继多包拼接。 | |
3067 | +###8.3.4 LinkKey信息包 | |
3068 | +CMD=0x52,基站端2个包连续发送。 | |
3069 | +第1包 | |
3070 | +| **字节** | **标识符** | **描述** | | |
3071 | +| --- | --- | --- | | |
3072 | +| 1-2 | Time | TimeCode | | |
3073 | +| 3-4 | ATC | 配对码,2Byte | | |
3074 | +| 5 | CMD | 0x52 基站连接信息(基站配对码已经在前面)| | |
3075 | +| 6 | AESMODE | 加密模式,暂1| | |
3076 | +| 5-36 | LINKKEY | 32字节的LinkKey值| | |
3077 | +| 37-38 | AESMODE | LinkKey的CRC16值| | |
3078 | +第2包 | |
3079 | +| **字节** | **标识符** | **描述** | | |
3080 | +| --- | --- | --- | | |
3081 | +| 1-2 | Time | TimeCode | | |
3082 | +| 3-4 | ATC | 配对码,2Byte | | |
3083 | +| 3 | CMD | 0x52 基站连接信息(基站配对码已经在前面)| | |
3084 | +| 4 | AESMODE | 加密模式,暂1| | |
3085 | +| 5-36 | LINKKEY | 32字节的LinkKey值| | |
3086 | +| 37-38 | AESMODE | LinkKey的CRC16值| | |
3087 | +###8.3.5 基站连接信息 | |
3088 | +单包格式,信息如下: | |
3089 | +指令格式: | |
3090 | +| **字节** | **标识符** | **描述** | | |
3091 | +| --- | --- | --- | | |
3092 | +| 1-2 | Time | TimeCode | | |
3093 | +| 3-4 | ATC | 配对码2Byte | | |
3094 | +| 5 | CMD | 0x51 基站连接信息(基站配对码已经在前面) | | |
3095 | +| 6 | NET_SEQ | 组网序号,如果变化,键盘重新入网 | | |
3096 | +| 7 | NETMODE | 基站组网模式,1配对 2白名单 3免配对(加) | | |
3097 | +| 8-11 | FREQ1-FREQ4 | 主频点,副频点2,副频点3,副频点4,<br>0的话不启用 | | |
3098 | +| 12 | HOP | 0没跳频,1-4表示当前模块跳频频点编号,1表示在主频点 | | |
3099 | +| 13 | ST-bit | 位控制(直接位域控制)<br>1:基站信息公开位<br> 0表示可公开,键盘能扫描到基站信息并显示<br> 1不公开,键盘不显示,但已配对的键盘可正常连接。<br>2:配对模式中,1表示当前基站处于配对模式下可供键盘配对。0无<br>3:白名单模式,1表示当前基站处于白名单模式。0:无<br>4:Plus模式->1: 基站周期组呼点名心跳/键盘上线时发送入网包 暂不使用<br> 0:基站不发点名心跳/键盘上线时不发送入网包(键盘竞争方式)<br>5:名单锁定:键盘只在Plus模式下生效<br> 1:开启名单锁定(键盘自控无法配对,无法登录,基站名单只能有上层接口与刷卡接口添加)<br> 0:关闭名单锁定(键盘可配对,可登录,基站自动加入到名单中,基站不踢人) | | |
3100 | +| 14-15 | psw | 密码(0表示没密码) | | |
3101 | +| 16-17 | 2 Byte | 预留 | | |
3102 | +| 18-30 | Name 12字节 | 基站名称(6个汉字) | | |
3103 | +| 31-32 | CRC | | | |
3104 | +# 九、版本历史 | |
3105 | +multiple | |
3015 | 3106 | V0.5新体系基本框架。 |
3016 | 3107 | |
3017 | 3108 | V0.6增加发信息信标(基站控制的广播信息,用于快速传递信息,2.4节),但综合考虑,多题答案下载,还是先用老体系的多包下载流程,由SDK完成,见6.4.2节。 | ... | ... |