所谓无纸化考试,就是以财政部印发的《从业资格考试大纲》为依据、以优化的题库资源为基础、以现代信息技术为手段,通过随机组卷生成无纸化考试试卷进行考试,并及时生成考试成绩,集考试报名、试卷生成、上机考试、阅卷、成绩生成、合格证(单)打印等为一体的、多元化,新型的从业考试管理模式。基于Windows平台的无纸化考试系统的安全性,我们将应用于数据压缩编码等场合中的哈夫曼编码算法,运用于加密考试成绩数据中,在该考试系统的实际运作中,取得了很好的应用效果。
一、哈夫曼编码算法
1952年提出的哈夫曼编码算法,是为压缩文本文件所建立的,是一种统计编码,也是一种可变字长编码,该编码完全依据数据单元的出现概率来构造异字头且平均长度最短的代码字,其基本原理是频繁使用的数据单元用较短的代码代替,较少使用的数据单元用较长的代码代替,每个数据单元的代码各不相同,且一个代码字不会与另一个代码字的前几位相同。编码算法过程描述如下:
(1)首先统计出待编码数据中所有相异数据单元(如文本文件中的字符)出现的频率。
(2)将上进频率从左至右,按由小到大的顺序送行排序,形成一个原始的频率值集合。
(3)每一次在频率值集合中选出两个最小频率值,将他们相加形成一个新的频率值,并将该频率值与剩下未选出的频率值形成一个新的集合。
(4)重复(3)直到最后得到选出的两个频率值能和为1时结束。此时,从数据结构的角度来说,已徒到了一棵二叉树,又称之为哈夫曼树。
(5)将(4)中形成的二叉树(哈夫曼树)左节点标O右节点标1(也可以全部反过来,或使用其它标志值)。把从最上面的根节点到最下面的叶子节点途中遇到的0、1序列连接起来,就形成了相应频率值的数据单元的编码(二进制)。下列实例演示说明了上述过程。设(2)中得到的原始频率值集合如表1所示。
依照上述算法,则可形成如图1所示的二叉树及相应的二进制编码。
图2显示的是在形式上规范化后的二叉树。
二、无纸化考试系统中数据加密处理方法
使用哈夫曼编码对考试系统中成绩数据进行编码处理,其核心是进行加密,而不是进行压缩,所以在编码过程中必须融入加密处理,且无须重点考虑压缩效率。为使通用编码算法具有很强的加密功能,我们在对数据进行哈夫曼编码过程中,设计了一些非常规的变异操作,获得了很好的加密效果。
(1)在哈夫曼编码过程的(5)中产生非二进制编码。
在哈夫曼编码过程的(5)中,正常情况下,或考虑编码的通用性时,对二叉树的左右节点均设置二进制代码O和1,这样则得到二进制形式的编码字。如果不加以改造,则很容易被解码。但是鉴于加密的考虑,将二叉树的左右节点设置为八进制十六进制,或其它自己所定义的一种进制,则可形成非常规的编码字,因而被解码的可能性就很小了,从而实现了加密要求。
(2)在哈夫曼编码过程的(2)中,用1减去所在频率值,得一系列新值,并形成频率值集合。
在不考虑压缩效率的前提下,用该方法获得一个新的频率值集合,在此集合的基础上,形成哈夫曼编码,采取通用的常规方法进行解码是不可能的。同时也可获得很强的加密效果。
(3)在哈夫曼编码过程的(1)中,任意或随机选取若干个相异的数据单元,不进行编码。
选择一些数据单元不进行哈夫曼编码,而且是任意或随机选择,这样要解码的话,则必须获知没有进行编码的数据单元,否则很难进行解码,也可达到很好的加密效果。
(4)对编码过程所产生的二叉树或编码字数据进行处理。
哈夫曼解码时,必须获知在编码过程中所产生的二叉树或编码字的原始数据。常规情况下,编码者对此两类数据使用一般的文件进行存储,解码时从文件中读入数据即可。加密处理时,可对此两类数据的表示或存储作一些变异操作,如在形成二叉树时,从程序设计的角度来说,可以用一种合有一些干扰性冗余数据的结构体表示二叉树。这样就大幅度地增加了解码的难度。
在实际的程序设计过程中,可综合运用4种方法,按照自己的应用情况,设计具有高难度的加密程序,保护系统数据的安全性完整性,保证考试的公正与合理,使无纸化考试系统真正有实用价值。
三、哈夫曼编码算法加密数据的优点
本文提出在常规算法的基础上,加上自己一些随意设计的变异处理,可以形成加密性很强的方法。我们所设计的以分散形式进行考试,以集中方式管理成绩的软件系统中,采用以上方法对成绩数据进行加密处理,加强了系统的两大特点:
(1)灵活多变的加密操作
本文所设计的考试系统,实现了成绩数据的集中处理,因此可以很方便地变换加密操作,甚至可以实现每次所使用的加密操作各不相同,而进行成绩数据集中处理的后台程序无须变化。
(2)借助于哈夫曼编码的压缩特性
在加密的同时,又完成了数据的压缩,为成绩数据集中管理过程中的数据转移提供了良好的物理基础。
小知识之哈夫曼树
哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。