利用RC4和RSA混合加密实现蓝牙遥控功能

2021-06-29 18:10 来源:电子说

作者:陈育坤;马忠梅;曾丽

随着科学技术的不断发展和人们对高科技产品的依赖,智能可穿戴设备逐渐发展并进入人们的日常生活。智能手表和智能眼镜的出现为智能可穿戴设备的发展带来了新的方向。Android系统广泛应用于智能可穿戴设备和智能手机。为了使智能可穿戴设备更好地与手机配合,满足人们的需求,本文研究了蓝牙遥控功能,并实现了具有遥控功能的应用程序。因为通过蓝牙传输的数据可以被追踪和窃取,所以传输数据的安全性尤为重要。通过比较,采用RC4和RSA混合加密方法对传输的数据进行加密。为了适应不同品牌的智能手表,首先实现手机之间的遥控功能。程序应用到手表上,只需要根据手表的分辨率修改显示界面的长宽比,就可以满足功能要求。

1蓝牙模块设计

1.1在Android设备之间建立蓝牙连接

通过蓝牙实现远程控制,最基本的操作就是先建立设备之间的蓝牙连接。Android SDK提供了功能齐全的API,可以搜索附近的蓝牙设备,返回远程设备的硬件地址,建立连接,断开连接等。蓝牙连接的建立主要分为以下两个步骤:

(1)搜索附近的蓝牙设备

BluetoothAdapter类提供了本地蓝牙适配器的接口,所有蓝牙交互都是从这个API开始的。主要功能包括切换蓝牙设备、扫描蓝牙设备、设置或获取蓝牙状态值、获取蓝牙名称、获取蓝牙Mac地址等。调用enable()方法打开本地蓝牙,然后调用startDiscovery()搜索附近的设备,并将搜索到的所有蓝牙地址存储在列表中。通过获取远程蓝牙设备的地址,实例化蓝牙设备的语句如下:

蓝牙设备=蓝牙适配器。getRemoteDevice(地址)

(2)建立蓝牙连接

在建立蓝牙连接的过程中,两台设备分别充当服务器和客户端。对于服务器,UUID创建了一个蓝牙服务器套接字来监听来自其他设备的连接请求。当远程设备发送建立连接的请求时,它响应该请求以实现蓝牙连接。在程序中使用以下语句:

BluetoothServerSocket mmServerSocket=madapter . listensingrfcommwithservicerecord(NAME _ SECURE,Y _ UUID _ SECURE);

对于客户端,使用步骤1中实例化的蓝牙设备,通过UUID创建蓝牙套接字,发送连接请求,并与服务器端建立连接以接收和发送数据。程序中使用了以下语句:

BluetoothSocket mmSocket=device . createrfcommsockettoseservice record(MY _ UUID _ SECURE);

服务器端蓝牙服务器套接字代表一个开放的服务器套接字来监听传入的请求,这类似于一个TCP服务器套接字。连接建立成功后,调用蓝牙服务器套接字接口的accept()方法,返回一个蓝牙套接字对象。BluetoothSocket用来表示一个蓝牙套接字,类似于TCP套接字。这是应用程序的连接点,通过它可以接收和发送蓝牙数据。调用BluetoothSocket接口中的方法获取iostream,在应用程序中向输出流写入数据发送蓝牙数据,从输入流读取数据接收蓝牙数据。

1.2定制蓝牙远程控制协议

安卓系统上蓝牙的连接过程可以通过以上两个步骤建立。在应用中,蓝牙的使用仅限于数据的传输,不关心数据的内容。但这并不能满足用户的需求,用户期望通过蓝牙实现远程控制的功能。目前蓝牙发送的数据不考虑内容,只是简单的数据传输。如果想实现蓝牙的远程控制,需要定制发送的数据结构。控制信息和公共数据信息通过蓝牙在设备之间传输。如果要区分控制信息和数据信息,就要在已有传输数据的头部增加一个头节点,并将头节点设置为占用1字节的存储空间作为控制位标识,以标识传输信息的类型。1字节头节点可以识别多达256种不同的信息类型,可以满足当前使用过程中的要求。当然,如果增加控制类型,只需要增加控制位数。定义的数据结构如下:

poYBAGDa00aAII_AAAAOZdjvU0A660.png

该应用实现了手机通过蓝牙远程控制另一部手机预览和拍照的功能。因此,发送的信息分为两类,一类是图像的数据信息,Android程序中定义的控制位有:

私有静态最终字节DATA=(字节)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所示。

pYYBAGDa0z-AAVh_AAA4iCdbfgE747.png

图 1数据加密过程

加密的过程主要分为两步:

第一步,对于原始数据 Original Message用RC4秘钥来进行加密。

第二步,对于RC4秘钥使用RSA进行加密,保证了此秘钥在数据传输安全性。防止了信息被截取后,容易分析出RC4秘钥内容的风险。

解密过程如图2所示。

pYYBAGDa0zaARA-0AAA31eiEE-I190.png

图2数据解密过程

解密过程同样分为两个步骤,当应用程序收到发送来的数据后,第一步读取RC4秘钥部分,通过RSA的私有秘钥进行解密,还原RC4秘钥。第二步,使用RC4秘钥对数据部分进行解密,还原出图像信息。

掌握了RC4加密算法和RSA加密算法后,即可实现混合加密算法。对发送的数据进行混合加密,保证用户数据的安全性。

最终写入蓝牙输出流中的数据主要包含3部分,如下所示:

pYYBAGDa0y6AJGJXAAAXrCxlxwc034.png

第一部分,数据的长度,在Android程序中,为了将连续发送的图片的信息,每一帧识别出来,还需要在头部添加一个数据信息长度。以便在数据被接收到后,能够确定所要读取的字节数。

第二部分是RC4秘钥,这部分中RC4的秘钥是被RSA所加密后的结果,能够保证RC4的秘钥再被窃取到后也不能够直接使用,在当今计算机的运算效率下,还不能够实现对RSA加密算法的破解。

第三部分是经RC4加密的数据信息。来自上层的应用程序欲发送的未加密的数据到了此模块,要进行RC4加密。信息中保存着所有的用户操作的信息。这部分的数据长度是根据情况来分配。如果是控制信息,那么信息长度会非常短。如果是图片数据,那么信息长度会比较长。这个长度信息由第一部分的数据长度进行记录。

3.蓝牙远程控制拍照程序设计

本程序是在基于Android操作系统的智能手机上构建的一个远程控制程序。程序中包括着蓝牙连接的建立、蓝牙数据的编码与传送、数据加密3部分。实现了通过手机实时显示另一部手机端摄像头采集到的数据,通过点击程序中的拍照键即可控制手机进行照片的拍摄。程序的流程图如图3所示。

pYYBAGDa0yeASW2yAACr6rQUZw8161.png

图3蓝牙远程控制程序流程图

3.1 建立蓝牙连接

创建DeviceListActivity类用于蓝牙设备的搜索,返回选择的蓝牙设备的名称和地址。

其功能流程如图4所示。

poYBAGDa0yCABCr3AAAtH8SmNoQ302.png

图4蓝牙连接建立流程图

通过搜索设备功能可获得周围可见的蓝牙设备信息,以列表的形式显示所有搜索到的设备。用户根据需要,选择所要连接的设备,DeviceListActivity类返回设备的名称以及MAC地址。

3.2 蓝牙数据的编码

根据 DeviceListActivity返回的远端蓝牙设备的名称和地址,调用Bluetooth API建立蓝牙设备的连接,当连接建立完成后,便进入到了主功能模块。

首先在onCreat()函数中,完成了参数的初始化工作,初始化发送标志位SendFlag = 0,在此状态下,应用程序处于接收数据的状态。摄像头停止采集图像信息,不进行发送数据。接着再初始化Button监听事件,应用程序中定义了两个Button,一个Button用来控制此Activity处于发送还是接收的状态;另一个Button用来控制是否对拍照功能予以响应;

Activity处于发送状态时,将Camera采集到的每一帧数据进行处理,由于图片比较大,蓝牙发送的数据速率是有限的,为了保证接收端接收到的视频图像的连贯性,要对采集到的图片进行压缩处理。调用Android API中 Matrix的postScale()方法,设置缩放比例,实现图片的缩放。

接下来数据部分要添加信息头,如果是拍照的控制信息,添加第1节中设定的TAKE_PHOTO 其值为数值 1;如果是照片信息,添加 DATA其值为数值 0。通过添加信息头,便实现了对于数据信息和控制信息的区分。最后进入到下一步骤,对数据进行加密。

3.3 数据加密

数据加密采用RC4与RSA混合加密方式,再上一节中详细的予以阐述。数据加密的流程如图5所示。

pYYBAGDa0xqAH2tPAAAg81__cBU326.png

图5 数据加密流程图

在接收端,线程一直等待蓝牙发送的数据,当读取到数据,便根据解密的方法,依次去除加密信息。解密的顺序与加密构成逆过程。解密流程如图6所示。

poYBAGDa0xSAWZdhAAAfmu6ldlA956.png

图6 数据解密流程图

对于解密出来的数据,要对其分析判断数据的类型,根据自定义的蓝牙数据结构可知,数据的第一位即为数据类型位。进行数据类型判断的主要程序如下所示:

switch(decr[0]) {

case TAKE_PHOTO:

mHandler.obtainMessage(MainActivity.MESSAGE_READ, -1,TAKE_PHOTO , buffer).sendToTarget();

break;

case DATA:

mHandler.obtainMessage(MainActivity.MESSAGE_READ, decr.length,DATA, decr).sendToTarget();

break;

}

通过以上3个步骤,便实现了远程控制的功能。在实际应用中,其中一部手机作为被控制端,实时的将照相机采集到的数据发送到另一部手机。控制端实时显示接收到的图像,当需要拍摄照片时候,点击拍照按钮,即可实现远程控制的功能,完成照片的拍摄,并将照片存储起来。

结语

本文实现了基于Android系统的蓝牙远程控制功能。极大的丰富用户对于智能设备功能的需求。在数据传送的过程中,使用了混合加密算法对数据加密,保证了用户数据的安全以及保证了设备不被他人控制。在方便人们生活的同时也保护了用户的隐私。随着智能可穿戴设备的发展,智能设备通过蓝牙相互连接和相互控制的应用也会比较广泛,智能可穿戴设备的主要以搭载Android系统为主。本文中实现的远程控制拍摄照片的功能,移植到手表端,核心的程序部分均不需要改动,在程序显示界面部分根据不同种类设备的分辨率进行相应的调整,便能实现通过蓝牙进行远程控制的功能。

责任编辑:gt

延伸 · 阅读