浅谈Zigbee协议栈的加密算法
想在Z-stack中实现数据加密的功能,首先在 f8wConfig.cfg文件中设置-DSECURE=1、-DZG_SECURE_DYNAMIC=1外,还需要哪些操作呢?
如果两块cc2350编译时的SECURE,ZG_SECURE_DYNAMIC不相同,则不能通讯,要么大家不加密,要么都加密才能通讯。如果不加密,用TI自带的Packet Sniffer软件是可以看到APS Payload里面的内容,你通讯的数据是完全可以捕捉到的,而加密以后,看到的就是一些加密后的数据,看不出任何意义。这点必须注意哦,O(∩_∩)O哈哈~
前面我们介绍了有关于ZigBee协议栈的一些原理和结构。不知道大家是否已经掌握了。那么这里我们则重点说明一下ZigBee协议栈中的加密算法。Z-stack对ZigBee2006提供了全面的支持,功能之强大,性能稳定、安全性高,说到安全性是我们今天的主题.CC2430硬件支持128bit的AES加密算法,在ZigBee协议栈中为了避开相同设备的干扰,和防止被其他设备监听,我们就采用这个技术将数据加密来提高数据的安全性.
AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范.它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法.AES 是一个新的可以用于保护电子数据的加密算法.明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和***数据.与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和***数据.通过分组密码返回的加密数据 的位数与输入数据相同.迭代加密使用一个循环结构,在该循环中重复置换(permutations)和替换(substitutions)输入数据.
在Z-stack中采用的是128bit的加密,首先需要一个128bit的key,这个KEY不同,加密出来的内容也不同在Z-stack中是通过DEFAULT_KEY="{0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x 0F, 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0D}"这种方式来定义的.
在Z-stack中已经在ZigBee协议栈中实现了这个加密算法,如果需要使用直接开启这个服务就可以了,下面我们主要将Z-stack的加密算法的开启.
Z-stack1.4.3加密算法的功能开启方法:
1.将f8wConfig.cfg文件中设置为-DSECURE=1,这句话的意思是SECURE=1,这个变量在ZigBee协议栈中作为if语句的条件使用,条件为真的语句中就是开启加密算法的函数.所以要使用第一步是要将这个参数设置为1.
2.将ZGlobals.c中的uint8 zgPreConfigKeys = FLASE;修改为uint8 zgPreConfigKeys = TRUE.
3.准备一个key,这个可以在函数nwk_global.c中修改:
1.CONST byte defaultKey[SEC_KEY_LEN] =
2.{
3.#if defined ( APP_TP ) || defined ( APP_TP2 )
4.// Key for ZigBee Conformance Testing
5.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6.0x89, 0x67, 0x45, 0x23, 0x01, 0xEF, 0xCD, 0xAB
7.#else
8.// Key for In-House Testing
9.0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
10.0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
11.#endif
12.};
在ZigBee协议栈中,如果使用了加密算法后,网络中所有的设备都需要开启这个算法,而且各个设备中的key必须相同.否则后果是很严重的,这会导致你的网络不能正常通讯,因为没有加密的数据或者相同key加密,这些数据网络是不认识的,根本就不会传到网络层.
加密算法开启以后,如果你需要修改代码,就必须改变你的key,或者是擦除一次你的flash,否则会出现不可逾期的错误,而且没有规律.通常的做法是擦除flash一次,这样可以保证和整个网络的key相同.
采用这个加密算法的好处是:如果一个网络在做实验,你再随便加入一个协调器或者路由或者终端对现有的网络状态不会造成影响,这样就可以进行多个并行实验了.