基于无纸化考试系统对数据安全的要求,我们提出了一种实用的成绩加密法。
一、成绩加密法的提出
无纸化考试中,考试成绩的加密有其自身的特点。对于没有加密或加密不严谨的无纸化考试系统,可能造成考试成绩不安全或不准确的途径有:
1、直接修改上报的成绩文件中某考生的成绩;
2、如果能够确定每个考生考号姓名和成绩等记录在上报的成绩文件中的位置,可以直接复制某个成绩可能较好的考生有关成绩的记录到其他考生存放成绩的地方,等等。因此,加密时主要考虑以下方面:
1)针对上述问题,如何采取有效措施,防止直接修改密文或复制某个成绩较好的考生有关成绩的记录到其他考生的存放成绩的地方;
2)如何保证能方便解密;
3)实现时要尽可能简单易行。
二、成绩加密解决方案
为了避免直接复制密文,一种简单的思路是:每个考生采用不同的密钥。但是,为了解密时能方便地获得密钥,我们必须确定密钥的产生方法。如果明文是由考生的考号、姓名和各个考题的得分等构成,可以确定,加密的重点是除了考号和姓名之外的每个考生的各个考题的得分等情况。为了不增加密文的长度和降低实现的难度,我们就可以使用考生的考号作为密钥,这样,我们的重点就是设计一种良好有效的算法。
设计算法时,考虑到加密和解密的可操作性,我们利用了异或(XOR)运算的可逆性,决定将明文与钥文(由密钥变换出来的字节序列)逐字节进行异或操作,解密时再重复加密时的操作即可。现在的关键是钥文如何产生?显然,直接用考号作为钥文是很不够的。我们注意到考号中不可避免地要出现一些数字,所以就决定对考号中的数字进行一定的运算,产生两个数字NUMI和NUM2,再依次从某个文件(假设文
件为JSH.DLL)的NUM1位置开始,每间隔NUM2个字节取一个字节形成钥文序列(由密钥变换出来的子密钥)。
假设文件JSH.DLL的长度为N,我们可以使产生的NUM1和NUM2的取值范围在0到(N-1)之间,这样,每个钥文的产生就有N*N种可能。甚至可以根据考号,选择从不同的文件中取钥文序列,而且每个考生将采用不同的钥文,当N足够大时,将可以达到要求的安全级别。
三、成绩加密方案实现
根据以上分析,可以编写函数EnDecrypt,该函数的入口参数应该包括密钥和明文,返回值就是密文(一种更好的方法是:传送明文时采用地址传递,就不需要返回值)。不失一般性,可以假设考号是5位数
的数字,就用考号作为密钥。明文是由考号、姓名和成绩0041 0050 0080 0090”),出于安全考虑,我们将考号也进行简单的加密。密文以字符串类型返回。以下就是用Borland Delphi 5.O实现时的部分关键代码:
procedure TFormI.EnDecrypt( StrFileName: String;//指定从哪个文件中取钥文序列iEnd: integer;//考号结束处var SrcString: String;//明文字符串);
var
i, iDistance: integer;
KeyFile: File;
PointOfFile: integer;
ch: char;
StrKh: String;
StrKeyStd: String;
begin
StrKeyStd: =' HunanNormaIUniversityDepartmentOfComputerEducation' ;
StrKh: = Copy( SrcString, 1, iEnd) ;
for i: = I to iEnd do begin
StrKhEil: = Chr( Ord( SrcString[Ei]) xor Ord( StrKeyStdSrcStr[i]: = StrKh[i];
end;
AssignFile( KeyFile, StrFileName);
Reset( KeyFile,1);
PointOfFde:=(StrTolnt64( StrKh) mod 76): mod FileSizeI( KeyFile);//产生NUMI
iDistance:=StrTolnt64( StrKh) mod 24; 11产生NUM2
//以上产生NUMI和NUM2的算法可以采用其他更复杂有效的方法
Seek( KeyFde, PointOfFile);
for i:=iEnd+1 to Length( SrcString) do begin
BlockRead( KeyFile, ch,1);
SrcStrii]:=Chr( Ord( SrcStrin~/il) xor Ord( ch));
PointOfFile:=(PointOfFile+iDistance) mod FileSize(KeyFile);
Seek( KeyFile, PointOfFile);
end;
CloseFile( KeyFile);
end;
实现时,我们还可以作以下改进:
1、取钥文序列时,应该从考试系统中实际使用到的可执行程序或动态链接库等二进制文件中取,而不要从文本文件等易于查看的文件中取,这样将具有更高的安全性。也不要从Windows等其他软件中取,以防环境不同造成不能正确解密。
2、不妨在每一条记录的前后加上少量冗余字符,这样将更难判断每一条记录的开始与结束。甚至可以在最后回收的成绩文件前后加入一些冗余数据,对判断记录的长度等也会有一定的迷惑作用。
3、为了使用的方便,建议将该程序写成动态链接库(DLL文件)。
4、同时,我们考虑到考试系统应该能够将网络上每台机器中的数据收集到某一台机器上,而要避免手工到每台机器上去收集,这样就要考虑如果网络传输丢包以及将来备查等情况,这样我们可以在考生机器上为每个考生生成一个文件来存储该考生的考号、姓名和成绩等信息。这些信息和回收上来的考生信息可以采用类似的加密方法。只是明文中不必再包含考生的考号,而用考生的考号直接作为考生信息文件的文件名的一部分。
采用同样的方法就可以解密。
小知识之无纸化考试
无纸化考试,是以财政部印发的《从业资格考试大纲》为依据、以优化的题库资源为基础、以现代信息技术为手段,通过随机组卷生成无纸化考试试卷进行考试,并及时生成考试成绩,集考试报名、试卷生成、上机考试、阅卷、成绩生成、合格证(单)打印等为一体的、多元化,新型的从业考试管理模式。