首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

具有数据加密的Android蓝牙远程控制

具有数据加密的Android蓝牙远程控制

关键字:远程控制   蓝牙   Android   加密   RC4  



随着科技的不断的发展,以及人们对于高科技产品的依赖,智能可穿戴设备逐步的发展起来,走进了人们的日常生活。智能手表、智能眼镜的问世为智能可穿戴设备的发展带来了新的方向,Android系统广泛的应用于智能可穿戴设备、智能手机中。为了使智能可穿戴设备更好的与手机相互配合,满足于人们的需求,本文研究了蓝牙远程控制功能,实现了具有远程控制功能的应用程序。由于通过蓝牙传送的数据能够被追踪窃取到,发送数据的安全性也尤为重要,通过比较本文采用RC4和RSA混合加密方式对发送的数据进行加密。为了适应不同品牌的智能手表,首先实现了在手机之间的远程控制功能。程序应用在手表上时,只需对显示界面的长宽比例根据手表的分辨率进行修改,即可满足功能性的需求。
1 蓝牙模块设计

1.1 Android设备间建立蓝牙连接

实现通过蓝牙的远程控制,最基本的操作是要先建立设备之间的蓝牙连接,Android SDK提供了功能完善的API,通过调用系统的API能够实现对附近蓝牙设备搜索、返回远程设备的硬件地址、建立连接、断开连接等工作。蓝牙连接的建立主要分为以下两个步骤:
(1)搜索附近蓝牙设备
BluetoothAdapter 类中提供了本地蓝牙适配器的接口,所有的蓝牙交互都是从此API开始的,主要功能有开关蓝牙设备、扫描蓝牙设备、设置或获取蓝牙状态值、获取蓝牙名称、获取蓝牙Mac地址等。调用enable() 方法打开本地的蓝牙,然后调用startDiscovery()搜索附近设备,将所有搜索到的蓝牙地址存储在列表中。通过获得的远程蓝牙设备的地址,实例化一个蓝牙设备的语句如下:
BluetoothDevice device =BluetoothAdapter .getRemoteDevice(address)
(2)建立蓝牙连接
建立蓝牙连接的过程中的两个设备,分别充当了Server和Client。对于Server端通过UUID来创建一个BluetoothServerSocket来收听来自其他设备的连接请求,当有远端设备发来建立连接的请求,对请求进行响应实现蓝牙的连接。在程序中使用如下语句:
BluetoothServerSocket mmServerSocket = mAdapter.listenUsingRfcommWithServiceRecord(NAME_SECURE, Y_UUID_SECURE);
对于Client端, 使用第1步中实例化的蓝牙设备BluetoothDevice,通过 UUID创建一个BluetoothSocket, 发送连接请求,与Server端建立连接, 来实现数据的接收和发送,在程序中使用如下语句:
BluetoothSocket mmSocket = device.createRfcommSocketToServiceRecord(MY_UUID_SECURE);
Server端BluetoothServerSocket代表一个打开服务器套接字侦听传入的请求,类似于一个TCP SeverSocket,当连接建立成功后,调用BluetoothServerSocket接口的 accept()方法,返回一个BluetoothSocket对象。BluetoothSocket用来代表一个蓝牙套接字,这个套接字类似于 TCP套接字。这是应用程序的连接点,通过此接口可以实现蓝牙数据的接收和发送。调用BluetoothSocket接口中的方法,得到输入输出流,在应用程序中向输出流中写数据实现蓝牙数据的发送,从输入流读数据,实现蓝牙数据的接收。
1.2 自定义蓝牙远程控制协议
Android系统上蓝牙的连接过程通过以上的两步即可建立完成,在应用中对于蓝牙使用仅仅限于数据的传送,对于数据的内容并不关心。然而这并不能满足用户的需求,用户更期望通过蓝牙实现远程控制的功能。当前蓝牙发送的数据并没有对内容进行考虑,仅仅是简单的数据传送,如果想实现蓝牙的远程控制,那么就需要自定义发送的数据结构。控制信息和普通数据信息均通过蓝牙在设备之间进行传送,若想对控制信息和数据信息进行区分,就要在已有的发送数据的首部,添加头结点,设置头结点占用1字节的存储空间,作为控制位标识,用来标识传递信息的类型。1 字节的头结点最多可以标识出256种不同的信息类型,在现阶段的使用过程中能够满足需求,当然如果控制类型增加,只需增加控制位的位数。定义的数据结构如下所示:




本应用程序实现了手机通过蓝牙远程控制另一部手机进行图片预览以及拍照功能。因此发送信息分为两类,一类发送的是图像的数据信息,在Android程序中定义控制位为:
private static final byte DATA =(byte) 0;
另一类是拍照指令,在Android程序中定义控制位为:
private static final byte TAKE_PHOTO = (byte)1;
如果欲实现更多的控制功能,可以自定义更多的控制位类别,在程序进行相应的响应,即可实现更多的控制功能。
当Sever端收到数据以后,对于数据的头结点进行判断。通过判断控制位的类型来区分出是数据信息还是控制信息,返回给主函数对其响应。如果接收到的数据包为数据信息,则调用图像显示功能,将接收的图片显示出来。如果收到的数据的是拍照指令,即可调用拍照功能模块,将拍摄的照片进行存储。2 加密模块设计
虽然自定义的蓝牙数据结构满足了人们通过蓝牙远程控制的需求,然而却也存在着一定的安全性问题。在实际生活中,环境比较复杂,无线传输的信号能够被他人通过一些工具监测并且窃取到。如果当用户传送的图片信息被他人截取,用户的隐私就会被轻松的获取到。然而这并不算最危险的,如果在程序中添加了很多控制信息,控制信息被他人截取并且掌握后,那么可能就会导致手机被他人控制,这将给用户带来更大的损失。
为了保证信息的安全性,需要对蓝牙发送的数据进行加密操作。数据的加密一般要经过复杂加密算法来实现,然而对于手机而言,运算效率不是很高,而且若要实时的预览远程设备采集到的数据,也就意味着要在极短的时间内,加密和解密大量的数据,那么加密算法的加密效率更加关键。
文献4通过使用一种基于AES和RSA的混合加密算法来保证蓝牙通信过程中的数据安全。AES算法以其在块加密高效的特点应用与蓝牙通信的数据信息加密上,RSA算法在秘钥管理上比较有优势,能够有很高的安全性,因此用来加密AES的秘钥信息。
文献5比较了RC4 和AES对于设备CPU时间占用、内存消耗以及电池电量的消耗进行了分析对比,得出了RC4更适合于大数据包的加密,而AES更适合于小数据包的加密。
经过多方面的综合比较,本文采用RC4和RSA混合加密的方式对数据进行加密。利用RC4在大数据包加密速度快的优势,首先对数据使用RC4进行加密。由于RC4加密算法相对简单,其安全性上也存在着一定的风险,为了把这种风险降低,采用混合加密的处理方式对数据进行操作。RC4加密算法加密完数据信息后,进行第二次加密,加密RC4的秘钥信息。由于RC4秘钥的长度比较短,可以采用运算过程相对复杂但是安全性非常高的RSA加密算法。整个的加密过程如图1所示。



图 1数据加密过程


加密的过程主要分为两步:
第一步,对于原始数据 Original Message用RC4秘钥来进行加密。
第二步,对于RC4秘钥使用RSA进行加密,保证了此秘钥在数据传输安全性。防止了信息被截取后,容易分析出RC4秘钥内容的风险。
解密过程如图2所示。


图2数据解密过程


解密过程同样分为两个步骤,当应用程序收到发送来的数据后,第一步读取RC4秘钥部分,通过RSA的私有秘钥进行解密,还原RC4秘钥。第二步,使用RC4秘钥对数据部分进行解密,还原出图像信息。
掌握了RC4加密算法和RSA加密算法后,即可实现混合加密算法。对发送的数据进行混合加密,保证用户数据的安全性。
最终写入蓝牙输出流中的数据主要包含3部分,如下所示:



第一部分,数据的长度,在Android程序中,为了将连续发送的图片的信息,每一帧识别出来,还需要在头部添加一个数据信息长度。以便在数据被接收到后,能够确定所要读取的字节数。
第二部分是RC4秘钥,这部分中RC4的秘钥是被RSA所加密后的结果,能够保证RC4的秘钥再被窃取到后也不能够直接使用,在当今计算机的运算效率下,还不能够实现对RSA加密算法的破解。
第三部分是经RC4加密的数据信息。来自上层的应用程序欲发送的未加密的数据到了此模块,要进行RC4加密。信息中保存着所有的用户操作的信息。这部分的数据长度是根据情况来分配。如果是控制信息,那么信息长度会非常短。如果是图片数据,那么信息长度会比较长。这个长度信息由第一部分的数据长度进行记录。
返回列表