基于線性同余的不定態(tài)結(jié)果加密算法

傳統(tǒng)的加密算法往往比較復(fù)雜而難以掌握,復(fù)雜的加密算法往往大大增加程序的復(fù)雜度,同一算法加密結(jié)果不變又降低了加密結(jié)果的抗破解能力,我們經(jīng)過(guò)對(duì)線性同余序列數(shù)據(jù)特征的研究以及在實(shí)踐中經(jīng)過(guò)長(zhǎng)時(shí)間摸索與檢測(cè),我們?cè)诨诰€性同余序列的基礎(chǔ)上提出了一種實(shí)用的加密方法,簡(jiǎn)單、容易實(shí)現(xiàn);在盡量不損失加密強(qiáng)度的情況下提高了加密和解密速度,同時(shí),同一輸入得到的加密結(jié)果輸出不同,一定程度上增強(qiáng)了抗破解能力。

一、偽隨機(jī)數(shù)與隨機(jī)序列

真正意義上的隨機(jī)數(shù)(或者隨機(jī)事件)在某次產(chǎn)生過(guò)程中是按照實(shí)驗(yàn)過(guò)程中表現(xiàn)的分布概率隨機(jī)產(chǎn)生的,其結(jié)果是不可預(yù)測(cè)的,是不可見(jiàn)的。而計(jì)算機(jī)中的隨機(jī)函數(shù)是按照一定算法模擬產(chǎn)生,其結(jié)果是確定的,是可見(jiàn)的,由此可見(jiàn),這個(gè)可預(yù)見(jiàn)的結(jié)果其出現(xiàn)的概率是100%,所以用計(jì)算機(jī)隨機(jī)函數(shù)所產(chǎn)生的“隨機(jī)數(shù)”并不隨機(jī),是偽隨機(jī)數(shù),偽隨機(jī)數(shù)有2個(gè)特點(diǎn):

1、在某一整數(shù)范圍內(nèi)產(chǎn)生足夠多的隨機(jī)數(shù)的時(shí)候數(shù)據(jù)在該范圍內(nèi)均勻分布,也就是說(shuō)取到各個(gè)整數(shù)值的機(jī)會(huì)均等。

2、連續(xù)產(chǎn)生的隨機(jī)數(shù)在較大范圍內(nèi)不能序列重復(fù)。

這里的序列重復(fù)是指不應(yīng)該像循環(huán)小數(shù)一樣存在循環(huán)節(jié),當(dāng)然,絕大多數(shù)隨機(jī)數(shù)產(chǎn)生算法還是有循環(huán)節(jié)的,但這個(gè)循環(huán)節(jié)往往非常長(zhǎng)。

鑒于這2個(gè)特點(diǎn)非常適合用作加密。任何數(shù)據(jù)經(jīng)過(guò)隨機(jī)序列掩碼產(chǎn)生的結(jié)果也將具備如上的數(shù)據(jù)特征,掩碼后的結(jié)果在不知道掩碼序列的情況下將很難逆推回原序列,我們就以這種思路來(lái)構(gòu)造加密算法。

二、大數(shù)同余

快速產(chǎn)生隨機(jī)序列是提高本方法加密速度的關(guān)鍵,我們研究了一下Visual C++,Turbo C和Delphi的隨機(jī)序列產(chǎn)生辦法,它們采用的都是大數(shù)的線性同余序列。設(shè)m是一個(gè)給定的正整數(shù),如果2個(gè)整數(shù)a、b用m除,所得的余數(shù)相同,則稱(chēng)a、b對(duì)模m同余。所謂線性同余法(又叫混合同余法),就是這樣的一個(gè)公式:

基于線性同余的不定態(tài)結(jié)果加密算法
經(jīng)前人研究表明,在M=2q的條件下,參數(shù)A,C,X[O]按如下選取,周期較大,概率統(tǒng)計(jì)特性好。

基于線性同余的不定態(tài)結(jié)果加密算法
X[O]為任意非負(fù)數(shù)。

同余序列總是進(jìn)入一個(gè)循環(huán),這是一個(gè)事實(shí),最終必定在N個(gè)數(shù)之間無(wú)休止的重復(fù)循環(huán)。

三、新的隨機(jī)數(shù)發(fā)生器

如上所述,即便采用唯一的隨機(jī)序列發(fā)生器產(chǎn)生的隨機(jī)序列進(jìn)行掩碼,也可以得到均勻分布的加密結(jié)果,當(dāng)然這樣的加密在預(yù)知加密算法的前提下對(duì)密碼進(jìn)行碰撞還是很容易解密的,這就需要迸一步的增強(qiáng)密碼空間,加大碰撞難度。這里可以利用線性同余算法對(duì)于不同的因子可以產(chǎn)生不同的隨機(jī)序列這一特點(diǎn),使加密過(guò)程和密碼長(zhǎng)度關(guān)聯(lián)起來(lái),構(gòu)造一個(gè)新的隨機(jī)數(shù)發(fā)生器,它的因子是密碼相關(guān)的。

很明顯,常見(jiàn)密碼是可視字符的組合,為了討論方便,不妨按照常見(jiàn)的密碼設(shè)置:英文字母,數(shù)字和下劃線的組合,稱(chēng)為密碼空間,這樣密碼就可以表示為函數(shù):

基于線性同余的不定態(tài)結(jié)果加密算法

符號(hào)&表示連接。

以上為因子的隨機(jī)序列表示為函數(shù)RandomSequence(x),根據(jù)隨機(jī)序列的定義,RandomSequence(x)為x相關(guān)的整數(shù)有序集合,RandomSequence(x)_Z且當(dāng)ri≠X2時(shí)有andomSequence(x1)≠RandomSe-quence(x2)。

定義函數(shù)Select( X1,X2,X3,...,Xn,m)為X1∪_X2 ∪_X3 ∪...∪Xn到{X|X∈X1 ∪X2 ∪X2∪...∪Xn)的一個(gè)映射,其中X1~Xn為有序集合,m∈Z+,表示順序的從X1~Xn取第1個(gè)值,取到墨后返回X1繼續(xù)取X1的第2個(gè),X2的第2個(gè)以此類(lèi)推,直到取m個(gè)值為止。

對(duì)于密碼Mix(x1,x2,x3,…,xn),隨機(jī)序列就是Select(RandomSequence(X1),RandomSequence(X2),RandomSequence(X3),…,RandomSequence(Xn)m)。m的取值和被加密對(duì)象的長(zhǎng)度相關(guān),很明顯,如果原隨機(jī)序列周期為p,采用這個(gè)方法后實(shí)際上隨機(jī)序列的周期將變?yōu)閜n,同時(shí),要碰撞出這樣一個(gè)序列的話(huà)需要驗(yàn)證的密碼要在71個(gè)密碼空間的笛卡爾乘積中選取,即便在當(dāng)前的設(shè)定下.1個(gè)密碼空間的長(zhǎng)度為63(大小寫(xiě)字母,下劃線和0~9的數(shù)碼),九個(gè)字符長(zhǎng)度的密碼對(duì)應(yīng)的密碼數(shù)量將為63n,只要長(zhǎng)度足夠(實(shí)際上4位的密碼634 -15 752 961,就已經(jīng)上千萬(wàn)了),窮舉破解在時(shí)間上應(yīng)該是不可能的。

四、加密與解密

在隨機(jī)序列已經(jīng)構(gòu)造的前提下,加密解密是一個(gè)非常簡(jiǎn)單的過(guò)程,這里為了實(shí)用性我們對(duì)加密對(duì)象做了以下區(qū)分:

A.密文可視的;

B.密文可視無(wú)關(guān)的。

對(duì)于A類(lèi),是指存儲(chǔ)在文本文件或數(shù)據(jù)庫(kù)中的數(shù)據(jù)片段,這類(lèi)數(shù)據(jù)往往有些格式要求,比如加密結(jié)果不能包含0或者其他的特定字符,但可用范圍往往可以界定.B類(lèi)就是沒(méi)有這種考慮的加密對(duì)象,很明顯,一個(gè)加密算法對(duì)不同的對(duì)象進(jìn)行區(qū)分不太合適,還不能增加算法的復(fù)雜度;

I.以字節(jié)為加密單位進(jìn)行換碼加密。

Ⅱ.換碼的范圍由加密者指定。

這樣就將A,B兩類(lèi)對(duì)象又整合為同一類(lèi)對(duì)象了,為了適應(yīng)這種情況,在Select(RandornSequence(x1),RandomSequence(x2),RandomSequence(x3),…,RandomSequence(xn)m)中取值后需要對(duì)相應(yīng)范圍取模,假定給定范圍為[a,b],原文k1 k2k3…km,密碼Mix(X1,X2,X3,…,Xn),Select( RandomSequence(x1),
RandomSequence(x2),RandomSequence (x3),…,RandomSequence(xn),優(yōu))中取的第j個(gè)值為Radj,令:

基于線性同余的不定態(tài)結(jié)果加密算法

則換碼加密函數(shù)為:

基于線性同余的不定態(tài)結(jié)果加密算法

換碼解密函數(shù)為:

基于線性同余的不定態(tài)結(jié)果加密算法

加密算法類(lèi)似于補(bǔ)碼運(yùn)算,應(yīng)該不需要做解釋?zhuān)梢院?jiǎn)單驗(yàn)證。

原文為'A'(Ascll碼為65),范圍為[32,127](ASCII可視范圍),則Rddj不妨假設(shè)為100,則rj=100 mod (127-32+1) -4。

加密

(65-32+4) mod (127-32+1)+32=37 mod 96+32=69

65變成了69。

解密

(69-32+(127-32+1-4)) mod (127-32+1)+32-129 mod 96 +32-65

69變回了65。

本加密算法已經(jīng)使用VC 2008實(shí)現(xiàn),使用一般字符串測(cè)試,范圍設(shè)定為[32,127],數(shù)組測(cè)試使用范圍[0,255],結(jié)果如圖1。

基于線性同余的不定態(tài)結(jié)果加密算法

從圖1可以看出,掩碼后失去了原文的一切特征,即便原文為重復(fù)字符,掩碼后內(nèi)容也完全不同,從密文測(cè)度原文是不可能的.對(duì)這一點(diǎn),筆者特別針對(duì)圖片做了一個(gè)測(cè)試,采用2幅圖片,一幅純白(rgb(255,255,255)),一幅為復(fù)雜圖像,測(cè)試結(jié)果如圖2。

基于線性同余的不定態(tài)結(jié)果加密算法

基于線性同余的不定態(tài)結(jié)果加密算法

從圖2和圖3可以看出,即便2幅圖的復(fù)雜程度完全不同,掩碼結(jié)果也沒(méi)有什么太大區(qū)別并且完全看不出原圖效果,在未受到攻擊時(shí),可以精確還原原圖像,使用GetTickCount64函數(shù)測(cè)試,沒(méi)做任何優(yōu)化的情況下一幅256k 24位真彩圖片文件加密時(shí)間為16 ms,速度已經(jīng)很快了。

五、關(guān)于不定態(tài)結(jié)果

一般情況下,對(duì)于加密算法f以及明文x及其密碼p,其加密結(jié)果R=f(x,p)是唯一的,這樣的話(huà)如果有密文,在已知加密算法的情況下可以通過(guò)逆推及碰撞的方法去猜測(cè)明文,所以一般的加密方法要求盡量采用長(zhǎng)密碼串以擴(kuò)大碰撞空間,達(dá)到防破解的目的,筆者的想法是在原文、密碼的加密基礎(chǔ)上在密文中增加一個(gè)擾動(dòng)量,其加密規(guī)則如下:

1、定義擾動(dòng)量Kn為隨機(jī)獲取的n個(gè)字節(jié)集合。

2、原加密密碼x為一個(gè)不定長(zhǎng)度的字節(jié)集合,加密前利用Kn使用前述算法p對(duì)密文進(jìn)行擾動(dòng),變換為:

X=p(x,Kn)

3、針對(duì)前述算法,使用X對(duì)原文S加密形成初步加密結(jié)果r=p(S,X)。

4、將Kn合并到r的固定位置形成最終密文R=Kn∪r。

解密時(shí):

1、對(duì)密文R切除指定位置的n個(gè)字節(jié)得到密文r和擾碼Kn。

2、使用Kn對(duì)密碼z進(jìn)行擾動(dòng)變換(同加密)X=p(x,Kn)。

3、使用X對(duì)r進(jìn)行前述加密變換的逆變換得到原文S=p-1(r,X).

過(guò)程比較簡(jiǎn)單,其優(yōu)點(diǎn)在于擾碼可以隨意獲取,而隨擾碼的不同加密結(jié)果在形式上也隨之變換,從密文難以推導(dǎo)原文。

小知識(shí)之隨機(jī)序列

隨機(jī)序列(random sequence),更確切的,應(yīng)該叫做,隨機(jī)變量序列。隨機(jī)變量序列,也就是隨機(jī)變量形成的序列。有時(shí)候?yàn)榱撕?jiǎn)稱(chēng),省略了變量二字。