動態(tài)偽隨機序列加密法的改進及其應(yīng)用

信息時代的迅速到來向加密技術(shù)提出了甚為迫切的要求。國際互聯(lián)網(wǎng)絡(luò)把世界聯(lián)成一個整體,極大地加大了信息的流通速度,加快了社會生活的步伐。但在互聯(lián)網(wǎng)的背后還存在著很多的不安全的因素,例如網(wǎng)絡(luò)通信的安全問題,若不采取一定的措施加以防范,一些重要的、機密的信息就很容易被偷閱、篡改甚至冒名偽造。由此可見解決信息通信安全問題的重要性和緊迫性。

實際上,可采用許多措施解決信息安全問題,例如:防火墻、網(wǎng)絡(luò)軟件加密狗、信息加密技術(shù)等,其中,信息加密技術(shù)是最直接、最有效的辦法。

一、傳統(tǒng)的信息加密和破譯密碼的方法

1、傳統(tǒng)的加密方法

(1)代碼加密

通信雙方預(yù)先設(shè)定一組代碼,加密和解密就是根據(jù)這一組代碼來完成的。這種方法的缺點是只能傳送原來預(yù)先約定好的信息,多次使用代碼后容易被竊密。

(2)替換加密

明文中的每個字母被替換成另一個字母,該法還不如代碼加密。因為,竊密者只要多次搜索一些密文就能夠發(fā)現(xiàn)其中的規(guī)律。

(3)變位加密

將明文的順序按密鑰重新排列。

(4)一次性密碼薄加密_

密碼薄每一頁是不同的代碼表,每頁只用一次,用其中的代碼給明文加密。要破譯密文的唯一辦法,就是要獲得一份相同的密碼薄,而這是很困難的。這種方法既保持代碼的可靠性,又保持替換加密器的靈活性。但這種方法代價高(同樣的密碼薄要送到對方),生成一次性密碼必須是隨機的,否則不可能安全。這種方法一般用于高度保密的場合。

2、破譯密碼的常用方法

(1)密碼窮盡搜索

(2)密碼分析

(3) 已知明文的破譯方法,例如分析電子郵件信頭的固定格式得出密鑰。

(4)選定明文的破譯法,先加密一段選定的明文再由密文和明文分析密鑰。

(5)差別比較法,先加密一組相似卻差別細微的明文,然后比較它們的結(jié)果,從而獲得密鑰。

由此可見,各種傳統(tǒng)的信息加密方法都有不足之處,就一次性密碼薄加密法來說,密鑰的分發(fā)十分復雜,產(chǎn)生密碼薄麻煩、代價高。經(jīng)過深入研究和探索,我們對傳統(tǒng)加密技術(shù)中的一次性密碼薄加密方法進行了優(yōu)化改進。這種方法最大的優(yōu)點是密碼薄根據(jù)密鑰臨時隨機產(chǎn)生,從而克服以上缺陷,我們把這種方法稱為“動態(tài)偽隨機序列加密法”。

二、動態(tài)偽隨機序列加密法的原理

設(shè)用戶密碼序列為Ui(i=1,2,…,k),先將用戶密碼加長(要求大于被加密文件的長度),得到初始加密密鑰Ri(i=1,2,…,m),它相當于一次性密碼薄加密中的密碼薄。為了減少用戶密碼的重復性,在組成初始加密密鑰時選擇一定的算法對用戶密碼進行處理,使密鑰Ri序列不具某種規(guī)律性,這種算法要求正向運算容易,而反向運算幾乎無法實現(xiàn)。改進后的動態(tài)偽隨機序列加密法具體做法如下:

(1)首先由用戶輸入密鑰(口令),口令長度理論上無上限限制。下面程序人為限制長度的下界長為8個字符,輸入的口令先存放在1.DAT中。

(2)1.DAT的內(nèi)容復制到臨時的文件TEMP1DAT中去。

(3)對TEMP1DAT的內(nèi)容進行兩種移位處理,例如輸入的口令為“1234567890”則TEMP1DAT移位前用二進制表示見表1。

動態(tài)偽隨機序列加密法的改進及其應(yīng)用

每個字節(jié)的相同位,循環(huán)左移n位,n是由密碼鑰前3字節(jié)相同位所組成的數(shù)(可以取更多或更少個字節(jié)),例表1中第4位n=(111)2=7,則各位左移后(此時左右方向和表格相同)得如下結(jié)果:

動態(tài)偽隨機序列加密法的改進及其應(yīng)用

再對各字節(jié)做循環(huán)左移m位:m是各字節(jié)低三位所組成的數(shù)(可以取得更多或更少位),例如第0字節(jié)m=(010)2=2,全部左移(字節(jié)的低位向高位移位)后得表3:

動態(tài)偽隨機序列加密法的改進及其應(yīng)用

(4)表移位處理后的TEMP1DAT數(shù)據(jù)添加到1.DAT的尾部。

(5)若1.DAT的長度大于或等于被加密文件的長度,則密碼薄11DAT形成完畢,轉(zhuǎn)(6),否則重復步驟(2)、(3)、(4)、(5)。

(6)用所形成的密碼薄對明文加密(或解密),加密時從被加密文件和密碼薄文件中各取一個字節(jié)進行位異或運算,結(jié)果做為密文的內(nèi)容,解密時再做一次異或運算即可。最后所形成的密碼薄中,最前面的若干字節(jié)就是原始口令,越靠文件末尾的字節(jié)通過運算的次數(shù)越多。為了防止被已知明文破譯法破譯,密碼薄從文件尾部向文件頭部取數(shù)據(jù)。因為從文件頭開始取數(shù)據(jù),頭幾個原始密碼就有可能去加密某個具有固定格式的文件頭(如電子郵件、word文檔、圖象文檔的文件頭),這樣密碼就很容易被破譯。有了密碼就容易產(chǎn)生密碼薄,而從文件尾向前取數(shù)據(jù),則很難破解。而且原始密碼常常最終用不到,因為密碼薄的長度為口令長×2i(i=0,1,2……,),大部分情況是超過被加密文件的長度。

由上述步驟可見密碼簿的生成不僅與密鑰串中多位密碼相關(guān),還與加密過程相關(guān),因而各密鑰位間存在著很強的相關(guān)性。從理論上很容易分析出上述變換是單向的,即只能由用戶密碼推算出實際加密密鑰。不可能由實際密碼簿反向推出用戶密碼。由此產(chǎn)生了一串永不重復且難以推算出后序密碼鑰的密鑰序列流。

三、動態(tài)偽隨機序列加密法的應(yīng)用

以上文件加密原理用BC++311編寫的程序Jm.c如下:

#include〈process1h〉

#include〈conio1h〉

#include〈io1h〉

#include〈stdio1h〉

#include〈fstream1h〉

#include〈math1h〉

voidmove1()//字節(jié)間同位的循環(huán)左移

{

FILE3fp;

inthandle,m;

longl,i,j;

charch,ch1;

unsignedsavel[8],m1,m2;

fp=fopen(“temp1dat”,“r+”);

handle=fileno(fp);

l=filelength(handle);

//文件長度for(i=0;i〈8;i++)

{

fseek(fp,i,0);

save1[i]=fgetc(fp);

}

for(j=0;j〈8;j++)

{

m1=pow(2,j);

m2=255-ml;

m=((save1[0]&m1)〉〉j)+(((save1[1]&m1)〈〈j)〈〈1)+((save1[2]&m1)〉〉j)〈〈2);

for(i=0;i〈l;i++)

{

fseek(fp,i,0);

ch=fgetc(fp);

if(i+m〈=l-1)

{

fseek(fp,i+m,0);

ch1=fgetc(fp);

}

elsech1=save1[(i+m)-l];

ch1=ch1&m1;

ch=(ch&m2)_ch1;

fseek(fp,i,0);

fputc(ch,fp);

}

}

fclose(fp);}

voidmove2()_//字節(jié)內(nèi)循環(huán)左移

{

FILE3fp;

inthandle;

longl,i;

intj;

charch,ch1,ch2;

fp=fopen(“temp1dat”,“r+”);

handle=fileno(fp);

l=filelength(handle);

for=(i=0;i〈1;i++)

{

fseek(fp,i,0);

ch=fgetc(fp);

j=ch&7;

ch1=ch〈〈j;

ch2=ch〉〉(8-j);

ch=ch1+ch2;

fseek(fp,i,0);

fputc(ch,fp);

}

fclose(fp);

}

longhb()__//把temp1dat接到1.dat尾部{

long1;

inthandle;

charch;

ifstreaminfile;

ofstreamoutfile;

outfile1open(“11dat”,ios∷app_ios∷binary);

infile1open(“temp1dat”,ios∷in_ios∷binary);

while(outfile&&infile1get(ch)&&(ch!=0xd)&&(ch!=0xa))outfile1put(ch);

infile1close();

outfile1close();

FILE3fp1;

fp1=fopen(“11dat”,“r+”);

handle=fileno(fp1);

1=filelength(handle);

fclose(fp1);

returnl;__//返回合并后文件的長度

}

voidmycopy()__//復制文件

{

charch;

ifstreaminfile;

ofstreamoutfile;

infile1open(“l(fā)1dat”,ios∷in_ios∷binary);

outfile1open(“temp1dat”,ios∷out_ios∷binary);

while(outfile&&infile1get(ch))outfile1put(ch);

infile1close();

outfile1close();

}

voidjm(FILE3fp1)//用所形成的密碼簿加密文件

{
FILE3fp2;

inthandlel;

longl1,i;

charch1,ch2;

fp2=fopen(“11dat”,“rb”);

handle1=fileno(fp1);

l1=filelength(handle1);

for(i=0;i〈11;i++)

{

fseek(fp1,i,0);

chl=fgetc(fp1);

fseek(fp2,-i-1,2);

ch2=fgetc(fp2);

chl=(ch1ch2);

fseek(fp1,i,0);

fputc(ch1,fp1)

}

fclose(fp2);

}

intinpassword()__//輸入密鑰并把原始密鑰存入文件l1dat中

{

inti=0;

charch;

ofstreamoutfile;

outfile1open(“l(fā)1dat”,ios∷out|ios∷binary);

cout〈〈“inputpassword:”;

ch=getch();

while((ch!=0xd)&&(ch!=0xa))__//按回車結(jié)束口令輸入

{

outfile〈〈ch;

cout〈〈“3”;

ch=getch();

i++;

}

outfile1close();

if(i〈8)return1;

elsereturn0;

}

voidmain(intargc,char3argv[])//主函數(shù)

{

FILE3fpl;

Char3fname;

fp1=fopen(argv[1]1“rb+”);

inthandle;

longl1,l2=0;

handle=fileno(fp1);

l1=filelength(handle);

if(inpassword())

cout〈〈endl;

(〈“Passwordistooshort!〉=8)”〈〈endl;

else

{

while(11>12)

{

mycopy();

move1();

move2();

12=hb();

}

jm(fp1);

}

fclose(fp1);

//關(guān)閉文件、刪除臨時文件fname=“l(fā)1dat”;

unlink(fname);

fname=“temp1dat”;

unlink(fname);

}

該程序的使用方法:在操作系統(tǒng)下直接輸入命令:

Jm〈被加密文件名〉

(含擴展名)InputPassword:

********(在此輸入8個字符以上的口令并回車)

加密和解密執(zhí)行方法相同,執(zhí)行以上程序奇數(shù)次是加密,偶數(shù)次是解密。亦可使用本程序用不同的密碼多次加密,若用多個密碼多次加密各組密碼使用的順序沒有限制,由于有這個優(yōu)點,可將極重要的密碼分別交給幾個人保管,要想解開密碼必須要幾個人同時在場方可實現(xiàn),這種加解密碼方式對于銀行資金匯劃和清算等方面的管理或是公安、國防等方面機密文件的傳送極為有用,特別是計算機網(wǎng)絡(luò)中,一些重要數(shù)據(jù)禁止非法用戶使用,使用這種加密方式可以確保數(shù)據(jù)和文件的安全。

小知識之銀行資金匯劃

簡單的說就是聯(lián)行資金往來,即跨行資金的匯入?yún)R出,既包括系統(tǒng)內(nèi)營業(yè)機構(gòu)之間的資金往來,也包括系統(tǒng)外資金往來。主要業(yè)務(wù)有:匯兌、委托收款(劃回)、托收承付(劃回)、同業(yè)拆借、系統(tǒng)內(nèi)資金調(diào)撥等,以及引伸來的通存通兌、系統(tǒng)內(nèi)他行代記賬等等。