开 始 调 用 相 机 功 能 采 集 条 码 图 像 图 像 预 处 理 读 取 数 据 图 像 处 理 、矫 正、译 码 显 示 文 本 信 息 图3 系统流程图
4.2 数据加密与二维码生成模块的实现
4.2.1 数据加密模块的实现——DES加密算法 (1)构造DES加密的函数,并初始化密钥。 public DES(String key){ this.key = key; }
(2)输入参数后,先对参数格式的正确性进行检测,如果错误就直接返回空(null)。 private byte[] UnitDes(byte[] des_key, byte[] des_data, int flag) { if ((des_key.length != 8) || (des_data.length != 8) || ((flag != 1) && (flag != 0))) {
hrow new RuntimeException(\}
(3)首先设置好DES加密算法的置换方法。 初始化密钥数组,并进行PC-1、PC-2、??、置换。
例如:对密钥进行PC-1变换,并生成生成子密钥keyarray[i][j] private void KeyInitialize(int[] key, int[][] keyarray) { int i; int j; int[] K0 = new int[56]; for (i = 0; i < 56; i++) {
K0[i] = key[PC_1[i] - 1];
- 9 -
}
for (i = 0; i < 16; i++) {
LeftBitMove(K0, LeftMove[i]);for (j = 0; j < 48; j++) { keyarray[i][j] = K0[PC_2[j] - 1]; } } }
4)当dest和src两个都不为空时,将源数组src组件的子序列复制到引用的dest目标数组中。
ublic void arraycopy(byte[] src,int srcPos,byte[] dest, intdestPos,int length){ if (dest != null && src != null){ byte[] temp = new byte[length]; for (int i = 0;i < length;i++){ temp[i] = src[srcPos + i]; }
for (int i = 0;i < length;i++){ dest[destPos + i] = temp[i]; }
(5)加密算法设计。
对原始数据长度进行检测,原始数据长度不满四位的加0补满四位,并且保证原始数据的前4位为该数据的长度。key是密钥,data是要处理的数据,flag 1为加密,0为解密,return 处理后的数据。
public byte[] encrypt(String data) throws UnsupportedEncodingException{ String dataLength = data.length() + \if (dataLength.length() == 1){ dataLength = \}else if (dataLength.length() == 2){ dataLength = \}if (dataLength.length() == 3){ dataLength = \}
StringBuffer sbDate = new StringBuffer(); sbDate.append(dataLength); sbDate.append(data);
byte[] bytekey = key.getBytes();
- 10 -
byte[] bytedata = sbDate.toString().getBytes();
byte[] result = new byte[(bytedata.length + 8) - (bytedata.length % 8)]; result = DesEncrypt(bytekey, bytedata, 1); return result; }
(6)输入端信息的的DES加密如图4所示。
图4 数据的DES加密结果图
4.2.2 二维码生成模块
本设计的二维码是首先在Eclipse软件中利用DES.java加密解密程序,将输入的数据用密钥进行加密,再将得到的密文在草料网上转化为二维码所得。二维码的转化实现如图5所示。
图5二维码的转化
4.3 二维码扫描识别与数据解密模块的实现
4.3.1 系统界面设计
本设计的用户界面模块提供了一个用户操作的界面,可以进行用户的登录,并且显示拍摄的窗口。手机用户通过用户界面的菜单进行输入与选择操作。图6是用户原始界面。
- 11 -
图6 用户原始界面 4.3.2 二维码扫描识别的实现
本设计中,在建立工程(Project)时借助了Google提供的开源类解码核心库Zxing,用于实现对二维码的扫描与识别,借助Zxing里的类库,调用其中的特定函数进行解码功能的实现。 Zxing是一个开放源码的图像处理库,它借用了Java来对条码进行编写。
在对二维码进行扫描识别时需要用到摄像头功能,因此本设计选用了使用广泛的Android系统智能机进行二维码的识别测试。 (1)系统包含的包结构图 (2)系统主要包的功能介绍
本设计的主要包包括:Previewcallback:摄像头回调包;CameraManager:摄像头管理包,主要管理摄像头功能的开关;DecodeHandle:数据传输包;DecodeFormatManager:配置解码格式包;CaptureActivityHandle:是解码成功的数据传输媒介; Encoding:根据输入的字符串生成二维码;AndroidManifest.xml:配置文件。ViewfinderView 是自定义的View,是拍摄时Android手机屏幕中间的取像框。
加载main activity,在此类中创建CaptureActivityHandle对象,由该包调用手机的摄像头。创建DecodeThread线程,该线程创建了Decodehandle对象,而这个对象获取从摄像头采集到的并转化后的原始byte数据。
包结构图见图7。
- 12 -
图7 包结构图
(3)设置界面布局,设置Activity关联视图集根。OnCreate方法是在Activity被创建时被系统调用的,是Bundle类型的参数,savedInstanceState方法用来保存Activity状态,super
图8 设置界面布局
调用(成员方法)。见图8。
(4)打开扫描界面扫描二维码。见图9。
- 13 -