喬明秋,趙振洲
(北京政法職業學院 信息技術系,北京 102628)
SHAMIR A[1]和BLAKELY于1979年分別提出了秘密共享的概念,其主要思想是在n個參與者之間分享一個秘密,k個(或k個以上)參與者可以恢復秘密,而少于k個參與者則無法恢復秘密,所以,秘密共享也稱為(k,n)門限方案。可視密碼[2-3]是一種依靠人眼解密的秘密共享方法,它是將一個秘密圖像加密成n張分存圖像,n張分存圖像可以打印到膠片上、存入電腦或移動存儲器中,且分別由n個人保存。解密時只需k個人(或k個以上)將各自的分存圖像疊加,秘密圖像就會呈現出來,而少于k個人無法獲得秘密圖像的一點信息。
傳統可視密碼方法都是使用像素擴展的方法來進行加密,因此使得分存圖像被擴展為秘密圖像的好多倍,這樣不但造成存儲空間的浪費,也使得攜帶更為不方便。
在傳統(k,n)可視密碼中,秘密圖像中的每個像素都單獨處理,由n個人共享,每個共享由m個黑白子像素組成。構建一個n×m布爾矩陣B=[Bij],當且僅當Bij=1時第i個共享者的第j個子像素為黑;當且僅當Bij=0時第i個共享者的第j個子像素為白。當把投影片疊放在一起時,就相當于對于每一行都做了或運算。疊放后圖像的灰度值與進行或運算之后的向量V的漢明重量H(V)成正比。使用者利用視覺系統解釋灰度值如下,如果H(V)≥d該點像素為黑,如果H(V)≤d-αm該點像素為白。
ITO R[5]等人針對黑白可視密碼提出了一種不擴展的(k,n)-threshold可視密碼方案,當要分享一個黑(白)點時,便從對應于黑(白)點的基礎矩陣中隨機選擇列,并且將這個列向量的第i行分配給第i個分存圖像。由于不論是黑點或白點的基礎矩陣,其每一行0與1分布的比例都相同,因此分存圖像上每一個像素,會填上黑點或白點的幾率也都一樣,依次無法從分存圖像上猜測到有關秘密圖像的信息。而還原圖像則靠式(1)來產生對比。在式(1)中,p0和p1分別代表白點和黑點在疊加圖像上產生黑點的概率。只要這兩個概率值差別夠大,人眼便可自動區分疊加圖像上黑色與白色的區域。
β=|p0-p1|
(1)
ITO R[5]等所提出的不擴展模型,在分享一個像素時,是完全隨機地從基礎矩陣中選擇行,雖然在整張疊加圖像上,能夠達到式(1)的對比,但是在小區域上,黑點與白點的分布就可能無法達到式(1)的對比。侯永昌等人提出了像素不擴展之灰階密碼方案[6]及像素不擴展之彩色視覺密碼技術[7],其提出m點同時加密的概念,即用m點同時加密來保證分存圖像的像素不擴展。

因為基礎矩陣Bm×n的列數m=2,所以選擇秘密圖像上的連續兩個點為加密對象,稱這兩點為加密序列,加密方法如下:
(1)當加密序列為兩個白點時用矩陣M0加密,保證兩個分存圖像疊加后,此兩點為一黑一白;
(2)當加密序列為兩個黑點時用矩陣M1加密,保證兩個分存圖像疊加后,此兩點全黑;
(3)當加密序列為一黑點一白點時,一半用矩陣M0加密,一半用矩陣M1加密。保證兩個分存圖像疊加后,此兩點或者是一黑一白,或者是全黑,且這兩種情況各占一半。
通過總結,得到(2,2)可視密碼加密規則,其中,e代表秘密圖像上已經加密過的黑白各半的加密序列的個數,加密規則如下:
ifemod 2<1
用M1進行加密
else 用M0進行加密
侯永昌等人的多點加密可以較好地實現像素的不擴展,但是在解密過程中仍然存在秘密圖像的對比度不高的問題。結合侯永昌等人的多點加密,在解密的時候使用算法進行重構,方法是在秘密圖像的連續m個點中,如果黑色像素H(V)≥d,則對應m個點像素為黑點,否則m個點為白點。
令B0與B1分別代表對應于白點與黑點的n×m基礎矩陣,加密序列的長度為m,即一次取秘密圖像上的m點來加密,b代表加密序列中的黑點個數(0≤b≤m),eb則代表具有b個黑點的加密序列已加密過的個數,加密程序如下:
(1)令eb=0 forb=1,2,…,m;
(2)由秘密圖像中取出尚未加密的加密序列,并計算其黑點個數b;
(3)將基礎矩陣B做列向量隨機重排,其中矩陣B根據下列規則決定:
ifebmodm
B=B1
elseB=B0
(4)eb=eb+1;
(5)重復步驟(2)~(4)直到秘密圖像上的所有像素都加密完畢。
解密重構過程如下:
①令C為k個分享者的分存圖像疊加后的圖像,D為C重構后的圖像;
②存在整數p、q,使m=p×q,且|p-q|最小;
③對于B中的m像素,計算黑點個數:
forx=p:-1:0
fory=q:-1:0
計算解密圖像C中m=p×q個點C((p×i-x),(q×j-y))的黑點個數b
end
end
(4)如果黑點個數大于閾值d,重構圖像D對應的m個點為黑點,否則為白點:
forx=p:-1:0
fory=q:-1:0
ifb≥d
D((p×i-x),(q×j-y))=1;
else
D((p×i-x),(q×j-y))=0;
endif
end
end
(5)重復步驟(3)~(4)直到秘密圖像上的所有像素都重構完畢。
以(2,3)可視密碼來具體說明本文的方法,(2,3)可視密碼的基礎矩陣如下:
在傳統的可視密碼中,對于加密圖像逐點加密,如果該點為白點,則將B0進行隨機列置換后得到C0,將C0的第一行分給第一個分享者,將C0的第二行分給第二個分享者,將C0的第三行分給第三個分享者;如果該點為黑點,則將B1進行隨機列置換后得到C1,將C1的第一行分給第一個分享者,將C1的第二行分給第二個分享者,將C1的第三行分給第三個分享者。這樣分享圖像和解密圖像都將擴大三倍,產生像素擴展。
對于(2,3)可視密碼,加密算法為:
(1)令eb=0 forb=1,2
(2)由秘密圖像中取出尚未加密的加密序列,并計算其黑點個數b.
(3)將基礎矩陣B做列向量隨機重排,其中矩陣B根據下列規則決定:
ifebmod 3
B=B1;
elseB=B0;
(4)eb=eb+1;
(5)重復步驟(2)~(4)直到秘密圖像上的所有像素都加密完畢。
圖1為加密圖像,在加密圖像上選取連續3個點,如果3個點中有0個黑點,一直使用B0加密;如果3個點中有1個黑點,則第1次使用B1加密,后2次這種情況使用B0加密;如果3個點中有2個黑點,則第2次使用B1加密,后1次這種情況使用B0加密;如果3個點都為黑點,一直使用B1加密。使用上面的方法得到分存圖像,如圖2所示,分存圖像沒有像素擴展。將任意兩個分存圖像進行疊加,得到解密圖像C,如圖3所示,解密圖像沒有像素擴展。(本文中所有圖像都縮小為原圖像的50%。)

圖1 加密圖像(256×256)

圖2 三個分存圖像

圖3 解密圖像
將解密圖像利用算法進行重構,重構過程如下:
(1)令C為k個分享者的分存圖像疊加后的圖像,D為將C重構后的圖像;
(2)存在整數p、q,使3=p×q,且|p-q|最小,則p=1,q=3;
(3)對于B中的3像素,計算黑點個數:
fory=3:-1:0
計算解密圖像C中3個點C(i,(3×j-y))的黑點個數b
end
(4)如果黑點個數大于閾值2,重構圖像D對應的m個點為黑點,否則為白點:
fory=3:-1:0
ifb≥2
D(i,(3×j-y))=1;
else
D(i,(3×j-y))=0;
endif
end
(5)重復步驟(3)~(4)直到解密圖像上的所有像素都重構完畢。
C為解密圖像,計算C中連續3個點的黑點個數,如果黑點個數大于等于2,則該點為黑點;否則為白點。得到的重構圖像如圖4所示,重構圖像中沒有像素擴展,且有更好的視覺對比度。對于(2,3)可視密碼,本方案和其他方案的對比如表1所示。從表1中可以看到,本方案像素無擴展,所以圖像也不會有變形,且達到最好的黑白像素對比度。

圖4 重構圖像

方案像素擴展圖像變形黑白像素對比度文獻[4]3倍有1/3文獻[6]無無1/3本方案無無1
本文在兼顧可用性和可靠性的前提下,提出了實現可視密碼的最佳方案,在加密時利用m點加密實現了分存圖像的像素不擴展,在解密時利用重構得到更優對比度的重構圖像,并以(2,3)可視密碼為例說明了該方法的優點。該方法雖然避免了像素擴展且對比度很好,但是解密圖像黑色像素邊緣會稍有模糊,如何設計更優的像素不擴展算法,是今后需要努力的方向。