成績加密法

基于無紙化考試系統(tǒng)對數(shù)據(jù)安全的要求,我們提出了一種實用的成績加密法。

一、成績加密法的提出

無紙化考試中,考試成績的加密有其自身的特點。對于沒有加密或加密不嚴謹?shù)臒o紙化考試系統(tǒng),可能造成考試成績不安全或不準確的途徑有:

1、直接修改上報的成績文件中某考生的成績;

2、如果能夠確定每個考生考號姓名和成績等記錄在上報的成績文件中的位置,可以直接復(fù)制某個成績可能較好的考生有關(guān)成績的記錄到其他考生存放成績的地方,等等。因此,加密時主要考慮以下方面:

1)針對上述問題,如何采取有效措施,防止直接修改密文或復(fù)制某個成績較好的考生有關(guān)成績的記錄到其他考生的存放成績的地方;

2)如何保證能方便解密;

3)實現(xiàn)時要盡可能簡單易行。

二、成績加密解決方案

為了避免直接復(fù)制密文,一種簡單的思路是:每個考生采用不同的密鑰。但是,為了解密時能方便地獲得密鑰,我們必須確定密鑰的產(chǎn)生方法。如果明文是由考生的考號、姓名和各個考題的得分等構(gòu)成,可以確定,加密的重點是除了考號和姓名之外的每個考生的各個考題的得分等情況。為了不增加密文的長度和降低實現(xiàn)的難度,我們就可以使用考生的考號作為密鑰,這樣,我們的重點就是設(shè)計一種良好有效的算法。

設(shè)計算法時,考慮到加密和解密的可操作性,我們利用了異或(XOR)運算的可逆性,決定將明文與鑰文(由密鑰變換出來的字節(jié)序列)逐字節(jié)進行異或操作,解密時再重復(fù)加密時的操作即可?,F(xiàn)在的關(guān)鍵是鑰文如何產(chǎn)生?顯然,直接用考號作為鑰文是很不夠的。我們注意到考號中不可避免地要出現(xiàn)一些數(shù)字,所以就決定對考號中的數(shù)字進行一定的運算,產(chǎn)生兩個數(shù)字NUMI和NUM2,再依次從某個文件(假設(shè)文
件為JSH.DLL)的NUM1位置開始,每間隔NUM2個字節(jié)取一個字節(jié)形成鑰文序列(由密鑰變換出來的子密鑰)。

假設(shè)文件JSH.DLL的長度為N,我們可以使產(chǎn)生的NUM1和NUM2的取值范圍在0到(N-1)之間,這樣,每個鑰文的產(chǎn)生就有N*N種可能。甚至可以根據(jù)考號,選擇從不同的文件中取鑰文序列,而且每個考生將采用不同的鑰文,當N足夠大時,將可以達到要求的安全級別。

三、成績加密方案實現(xiàn)

根據(jù)以上分析,可以編寫函數(shù)EnDecrypt,該函數(shù)的入口參數(shù)應(yīng)該包括密鑰和明文,返回值就是密文(一種更好的方法是:傳送明文時采用地址傳遞,就不需要返回值)。不失一般性,可以假設(shè)考號是5位數(shù)
的數(shù)字,就用考號作為密鑰。明文是由考號、姓名和成績0041 0050 0080 0090”),出于安全考慮,我們將考號也進行簡單的加密。密文以字符串類型返回。以下就是用Borland Delphi 5.O實現(xiàn)時的部分關(guān)鍵代碼:

procedure TFormI.EnDecrypt( StrFileName: String;//指定從哪個文件中取鑰文序列iEnd: integer;//考號結(jié)束處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);//產(chǎn)生NUMI

iDistance:=StrTolnt64( StrKh) mod 24; 11產(chǎn)生NUM2

//以上產(chǎn)生NUMI和NUM2的算法可以采用其他更復(fù)雜有效的方法

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;

實現(xiàn)時,我們還可以作以下改進:

1、取鑰文序列時,應(yīng)該從考試系統(tǒng)中實際使用到的可執(zhí)行程序或動態(tài)鏈接庫等二進制文件中取,而不要從文本文件等易于查看的文件中取,這樣將具有更高的安全性。也不要從Windows等其他軟件中取,以防環(huán)境不同造成不能正確解密。

2、不妨在每一條記錄的前后加上少量冗余字符,這樣將更難判斷每一條記錄的開始與結(jié)束。甚至可以在最后回收的成績文件前后加入一些冗余數(shù)據(jù),對判斷記錄的長度等也會有一定的迷惑作用。

3、為了使用的方便,建議將該程序?qū)懗蓜討B(tài)鏈接庫(DLL文件)。

4、同時,我們考慮到考試系統(tǒng)應(yīng)該能夠?qū)⒕W(wǎng)絡(luò)上每臺機器中的數(shù)據(jù)收集到某一臺機器上,而要避免手工到每臺機器上去收集,這樣就要考慮如果網(wǎng)絡(luò)傳輸丟包以及將來備查等情況,這樣我們可以在考生機器上為每個考生生成一個文件來存儲該考生的考號、姓名和成績等信息。這些信息和回收上來的考生信息可以采用類似的加密方法。只是明文中不必再包含考生的考號,而用考生的考號直接作為考生信息文件的文件名的一部分。

采用同樣的方法就可以解密。

小知識之無紙化考試

無紙化考試,是以財政部印發(fā)的《從業(yè)資格考試大綱》為依據(jù)、以優(yōu)化的題庫資源為基礎(chǔ)、以現(xiàn)代信息技術(shù)為手段,通過隨機組卷生成無紙化考試試卷進行考試,并及時生成考試成績,集考試報名、試卷生成、上機考試、閱卷、成績生成、合格證(單)打印等為一體的、多元化,新型的從業(yè)考試管理模式。