動態(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。

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

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

(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)他行代記賬等等。










