字符型密碼如何隨機(jī)加密與解密

為防止網(wǎng)絡(luò)應(yīng)用系統(tǒng)中字符型密碼被非法用戶通過“跑字典”破譯,并能為網(wǎng)絡(luò)用戶找回丟失的密碼,同時也為遠(yuǎn)程訪問數(shù)據(jù)庫做數(shù)據(jù)同步提供便利,我們提出了一種對字符型密碼采用線性隨機(jī)加密與解密的算法,并用JavaScript語言實現(xiàn)了加密與解密過程。

一、字符型密碼加密現(xiàn)狀分析

密碼加密算法與解密算法有很多,例如著名的MD5加密算法和RSA加密算法等,其中分為可逆與不可逆算法,比如MD5加密算法是不可逆的,經(jīng)MD5加密后的密文無法還原出原始密碼,應(yīng)用系統(tǒng)只能將用戶輸入的原始密碼按MD5加密算法運算后所得到的密文與實現(xiàn)經(jīng)同樣算法所生成的密文進(jìn)行對比方能驗證用戶的合法性,此方法最大的優(yōu)點是任何人都不可能篡改用戶密碼,具備很高的安全性,目前的WEB系統(tǒng)中,對用戶密碼的加密,更多的是應(yīng)用MD5進(jìn)行加密。

采用MD5加密,可以在一定程度上保證用戶密碼的安全性,但也有不足之處,主要表現(xiàn)在以下3個方面:

(1) MD5是單向加密算法,加密后的信息不能解密,用戶丟失密碼后只能重盈密碼,而沒有任何方法找回密碼。

(2)不同的密碼經(jīng)MD5加密后有可能形成同一密文,雖然概率極低,但還是可能出錯,也就是說用戶不用原始密碼而用另一密碼也可能成功登錄。

(3)也是最關(guān)鍵之處,經(jīng)MD5加密后的密文由于無法還原,所以在需要還原原始密碼的應(yīng)用中就不能使用,比如某些網(wǎng)站為了方便用戶下次登陸而設(shè)有保存密碼的功能,一般來說使用瀏覽器的cookie來保存用戶ID和登錄密碼,以便下次用戶登錄時系統(tǒng)自動為用戶填寫用戶ID和登錄密碼,但利用cookie來保存用戶登錄密碼是不安全的,稍懂點網(wǎng)絡(luò)編程的人就可以進(jìn)入用戶的計算機(jī)找出相應(yīng)的cookie來竊取用戶的登錄密碼。所以利用cookie保存用戶登錄密碼時需要經(jīng)過一定的加密處理,并且經(jīng)加密過的密文可以由一定的算法還原出原始密碼。又比如某些分布式網(wǎng)絡(luò)應(yīng)用系統(tǒng)需要同步數(shù)據(jù)庫的內(nèi)容,而訪問遠(yuǎn)程數(shù)據(jù)庫就必須有遠(yuǎn)程數(shù)據(jù)庫的密碼,而這個密碼必須保存在本地而且需要進(jìn)行加密處理,并且加密后的密文還應(yīng)該有一定的算法來還原出原始密碼。因此MD5加密算法在一定的場合下不能滿足需求?;谝陨系男枨?,設(shè)計出一套新的加密算法與解密算法有著重大的意義。

二、字符型密碼隨機(jī)加密算法與解密算法

1、字符型密碼隨機(jī)加密算法設(shè)計思想

基于字符型密碼隨機(jī)加密算法與解密算法的核心功能實質(zhì)上就是字符串的加密與解密。設(shè)計要求有以下三點:

①算法相對簡單,加密與解密運算速度快,消耗機(jī)器資源少。

②在得不到原始算法的基礎(chǔ)上進(jìn)行解密難度很大,無論是暴力破解還是技術(shù)破解都無法在短時間內(nèi)完成解密,只能根據(jù)加密算法的逆運算才能正確解密。

③不擔(dān)心密文泄露,破解者即使拿到多套正確的原始密碼與加密后的密文也無法得出加密參數(shù)。

2、加密算法與密鑰設(shè)計

按以上要求進(jìn)行算法設(shè)計,經(jīng)本人研究發(fā)現(xiàn),絕大多數(shù)用戶密碼都是由計算機(jī)鍵盤上的可見字符組成,而計算機(jī)鍵盤上的可見字符ASC碼范圍為33到126,本文以最長8位密碼為例進(jìn)行算法設(shè)計和實現(xiàn),對于任何一個可見字符,其ASC碼的范圍為33到126,其中包括所有的英文字母,數(shù)字,標(biāo)點符號等。反過來說,對于任何一個在33至126內(nèi)的數(shù)字都對應(yīng)著一個字符。因此設(shè)計出一個線性加密算法,y=ax+b。其中,y為加密后的數(shù)值,x為原始散值,對應(yīng)著密碼中的某一字符,a和b是兩個隨機(jī)數(shù)。

線性加密參數(shù)設(shè)計:由線性加密公式y(tǒng)= ax+b和密文組成原則可知,y的取值范圍為AA到ZZ,換算成十進(jìn)制值為O到675,x為原始密碼的某一位經(jīng)ASC轉(zhuǎn)換而來。所以x的取值范圍為33到126,因此得到如下關(guān)系:其中x,y,a,b皆為正整數(shù)

y=ax+b

yo

x32

另外為了縮小參數(shù)范圍,降低計算量,可以增加設(shè)定

a>0

b>o

由以上關(guān)系解得O<a<6

以下用窮舉法分別求出對應(yīng)于不同a值的b的取值范圍

當(dāng)a=1時,解得O<b<549

當(dāng)a=2時,解得O<b<423

當(dāng)a=3時,解得o<b<297

當(dāng)a=4時,解得O<b<171

當(dāng)a=5時,解得o<b<45

程序設(shè)計中a由系統(tǒng)隨機(jī)生成,范圍為O<a<6,上限是5,下限是1。b的范圍用一個一維數(shù)組限制其上限,[549,423,297,171, 45]分別對應(yīng)不同a值時的取值范圍,下限是1。

3、密文結(jié)構(gòu)設(shè)計

密文結(jié)構(gòu)設(shè)計:密文由32位26進(jìn)制數(shù)組成,用大寫字母A到Z表示每一位,其中A到Z分別表示十進(jìn)制的0到25,原始密碼字符串最大長度為8位,每一位經(jīng)線性加密后用2個大寫字母表示其加密密文,因此完全表示最長密碼只需16位,根據(jù)上面分析所得的ab參數(shù)范圍,設(shè)計用1位表示隨機(jī)線性加密系數(shù)a,1位表示原始密碼字符串實際長度(字符個數(shù)),2位表示b,總共用20位表示完所有信息,剩下12位作為隨機(jī)混淆處理位,分別插入前面11個(22位)信息之間,并在密文首尾各加一位隨機(jī)值,以增加破解難度。此外,為了防止大多數(shù)用戶密碼長度相同(比如大多取8位)時所生成的長度加密位相同,長度位也用采用加密處理,本例用參數(shù)a的十進(jìn)制值加上實際長度值所得結(jié)果再經(jīng)26進(jìn)制轉(zhuǎn)換而成,這樣得到的原始密碼長度也是個隨機(jī)數(shù),即使兩個用戶密碼長度相同但在密文中對應(yīng)的長度位也會不同。讓破解者找不到任何規(guī)律。當(dāng)原始密碼長度小于8位時,用隨機(jī)26進(jìn)制直補(bǔ)齊8位。解密時根據(jù)長度位計算結(jié)果舍奔隨機(jī)補(bǔ)充部分。本例加密算法采用如下密文結(jié)構(gòu):

密文位散 相應(yīng)位數(shù)的值

0: 隨機(jī)值

1-2: 加密后的線性加密參數(shù)b

3: 隨機(jī)值

4: 加密后的原始字符串文長度

5: 隨機(jī)值

6-7: 加密后的原始字符串第1位

8: 隨機(jī)值

9-10:加密后的原始字符串第2位

11: 隨機(jī)值

12-13:加密后的原始字符串第3位

14: 隨機(jī)值

15-16:加密后的原始字符串第4位

17: 隨機(jī)值

18-19:加密后的原始字符串第5位

20: 隨機(jī)值

21-22:加密后的原始字符串第6位

23: 隨機(jī)值

24-25:加密后的原始字符串第7位

26: 隨機(jī)值

27-28:加密后的原始字符串第8位,原始密碼不足8位的用隨機(jī)值得補(bǔ)齊8位

29: 隨機(jī)值

30: 加密后的線性加密參數(shù)a

31: 隨機(jī)值

4、加密算法、解密算法流程

圖1是本算法的加密流程,圖2是本算法的解密流程,下面分別對加密、解密過程進(jìn)行說明

(1)加密過程

以字符型密碼“Dca8? d3@”為例說明加密過程:首先生成隨機(jī)加密參數(shù)a(B的取值范圍為1-5)。如本例中a=4,然后進(jìn)行下面的流程:

(1)根據(jù)生成的a值查表(程序中用數(shù)組表示)得到參數(shù)b的最大值maxb,然后在1-maxb之間生成隨機(jī)參數(shù)b。如本例中b=92。

(2)取明文字符串長度I,然后加參數(shù)a,生成長度位L。如本飼中L=4+8=12。

(3)填寫密文前7(0—6)位,方法為,第0位隨機(jī)生成,本例是Z,第1,2位為加密參數(shù)b的26進(jìn)制值,本例為D0-92,第3位為混淆隨機(jī)值,本例為Q,第4位為原字符串長度加參數(shù)a所得結(jié)果的26進(jìn)制值,本例為4+8=12=M。第5位為混淆隨機(jī)值,本例為0。

(4)分別取明文中的每一個字符(如例1中第一字符D)進(jìn)行ASC碼轉(zhuǎn)換,如D的ASC值為68,然后將此ASC碼值經(jīng)線性加密公式y(tǒng)=ax+b得出加密后的數(shù)值,此例中,Y=ax+b=4*68+92=364。

(5)將第4步得到的數(shù)值轉(zhuǎn)換成兩位26進(jìn)翩值,如t026 (364)=OA。

(6)添加一位隨機(jī)大寫字母,用于混淆,此例中為H。

(7)循環(huán)做(5)一(7),本例得到SUNSMMMEDN-GRSYYLKJNKX。

(8)假如字符原字符串長度小于8,則隨機(jī)補(bǔ)充到8位,每差一位補(bǔ)齊3個隨機(jī)值。本例中長度正好位8位,所以不補(bǔ)充。

(9)填寫加密參數(shù)a的26進(jìn)制值,本例為a=4=E。

(10)生成隨機(jī)混淆值,本例為L。

則本例中密文為:ZDOQMOOAHSUNSMMMEDN-GRSYYLKJNKXEL。

因為加密參數(shù)a、b是隨機(jī)的,所以同一明文可以得到不同的密文,如表1所示。

(2)解密過程

以密文“OQMOOAHSUNSMMMmNGRSYYLKJN-KXEI”為例說明解密過程:

(1)讀出密文,并檢查密文結(jié)果,檢查內(nèi)容為密文長度必須為32位,密文必須全由大寫字母組成,否則密文有錯,不是正常加密所得密文。

(2)取密文第30位(密文第一位為0位)值,本例為E,轉(zhuǎn)換為10進(jìn)制數(shù)為4,得加密參數(shù)a為4。

(3)取密文第4位值,本例為M,轉(zhuǎn)換為10進(jìn)制值為12,減去第二步中得到的a值,得到原始字符串(明文)的長度,本例為12-4=8。

(4)檢查第(3)步中得到的長度,假如長度值小于1或大于8則密文有錯,報告錯誤并停止運行。

(5)取密文第1,2位,本例為DO,轉(zhuǎn)換為十進(jìn)制值為92,得到加密參數(shù)b。

(6)從密文的第6位開始循環(huán)取3位(循環(huán)次數(shù)為第3步中得到的長度,本倒為8)。然后取3位中的前兩位進(jìn)行十進(jìn)制轉(zhuǎn)換,本例循環(huán)8次,分別得到OA= 364,SU,SM.ME,NG.SY,LK,NK等。

(7)由加密公式y(tǒng)-ax+b得解密公式為x-(y-b)/a,分別算出第6步得到的值,本例中第一個字符解密結(jié)果為x-(y-b) /a- (364-92) /4-68。

(8)經(jīng)ASC碼逆轉(zhuǎn)換得到第(7)步所的數(shù)的字符。

(9)連接循環(huán)解出的每一位得到解密結(jié)果,本例為Dca8? d3@。

同一明文的不同次數(shù)加密得到的不同密文,經(jīng)過解密后可以得到相同的明文,如表2所示。

三、字符型密碼如何隨機(jī)加密與解密

本文用JavaScript語言實現(xiàn)了加密與解密過程,其中設(shè)計了以下函數(shù);

十進(jìn)制散轉(zhuǎn)26進(jìn)制函數(shù):t026 (x),作用,返回十進(jìn)制數(shù)x的26進(jìn)制值。

該函數(shù)根據(jù)傳人參數(shù)x生成26進(jìn)制值。用符號A至Z表示26進(jìn)制的0到25,根據(jù)密文組成規(guī)則,該函數(shù)至少返回兩位值,例如t026 (0)=AA。

26以內(nèi)的十進(jìn)制數(shù)轉(zhuǎn)單個26進(jìn)制字符函數(shù):toSg26(x)

該函數(shù)傳入?yún)?shù)x的范圍在0-25,函數(shù)返回單個26進(jìn)制字符,主要用于表示密文中單個隨機(jī)混淆值和參數(shù)a和字串長度值等,例如to\Sig26 (3)=D。

26進(jìn)制轉(zhuǎn)十進(jìn)制函數(shù):tol0 (s),作用為把26進(jìn)制字符串轉(zhuǎn)換成十進(jìn)制數(shù)返回,參數(shù)s為26進(jìn)制字符串,例如tol0 (BC)=28。

隨機(jī)數(shù)產(chǎn)生函數(shù):Random(rrun,max),作用為產(chǎn)生參數(shù)nun到max內(nèi)的隨機(jī)數(shù),包括nun和max。

加密主函數(shù):Encryption (s),作用為對于任何傳入?yún)?shù)(小于等于8位)。返回32位26進(jìn)制字符串。

解密主函數(shù):Decryption (s),對于用加密模塊加密后的32位字符串,解密還原出加密以前的原址字符串。

圖3為密碼"Dca8? d3@"的加密、解密示例。

小知識之MD5加密

MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest開發(fā)出來,經(jīng)MD2、MD3和MD4發(fā)展而來。