logo资料库

nrf51822使用AES加密通信数据.pdf

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
使用 AES 加密通信数据 小潘 921537102 本文档为个人学习总结 只作为学习交流用途 欢迎大神指导纠正错误
数据安全问题一直是人们一直关注的问题,要保证产品安全往往是比较困难的。本篇文 章主要介绍一下在 BLE 通信的过程中数据的安全。 这里我们先试验一下蓝牙的通信,如图广播的是我们的 BLE 设备,然后我使用 APP 与 设备进行连接并通信。 向设备的写特征值写入 0x01020304 如图: 有很多朋友一直认为蓝牙通信是 1 对 1 的通信方式,数据在空中是很安全的,但其实刚 才传输的数据早就被攻击者抓到了,如图是用 wireshark 抓出的通信数据: 一般攻击者会使用重放消息来进攻设备,比如刚才的 0x01020304 可能是智能锁的开锁 指令,而攻击者抓到一次数据包之后,对设备发送同样的指令,可能就会进攻成功,所以在 这种情况下在通信中传输明文,是非常危险的。这种情况下,使用加密处理传输的数据就非 常的重要。
目前有两种方式可以实现数据的加密传输:第一种是蓝牙配对绑定之后,链路层的加密, 可以实现数据的安全传输;而另一种方式是直接使用加密通信传输暗文。如果使用第一种方 式的话,使用一般的抓包方法是无法抓出数据的,但由于蓝牙配对绑定的数量往往是有限的, 对于多人使用的公共设备就不能使用这种方法来确保数据的安全。下面我们将重点介绍使用 加密技术来传输暗文保证数据的安全性。 那如何实现传输数据为暗文,nrf51822 或 nrf52832 需要用到这两个工具实现:随机数 产生器和 AES 硬件加密外设。 在密码学中有个重要的概念叫 nonce,关于 nonce 的解释可以参考下面的地址: https://en.wikipedia.org/wiki/Cryptographic_nonce nonce 可以使用随机数产生器来产生,在这里我生成了 16 个字节的一个数组作为 nonce。使 用随机数产生器的方法也很简单,这里以 SDK12.3 为例 包含头文件 打开 sdk_config.h,点击使用 configuration wizard,在 nRF_Drivers 中勾选 RNG_ENABLED 如图: 同时 nRF_Library 中的 NRF_QUEUE_ENABLED 也勾选上 然后将 nrf_drv_rng.c 和 nrf_queue.c 这两个源文件添加进工程
初始化之后就可以使用 nrf_drv_rng_block_rand()函数产生任意一个数组长度的随机数了 这里我生成的是 16 个字节的 nonce 数组,则调用函数 每次调用此函数产生出来的数据都不一样,则表示随机数产生器可以正常使用了。 另一个要用到的工具是 AES-ECB 硬件加密外设 AES(Advanced Encryption Standard)是高级加密标准,是美国国家标准与技术研究院(NIST) 在 2001 年建立的电子技术加密规范。 ECB(Electronic Codebook Book)电码本加密模式是 AES 加密技术中最简单的一种加密模 式,nrf51822 和 nrf52832 上支持的每个加密块大小为 128 位(16Byte),密钥长度为 128 位。 需要加密的数据也为 128 位,如果数据没有 128 位则需要填充。 上图即为 ECB 模式加密解密的过程,使用该模式进行加密的好处是简单,有利于计算。但同 时使用这种加密模式的缺点就是加密的结果取决于加密的明文和密钥,那就意味着相同的明 文块会被加密成相同的暗文块,这种方法在某些环境下并不能提供严格的数据保密性。
以下为维基百科提供的测试内容:将原始图片的每个像素点都进行了加密,加密之后虽然图 片发生了变化,但是还是有很大部分的信息能被人看出来。 但由于我们在使用 ECB 时候往往传输的是数据,所以仍然可以使用 AES-ECB 模式进行数据的 加密。 我们在使用的时候 nrf51822 或 nrf52832 可以直接调用 sd_ecb_block_encrypt()函数来对明文 块进行加密。协议栈内可以直接定义 nrf_ecb_hal_data_t 这个结构体的数据,里面可以存放 明文块数组、密钥数组和加密出的暗文块数组。 下面是使用方法步骤: 首先定义了一个结构体全局变量 结构体已经在 nrf_soc.h 中定义好了,结构体中包含了密钥,明文和暗文数组 初始化的时候设定密码:nordic 芯片中认可的密钥为 128 位(16 个字节),这里假设密码为字 符串”1234567822345678”,并将它存放在结构体中 key 数组内。 然后将需要加密的明文存放在结构体中 cleartext 数组内,明文的数据也需要 16 个字节,若 数据不够 16 个字节则需要填充数据 这里假定需要加密的明文内容为 0x00--0x0f
最后调用 sd_ecb_block_encrypt()函数就可以将明文加密了,加密出来的暗文存放在结构体中 ciphertext 数组内。 这里加密完成以后我使用 RTT 终端将加密过后的数据打印了出来: 打印出来的数据如下: 将此结果与网上下载的加密工具加密的结果对比一下: 使用加密工具加密出来的结果与使用 nrf52832 硬件加密的结果是一样的,说明了 nrf51822 和 nrf52832 的硬件 AES-ECB 是可以使用的。
在知道了可以使用随机数产生器和 AES 硬件加密之后,由于 nrf51822 和 nrf52832 都是没有 AES 硬件解密的,所以两个设备之间的通信应该为同步加密的方式,而不使用解密,使用暗 文通信的步骤应该为: 1、设备 A 与设备 B 应该预先都知道一个 16 字节的密钥。 2、设备 A 与设备 B 连接,每次连接都应该生成 16 个字节的 nonce 随机数数组。 3、设备 A 将 nonce 发送给设备 B,或者 A 将 nonce 存在一个可读的特征值内。 4、设备 A 将 nonce 数组的数据使用 ECB 和密钥加密起来。 5、设备 A 将需要发送的数据填充为 16 个字节(因为一般发送的数据可能不够 16 个字节或大 于 16 个字节,为了不混淆原来的数据和填充的数据,应根据需要选择适当的填充方式)。 https://en.wikipedia.org/wiki/Padding_(cryptography) 维基百科上有详细的加密填充方式介绍,在了解数据长度的情况下可以使用 Zero padding 的 填充方式,若不知道原本的数据长度可以使用 PKCS7 的填充方式。 这里假设我需要发送的数据为 buff[]={0x0a,0x0b,0x0c,0x0d,0x0e,0x0f},使用 Zero padding 的 填充方式,则不够 16 字节的数据全填为 0。 6、设备 A 将第 4 步得到的数据与需要发送的明文数据做异或运算,并将结果发送给设备 B。 7、设备 B 将第 3 步传来的 nonce 数据也使用 ECB 和共同的密钥加密起来(若双方的 nonce 数 据和密钥都是一样的,其加密出来的结果也是一样的)。 8、设备 B 将第 6 步从设备 A 接收到的暗文数据,与第 7 步生成的数据做异或运算,运算结 果就是设备 A 发送过来的明文数据(因为一个数据与另一个数异或两次其结果不变)。 以下为实验过程: 1、设备 A 和 B 预先设定的密钥为字符串”1234567822345678”。 2、设备连接成功后产生一个 nonce 16 字节随机数据 3、nonce 生成之后将 nonce 使用公共密钥加密
并在每次连接成功的时候调用 4、将 nonce 数据发送给设备 B,设备 A 必须要确保设备 B 接收到 nonce 数据。这里我创建 了一个只读的特征值,特征值内存放 nonce 数据,每次连接成功更新特征值数据,关于怎样 创建一个新的只读特征值我这里就不展开了,可以参考另一篇文章: http://download.csdn.net/download/ccdehuiji/9894454?web=web 将 nonce 数据放入可读特征值内 5、填充要发送的数据,这里为了方便我用的是零填充的方式,不足 16 字节的数据则补 0。 6、加密后的数据与需要发送的数据做异或运算之后发送出去,这里我是直接调用了 nus 的 发送函数 7、使用手机 APP 测试接收到的数据 手机 APP 连接之后设备生成的 nonce 数据
分享到:
收藏