陳 飛,劉建東,胡輝輝,劉 博,張世博
(1.北京石油化工學(xué)院 信息工程學(xué)院,北京 102617;2.北京化工大學(xué) 信息科學(xué)與技術(shù)學(xué)院,北京 100029)
傳統(tǒng)圖像加密算法是把密文和密鑰交給一位管理者管理,這樣帶來了如下不便:若管理者不幸遇難或者丟失密鑰(密文),那么這個秘密信息再也無法恢復(fù);由于管理者是一個人,大大增加了密鑰(密文)泄露或被竊的風(fēng)險。現(xiàn)有的圖像分存體制解決了上述傳統(tǒng)加密算法的缺點(diǎn),降低了密鑰(密文)管理中的風(fēng)險。圖像分存這一思想主要來源于密碼學(xué)中秘密共享方案。
現(xiàn)有的圖像分存方案大多數(shù)都是基于拉格朗日差值公式的。但是,圖像分存體制本身存在著相鄰像素點(diǎn)相關(guān)性大,密碼學(xué)特性較差的問題[1-3]。文獻(xiàn)[4]提出了利用貓映射對分存圖像進(jìn)行置亂處理,解決了相鄰像素點(diǎn)相關(guān)性大的問題,但是沒有從根本上改變各個像素點(diǎn)值的大小,無法使各個像素點(diǎn)均勻遍歷整個空間。
混沌系統(tǒng)是一種極其復(fù)雜的動力學(xué)系統(tǒng),具有高度的初值敏感性。高維混沌系統(tǒng)具有復(fù)雜度高,相鄰序列之間相關(guān)性較低的特性,實(shí)用于圖像加密。文獻(xiàn)[5]提出了利用混沌映射和門限方案對圖像進(jìn)行加密分存,但由于計算效率問題,很難實(shí)現(xiàn)大規(guī)模分存。圖像分存算法具有高度并行化計算體制,隨著計算機(jī)集群技術(shù)的發(fā)展,集群化計算為提高圖像加密分存算法的效率提供了可實(shí)施的條件[6-9]。
目前,運(yùn)用Spark框架進(jìn)行分布式計算已經(jīng)成為一種主流。2009年,Spark平臺是由AMPLab實(shí)驗(yàn)室提出的概念。Spark平臺在集群上計算效率高,易于實(shí)現(xiàn)[10,11]。
針對上述問題,提出了一種基于Spark平臺的圖像加密分存算法。將基于拉格朗日差值公式圖像分存算法中的分存ID作為產(chǎn)生加密序列初始值的密鑰,對分存圖像分別進(jìn)行加密,最后在Spark平臺上實(shí)現(xiàn),提高了圖像加密分存的效率。
帳篷映射是一種極其簡單的混沌映射,帳篷映射具有高遍歷性、類隨機(jī)性。實(shí)數(shù)域帳篷帳篷映射通過拉伸、折疊操作將計算域控制在[0,1]內(nèi),實(shí)數(shù)域帳篷映射表達(dá)式如下
(1)
式中:參數(shù)α為外部控制參數(shù)。α大小決定了映射中心點(diǎn)的位置,只有當(dāng)其大小為0.5時,該映射才被稱為標(biāo)準(zhǔn)帳篷映射。
由于在實(shí)數(shù)域帳篷映射要進(jìn)行浮點(diǎn)運(yùn)算,這樣大大增加了計算時間。為了提高計算效率,將實(shí)數(shù)域帳篷映射轉(zhuǎn)化為整數(shù)域帳篷映射[12],如式(2)所示
(2)
式(2)解決了式(1)由于浮點(diǎn)運(yùn)算過多而帶來的計算量過大的缺點(diǎn),但是由于計算機(jī)截斷誤差的存在,式(2)的整數(shù)模型不免出現(xiàn)了短周期現(xiàn)象。為了解決這一問題,在模型中提出了動態(tài)這一概念,且一維模型維數(shù)低,密碼學(xué)特性較差、復(fù)雜度低,將一維整數(shù)模型拓展為二維整數(shù)動態(tài)帳篷映射,如式(3)所示
(3)
其定義域?yàn)?/p>
其中
gi=(xi+mi)mod2n
hi=(yi+ni)mod2n
在式(3)中,mod為取模運(yùn)算,mi和ni分別為橫軸動態(tài)參量和縱軸動態(tài)參量。通過控制mi和ni的大小來控制橫軸和縱軸移動的偏移量。式(3)中,隨著迭代的進(jìn)行,xi+1的值不僅由xi的值決定,yi的值也會對其取值產(chǎn)生影響。同樣,yi+1的值也不僅由yi的取值決定,同樣xi也會對其產(chǎn)生影響。通過這種機(jī)制,大大提高了模型的復(fù)雜度,同時也減小了相同軸之間相鄰點(diǎn)的相關(guān)性。
以式(3)作為耦合函數(shù),在式(3)加入全耦合映像格子模型,耦合映像格子模型如下
xn+1(1)=f(xn(L))+f(xn(1))+f(xn(2))
(4)
當(dāng)i>1
xn+1(i)=f(xn(i-1))+f(xn(i))+f(xn(i+1))
(5)
邊界條件為
f(xn(L+1))=f(xn(1))
目前大多數(shù)圖像(K,N)分存方案都是基于1979年shamir提出的基于拉格朗日插值公式的有限域秘密共享算法。有限域內(nèi)的拉格朗日插值公式為
f(x)=(S+r1x+r2x2+r3x3+…+rK-1xK-1)modq
(6)
式中:S為需要分存的秘密信息,x為圖像分存ID,r1,r2,r3,…,rK-1為隨機(jī)整數(shù)參數(shù),N為分存份數(shù),K為門限次數(shù),且K需要小于等于N,q為素數(shù)。
將秘密信息S分存時,根據(jù)式(6),構(gòu)造如下方程組
(7)
方程組(7)中,x1,x2,x3,…,xN為分發(fā)給密鑰管理者的公開分存ID,且這N份公開ID的值不能重復(fù)。在分存過程中,只需將根據(jù)方程組所求的 (x1,f(x1)), (x2,f(x2)), (x3,f(x3)), …, (xN-1,f(xN-1)) 發(fā)給相應(yīng)的密鑰管理者。利用拉格朗日插值公式可以將式(6)轉(zhuǎn)化為下式
(8)
(9)
由式(9)可知,只要大于等于K個密鑰提供出它們所管理的 (xi,f(xi)), 就能通過式(9)恢復(fù)出秘密S。當(dāng)少于K個人時,則無法恢復(fù)秘密S。
Spark是基于HadoopMapReduce的基礎(chǔ)上提出的一種高效的分布式集群計算平臺,不僅擁有Hadoop的所有優(yōu)點(diǎn),而且由于Spark是基于內(nèi)存運(yùn)算的,各線程任務(wù)可直接在內(nèi)存中讀取數(shù)據(jù),省去了從磁盤讀取和存儲數(shù)據(jù)I/O的時間,因此提高了Spark處理數(shù)據(jù)的效率。Spark的核心是彈性分布式數(shù)據(jù)集(resilient distributed datasets,RDD)。RDD主要支持兩種類型操作,即Transformation和Action。Transformation操作包含Map,filter,flatMap等,將現(xiàn)有的數(shù)據(jù)集轉(zhuǎn)換成新的數(shù)據(jù)集。Action操作包含reduce,collect等,將Transformation中的數(shù)據(jù)集進(jìn)行運(yùn)算。Transformation操作是不會馬上提交給Spark集群執(zhí)行的,只會記錄需要這樣的操作,只有當(dāng)Action操作進(jìn)行時,才會真正啟動計算過程進(jìn)行計算,大大提高了Spark運(yùn)行效率。且Spark提供Java,scala,Python等語言接口,開發(fā)者可以根據(jù)自己的需要決定使用哪一種語言[13-15]。
基于拉格朗日差值公式的高度并行性,提出了一種基于Spark平臺的彩色圖像加密分存方案。具有密鑰空間大、安全性高、密碼學(xué)特性好、加密效率高等特性。
采取二維整數(shù)耦合帳篷映射模型,通過耦合的方式生成多條二維混沌序列。分存方案采取基于伽羅域拉格朗日插值公式的(K,N)圖像分存方案,對每個分存生成的圖像運(yùn)用不同的混沌序列進(jìn)行加密。若分存份數(shù)N的值過大,需要迭代產(chǎn)生混沌序列是非常多的。且上述二維整數(shù)帳篷映射每迭代一次,需要判斷4次,也就是說,隨著分存份數(shù)N的增大,加密分存時間也會大大增加。將N份ID值分塊,對于不同的ID值,對圖像進(jìn)行分存加密。這樣可以有效解決由于分存份數(shù)過多而帶來的加密分存時間過長的問題,具體加密分存算法如下:
(1)讀取圖像RGB矩陣,并將RGB矩陣,并將其廣播。
(2)將所有N份ID值放到一個集合中,并分塊。
(3)對于每個分塊中ID值,通過方程組(10)產(chǎn)生L(L為耦合映像格子格點(diǎn)度,本次實(shí)驗(yàn)格點(diǎn)長度取條二維序列初始值(x1,y1),(x2,y2),(x3,y3),…,(xL,yL), 式(10)如下所示
(10)
式中:kj為第j個ID, (x(0,i),y(0,i)) 為第i個格點(diǎn)序列的初始值,通過上述操作,使得每個ID值對產(chǎn)生的加密序列的初始值產(chǎn)生影響,混沌模型有著極強(qiáng)的初值敏感性,即每個ID值產(chǎn)生的L條混沌序列是不一樣的,增加了加密安全性。
(4)將步驟(3)中產(chǎn)生的序列初始值 (x1,y1),(x2,y2),(x3,y3),…,(xL,yL) 作為二維整數(shù)耦合帳篷映射的初始值。二維整數(shù)耦合帳篷映射在時間上進(jìn)行迭代、在空間上進(jìn)行耦合,產(chǎn)生L條二維整數(shù)混沌序列,序列值在(0,255)之間分布。為了提高加密分存的效率,減少無用的序列出現(xiàn),迭代次數(shù)為 (M*N)/4+1次,M為圖像寬度,N為圖像高度。
(5)對原始圖像進(jìn)行分存,分存操作是基于上述式(7)(拉格朗日插值公式的),對于ID值分塊中,將原始圖像每個像素點(diǎn)的RGB這3個像素值分別作為秘密信息S方程組進(jìn)行分存,可以得到Rxi,Gxi,Bxi這3個分存矩陣,xi為分存ID。
(6)準(zhǔn)備好加密序列和原始圖像RGB三矩陣分存完之后,需要對分存得來的Rxi,Gxi,Bxi三矩陣進(jìn)行加密。從步驟(4)產(chǎn)生的4條長度為 (M*N)/4+1 的二維整數(shù)序列選取M*N格點(diǎn),并把其重構(gòu)為一條長度M*N的二維序列。由于在彩色圖像中,人眼對R分量直覺感官最為直接,所以采取在加密時,人眼對R分量直覺感官最為直接,所以用生成的二維整數(shù)序列中的x值直接與分存矩陣中的R分量像素值相加取模251,用y值分別與G,B分量相加取模251,最終得到加密分存圖像
Spark是一個分布式計算框架,其主要工作原理為當(dāng)我們提交完一個作業(yè)后,會啟動driver,driver向集群管理器申請作業(yè)所需要的資源,即Executor進(jìn)程。然后在Exe-cutor進(jìn)程運(yùn)行task。在本文方案中,運(yùn)用到的Transformations算子為map算子,map可以將原RDD中的每個數(shù)據(jù)通過自定義映射轉(zhuǎn)化為一個新的元素,形成一個新的RDD。Action算子為collect,collect將Spark中的RDD返回為一個數(shù)組。
本文所設(shè)計的基于Spark平臺的圖像加密分存算法流程如圖1所示。
圖1 圖像加密分存方案流程
4.2.1Broadcast函數(shù)與分塊算法
讀取圖像RGB矩陣,并利用Broadcast函數(shù)將其廣播到各個節(jié)點(diǎn)中,將所有的分存ID值放入一個集合中,在分片時,為了讓所有Executor進(jìn)程都能均勻的分配到任務(wù),設(shè)集群包含有M個Executor,通過Sparkcontext中Parallelize函數(shù)將ID集合分片并生成RDD。通過Parallelize可以設(shè)置slices的數(shù)目(分塊的數(shù)目),本次實(shí)驗(yàn)slice的數(shù)目為M。Spark會在每個slice中起一個task,自行分給Wor-ker中的Executor處理。
操作1:分片算法
Parallelize()函數(shù)
輸入:ID集合S
輸出:分塊RDD
4.2.2Map算子操作
在經(jīng)過分片和廣播操作后,每個Worker對部分ID進(jìn)行圖像加密分存。在每次圖像加密分存時,首先根據(jù)RDD中ID值對圖像矩陣imi進(jìn)行基于拉格朗日插值公式分存生成imi1。然后,由ID值生成整數(shù)混沌系統(tǒng)的初始值,進(jìn)而生成L條二維混沌加密序列x,進(jìn)而對分存圖像進(jìn)行步驟f加密。輸出為K/V對,K為分存IDi,V為每個ID生成的加密分存圖像imi2。
操作2:加密分存算法
map()
輸入:ID值
輸出:key,imi2
imi2=(x+imi1)mod251
具體map操作流程如圖2所示。
圖2 map并行加密分存
等待map中所有計算完成之后,運(yùn)用collect將所有的(Key,value)返回為一個數(shù)組。
以512*512的標(biāo)準(zhǔn)測試圖像,進(jìn)行本文設(shè)計的算法(7,10)圖像加密分存算法,如圖3所示。
圖3 原始圖像與分存圖像
由圖3可知,分存加密圖像為無序亂碼圖,可以隱藏原始圖像所包含的大部分信息。
5.1.1 密鑰空間分析
圖像并行加密分存方案的加密安全性主要依賴于二維整數(shù)耦合帳篷映射混沌系統(tǒng)的安全性。密鑰空間大小是衡量一個加密模型安全性的重要指標(biāo)之一,本文采取全耦合作為耦合方式,每個格點(diǎn)的初始值在[0,255]分布,格點(diǎn)數(shù)為L,密鑰空間大小即為28*L, 理論上耦合映像格子格點(diǎn)數(shù)L可以為拓展為無限大,幾密鑰空間為無限大,能夠抵抗暴力破解密鑰攻擊。
5.1.2 抗統(tǒng)計攻擊分析
(1)直方圖分析
圖4給出了512*512Lena彩色圖像的原始圖像和經(jīng)過本文算法對Lena圖進(jìn)行(7,10)加密分存后的灰度直方圖。
圖4 原圖與加密分存圖像直方圖
由圖4可知,原始圖像RGB這3個分量的直方圖出現(xiàn)了明顯的毛刺,分布極不均勻。各分存圖像的直方圖都呈現(xiàn)均勻分布,能夠很好隱藏原始圖像的信息。
(2)信息熵分析
圖像的信息可以用來表征圖像像素分布的混亂度。若圖像的像素值呈均勻分布,則圖像包含的信息量較少,其信息熵越大,反若分布不均勻,其信息熵越小。圖像像素值在[0.255]分布,共有28種可能,所以圖像像素的信息熵最大值為8。信息熵計算公式如下
(11)
式中:P(Si) 像素點(diǎn)在[0,255]區(qū)間的概率,表1給出了512*512標(biāo)準(zhǔn)測試Lena圖像明文和加密分存的圖像的信息熵。
表1 信息熵
如表1所示,原始圖像RBG三分量矩陣信息熵均在7左右分布,包含了大量的圖像信息,而加密分存圖像的RGB三分量的信息熵均在7.97左右分布,基本接近于理想值8。就信息熵而言,本文所設(shè)計的加密分存算法得到的加密分存圖基本接近于理想加密圖像。
Spark平臺主要包括Master節(jié)點(diǎn)和Worker節(jié)點(diǎn)。Master節(jié)點(diǎn)主要負(fù)責(zé)對整個集群的任務(wù)監(jiān)控和調(diào)用,Worker節(jié)點(diǎn)負(fù)責(zé)任務(wù)的計算。
本次實(shí)驗(yàn)中,Master節(jié)點(diǎn)包含Master、ResourceMa-nager和Secondary-NameNode節(jié)點(diǎn),CPU配置為Inter(R)Xeon(R) CPU E7-4807 @ 1.87 GHZ;drivermemory為2 GB。
Worker節(jié)點(diǎn)包含Worker和Node-Manager節(jié)點(diǎn),CPU配置為Inter(R)Core(TM)2QuadCPUQ8200 @ 2.33 GHZ。Executormemory為2 GB,軟件平臺為Spark 2.2.0。
對標(biāo)準(zhǔn)測試圖像Lena圖進(jìn)行加密分存,在分存份數(shù)不同的情況下,分別記錄使用不同節(jié)點(diǎn)數(shù)時,加密分存的時間和不同核數(shù)加密分存時間與核數(shù)為1的時間比,如表2分存份數(shù)N=11和表3分存份數(shù)N=22所示。
表2 分存份數(shù)N=11
表3 分存份數(shù)N=22
由表2,表3可知,隨著CPU核數(shù)的提升,加密分存時間有著明顯的降低,且比較表2和表3,表3的N值為表2的兩倍,而表3的加密分存時間均小于表2的兩倍,也就說,隨著N值變大,加密分存效率會提升。
提出了一種基于二維整數(shù)耦合帳篷映射的彩色圖像并行加密分存方案,并給出在Spark框架下的并行算法,取得了較為理想的實(shí)驗(yàn)效果。利用分存ID產(chǎn)生加密序列的初值,對于不同的ID產(chǎn)生不同的加密序列,大大增加了圖像加密的安全性。在加密分存過程中,充分利用了圖像加密分存算法高度并行特性,在Spark框架下實(shí)現(xiàn),提高了加密分存的效率。從實(shí)驗(yàn)結(jié)果可知,加密分存圖像為無序亂碼圖。下一步工作的重點(diǎn)將圍繞可視化圖像加密分存這一點(diǎn)展開,將加密分存圖像隱藏在載體圖像中,進(jìn)一步提高圖像加密分存的安全性。