張愛孌, 李子臣
1(北京印刷學院 信息工程學院, 北京 102600)
2(北京印刷學院 數字版權保護技術研究中心, 北京 102600)
隨著信息社會的不斷發(fā)展, 雙水印[1]應用非常廣泛, 比如多方驗證, 為了保證一個數字合同的有效性與不可否認性, 需要同時嵌入甲方、乙方的水印信息, 只有提取并驗證通過雙方的水印信息才能確定該合同為有效合同, 同時合同中嵌入了雙方的水印信息, 可以防止任何一方否認合同.網絡安全交易[2]中, 為了防止Buyer惡意的傳輸拷貝購買的數字內容, 以及防止當Buyer發(fā)現(xiàn)數字內容的質量問題追溯到Seller時, Seller否認交易的現(xiàn)象發(fā)生, 交易過程中選擇將Seller和Buyer的ID信息同時嵌入到數字內容中, 一旦發(fā)現(xiàn)交易中任何一方的不法行為都可以定位到雙方的身份并進行仲裁處理.
數字水印研究的歷史過程中, 單水印算法[3,4]是主要研究內容, 單水印算法功能明確, 但同時也存在功能單一的不足, 無法滿足用戶的多功能需求.雙水印算法[5]因此產生.另外變換域水印算法是水印算法中研究重點之一, 嵌入水印時并不是直接對載體圖像的像素值進行操作, 而是利用選定的變換方法, 對變換后的系數進行操作.因此, 變換域雙水印[6]是數字水印算法的研究熱點, 在現(xiàn)實中應用廣泛.
2016 年Frattolillo提出了基于云計算平臺多方水印算法[7], 文章中設計了一個安全的交易流程, 將水印嵌入的工作交由云計算平臺來完成, 云平臺利用公鑰密碼體制的加法同態(tài)性質對密文操作來嵌入水印, 這樣可以防止半可信的第三方惡意的篡改載體信息與水印信息, 保障了數字內容的安全.但是公鑰密碼體制對數字內容加密解密, 效率不高, 影響交易效率.
基于小波變換的數字水印算法, 在嵌入水印之前,首先對載體圖像進行小波變換, 小波變換之后圖像的小波系數集分為低頻系數與高頻系數.其中, 低頻信息[8]是圖片的主要信息, 低頻系數的改變對圖像的影響很大; 高頻信息[9]是圖片的細節(jié)信息.小波系數一般較小,水印在這部分嵌入會很大程度地改變圖像的小波系數,因此會影響嵌入水印后的圖像質量.
基于以上的問題, 本文利用SM4分組密碼[10]、Paillier公鑰密碼[11,12]以及DWT數字水印算法[13], 設計了一個新的數字圖像雙水印算法.首先將載體圖像進行三層小波變換, 根據頻帶系數特性將各個頻帶系數集分為加密部分和水印部分, 加密部分利用SM4進行加密, 水印部分利用Paillier同態(tài)性質進行加密與水印嵌入, 與以往的完全用同態(tài)密碼[7]進行加密的水印算法相比, 很好地規(guī)避了公鑰密碼算法低速性的缺點.
在水印嵌入時, 本文的算法將第一個用戶的水印信息嵌入到第3層的HL3位置, 另一個用戶的水印信息嵌入到LH3位置.嵌入水印時利用Paillier密碼對LH3、HL3以及水印信息進行加密, 利用LSB水印算法[14]來嵌入水印, 將加密后的密文重組輸出含雙水印的密文圖像.本文中將水印信息嵌入到中高頻HL3和LH3的位置可以減少水印嵌入后對載體圖像質量的影響, 同時結合LSB水印算法可以增加水印的不可見性.
在水印提取時, 可以在密文中分別提取第1個水印和第2個水印, 由于Paillier具有加法同態(tài)特性, 也可以在解密后的明文中分別提取第1個水印和第2個水印, 實現(xiàn)了解密和提取水印的交換.
實驗結果表明, 相比其他雙水印算法, 本文提出的算法在保證提取水印信息正確的前提下, 加解密速度快, 嵌入水印后的圖像對水印的不可見性好.
雙水印的應用場景廣泛, 下面根據雙水印在本方案中的應用對其進行定義.本方案中雙水印是在保證載體信息安全的前提下, 用戶雙方各自嵌入不同的水印信息到載體圖像中.嵌入水印相當于在載體中設下標識, 用來表示載體的歸屬.
如圖1所示, 在雙水印嵌入模型中, 兩個用戶分兩次嵌入水印信息w1和w2, 得到嵌入水印的圖像.對嵌入水印的圖像提取水印, 得到水印信息w1和w2.
圖1 雙水印模型
其中E為加密函數,I表示載體圖像,w1與w2表示兩個水印信息.用戶1在密文中向載體圖像I嵌入水印信息w1, 得到I1=E1(I,w1), 用戶2在密文中向載體圖像I1中嵌入水印信息w2, 得到Iw=E2(I1,w2).雙水印模型可以形式化表示為:
該模型中, 水印嵌入過程是對載體圖像的密文信息操作的, 用戶不能有目的性的篡改載體圖像的信息,保證了載體圖像的安全.
密鑰生成: 首先選取兩個大素數p和q, 計算n=p×q.然后隨機選取參數g, 其中g滿足g∈且n|ordn2(g).最后生成公鑰為: (n,g), 私鑰為:λ或者(p,q).
加密算法: 對任意的明文m(m∈Zn)加密后得到密文:
解密算法: 利用上述私鑰對密文C解密得到明文:
對載體信息m1與水印信息w1, 分別加密后可得:
對加密后的兩個密文信息E(m1)、E(w1)相乘得到:
由式(6), 兩個密文相乘再解密可以得到:D(E(m1)
由此可得, Paillier密碼算法具有加法同態(tài)性質, 即明文相加對應密文的相乘, 本文利用Paillier的同態(tài)性質來嵌入水印.
本方案中, 首先對圖像進行小波分解, 小波分解后,根據不同頻帶系數的特性將各個頻帶系數塊劃分成加密部分X與水印部分Y, 其中加密部分X利用SM4密碼算法進行加密得到Ek4(X), 水印部分Y利用Paillier同態(tài)性質進行水印嵌入得到EpkB(Y*).將分塊加密的密文和嵌入水印的密文進行重組以及小波逆變換即可得到嵌入雙水印的密文圖像Epk,kB4(I*).用戶利用SM4的密鑰k4與Paillier的私鑰skB對圖像進行解密, 得到嵌入雙水印的圖像I*.第三方機構根據水印算法特性通過盲提取得到水印信息.
本方案中, 需要對載體圖像以及水印圖像進行預處理之后再嵌入水印, 下面介紹圖像預處理的流程.
3.1.1 初始化并生成密鑰
初始化SM4密碼算法的參數和Paillier密碼算法的參數.其中k4為對稱加密算法SM4的密鑰, 是一個128位二進制的隨機密鑰; Paillier密碼算法的公私鑰對為 (pkB,skB), 其中公鑰pkB用于加密水印部分Y以及水印信息w1和w2, 私鑰skB用于解密嵌入水印的密文信息.每次事務中生成一套固有的公私鑰, 將生成的密鑰保存到文件里, 每次用到密鑰時直接從文件中讀取,這樣保證了一次事務中加解密共用一套公私鑰.
3.1.2 分塊加密
首先對圖像進行如圖2的三層小波變換, 得到10個頻帶系數集{LL3,LH3,HL3,HH3,LH2,HL2,HH2,LH1,HL1,HH1}, 根據不同頻帶系數集的頻帶特性, 將子頻帶劃分為兩個部分: 圖片中灰色的部分為加密部分記為X, 白色部分為水印部分記為Y={Y1,Y2}.其中水印部分Y1為水平高頻, 水印部分Y2為垂直高頻.利用分組密碼SM4的高速加密性對X進行加密,利用Paillier密碼算法對水印部分Y加密.分塊加密的細節(jié)流程如下:
圖2 三層小波分解
(1)將圖像進行三重小波分解, 得到系數集合{LL3,LH3,HL3,HH3,LH2,HL2,HH2,LH1,HL1,HH1}.
(2)由上圖可以得知, 加密部分X的頻帶集為{LL3,HH3,LH2,HL2,HH2,LH1,HL1,HH1}.
1)將頻帶系數集{LL3,HH3,LH2,HL2,HH2,LH1,HL1,HH1}拼接成為一個向量X.
2) (SM4加密)使用密鑰k4對向量X進行加密, 得到密文Ek4(X).
(3)加密水印部分Y1(LH3).
1)將子頻帶系數集LH3拼接成一個向量V={v1,v2,···,vn}.
2)對向量V中的元素進行預處理.由于Paillier密碼算法只能對正整數進行加密解密, 然而進行小波分解后的頻帶系數為浮點型小數.為了加密小波系數, 本方案中需要對各個頻帶系數預處理成正整數, 過程如下:
① 遍歷向量集V中的元素, 將集合中的每一個元素進行四舍五入保留小數點后a位(其中a的取值不同得出的水印效果不同, 在實驗階段進行了分析).通過這樣的操作, 集合V中的元素, 都統(tǒng)一成為小數點后位數相同的元素.
② 將集合中元素的正負情況保存到集合pnflag1中.
如果vi<0,那么pnflag1(i)=-1;
如果vi>0,那么pnflag1(i)=1.
③ 將向量V中的系數處理成正整數向量Pre_LH3, 對于每一個元素Pre_LH3(i), 計算Pre_LH3(i)=pnflag1(i)×vi×10a, 將元素vi乘以pnflag1(i)×10a后, 得到的每一個Pre_LH3(i)元素變成正整數.
④ 遍歷向量集Pre_LH3中的元素, 將Pre_LH3中的元素處理成偶數.
如果Pre_LH3(i)為奇數,Pre_LH3(i)=Pre_LH3(i)-1.
如果Pre_LH3(i)為偶數,Pre_LH3(i)=Pre_LH3(i).
3)使用Paillier算法, 利用公鑰pkB, 對預處理后的水印部分Pre_LH3進行加密, 得到密文EpkB(Pre_LH3).
(4)加密水印部分Y2.最后得到加密后的密文EpkB(Pre_HL3)和系數集pnflag2 (處理過程與步驟(3)相同).
(5)加密水印信息: 利用密鑰pkB, 對水印信息w1、w2加密得到EpkB(w1)、EpkB(w2).
(6) 輸出:{Ek4(X),EpkB(Pre_LH3),EpkB(Pre_HL3),pnflag1,pnflag2,EpkB(w1),EpkB(w2),a}.
對數據預處理以及加密完成后, 用戶A得到{EpkB(w1),EpkB(Pre_LH3)}, 并利用Paillier同態(tài)性質將水印信息w1嵌入到LH3中.用戶B得到EpkB(w2)、EpkB(Pre_HL3)后將水印信息w2嵌入到HL3中.整體的水印嵌入過程如圖3所示.
圖3 水印嵌入過程
(1) 用戶A嵌水印
加密后載體圖像的密文:
密文水印信息:
水印嵌入的過程如下:
① 如果Eem_LH3(i)為奇數, 則嵌入水印w1(i)=1.
② 如果Eem_LH3(i)為偶數, 則嵌入水印w1(i)=0.
(2) 用戶B嵌水印
嵌入過程同上, 水印嵌入過程:
其中, 將載體圖像的密文EpkB(Pre_HL3(i))與水印信息的密文EpkB(w2(i))對應相乘得到的結果相當于對載體明文Pre_HL3(i)與水印信息w2(i)相加再加密, 最終可以得到嵌入水印的密文圖像EpkB(Eem_HL3).
(3) 輸出嵌入水印后的圖像
得到密文Ek4(X)、EpkB(Eem_LH3)、EpkB(Eem_HL3)后分別使用密鑰進行解密, 得到嵌入水印后的明文圖像I*.具體過程如下:
① 解密Ek4(X): 使用SM4的密鑰k4對Ek4(X)解密, 得到明文系數向量U, 將向量U還原成小波系數集合{LL3,HH3,LH2,HL2,HH2,LH1,HL1,HH1}.
③ 將嵌入水印后的頻帶集Eem_LH3恢復到原來的量級:Eem_LH3(i)=pnflag1(i)×Eem_LH3(i)×(1/10)a.
⑤ 將嵌入水印后的頻帶集Eem_HL3恢復到原來的量級:Eem_HL3(i)=pnflag2(i)×Eem_HL3(i)×(1/10)a.
⑥ 將{X,Eem_LH3,Eem_HL3}小波系數按照原來的順序格式組合在一起, 然后使用離散小波逆變換(IDWT)將其還原成嵌入雙水印的圖像I*.
由上述的水印嵌入算法可以看出, 本文的水印嵌入過程在密文中進行, 而水印提取是對明文進行操作,因此本文的水印算法具有可交換性.水印提取的過程如下:
(1)對I*進行三層小波分解(只需要對嵌入水印的部分:Eem_LH3、Eem_HL3操作提取水印即可).
(2)對Eem_LH3部分進行水印提取:
1)遍歷系數集合Eem_LH3中的元素, 將每一個元素進行四舍五入保留小數點后a位;
2)對Eem_LH3中的每個元素操作完之后, 對每個元素Eem_LH3(i)進行奇偶性判斷:
① 若Eem_LH3(i)為奇數, 則水印信息為:w1(i)=1,i∈[1,n];
② 若Eem_LH3(i)為偶數, 則水印信息為:w1(i)=0,i∈[1,n];
3)輸出水印圖像w1.
(3)對Eem_HL3部分進行水印提取(過程同上),輸出水印圖像w2.
本算法在Matlab R2020a[15,16], IntelliJ IDEA 2017.3.2,Windows 10操作系統(tǒng)下進行仿真測試.實驗過程中使用經典的灰度圖進行測試, 并從加密參數、不可見性、時間負載的角度來說明算法的性能.
嵌入率用來衡量水印嵌入比例, 其計算公式如下:
選取3幅經典的灰度圖Lena、Baboon、Camera,在嵌入容量為0.031 25 bpp時, 對尺度參數a進行測試.選取6個不同的參數a時, 嵌入水印后, 含水印圖像的PSNR值見表1.
表1 不同a時含水印圖像PSNR值
表1中展示了3個不同的載體圖像, 在a的取值不同時, PSNR值的變化規(guī)律.從表中可以發(fā)現(xiàn)在a值相同的情況下, 3個不同的載體圖像Lena, Baboon,Camera的PSNR值相差很小; 對于同一副載體圖像,a的值越大, 嵌入水印后圖像的PSNR值越高.
實驗數據分析: 本方案中參數a, 用于預處理過程中對頻帶系數的倍數擴張,a的取值越大, 水印的不可見性越好.
表2為在a的取值不同時, 提取出的兩個水印信息的NC值變換規(guī)律.表中的每個數據代表提取出的兩個水印信息的NC值.從數據中可以看出, 隨著參數a增大, 提取的水印的NC值起初比較穩(wěn)定, 但是當a取13時, NC值大幅下降.
表2 不同a時提取水印圖像的NC值
實驗數據分析: 小波變換后, 小波系數為浮點型,并且小數點后的位置并不能確定, 當a值超越大部分小波系數的小數位數時, 提取水印時容易將水印信息過濾掉, 因此當a值過大時, 不能很好地提取出水印圖像.
經過表1與表2中的數據,a在[-1,12]區(qū)間內的值PSNR值與NC值都比較高.實際應用中可根據應用需求選擇具體的a值.
與其他的密文域雙水印算法[17,18]的性能進行比較,結果見表3.下面各項性能數據是在參數a=1, 嵌入容量為0.031 25 bpp時取得的.
表3 本文算法與其他算法的性能比較
從表3中可以看出, 本文的PSNR值明顯優(yōu)于文獻[17,18]的算法, 原因分析, 本文的水印嵌入算法是利用LSB思想對小波變換后的系數進行操作來嵌入水印, 嵌入水印信息后對載體圖像的影響很小, 因此PSNR值較高.由此可見, 本文算法更加適用于對數字內容質量要求較高的應用場景中.
上述的實驗結果為載體圖像為512×512的Lena圖, 水印圖像為2個64×64的二值圖像, 且參數a=1時的實驗結果.其中在密文中嵌入水印的實驗結果見圖4,明文中提取水印的實驗結果見圖5.此水印算法滿足一定的交換性, 即在密文中嵌入水印, 明文中提取水印.
圖4 密文域水印實驗結果
圖5 雙水印提取實驗結果
本文的實驗使用的環(huán)境是在Matlab R2020a,IntelliJ IDEA 2017.3.2, Windows 10操作系統(tǒng)下進行仿真測試, 在商業(yè)環(huán)境中為了增加方案的執(zhí)行效率, 會將部分計算任務交由云計算平臺[19]來完成, 從而提高執(zhí)行效率.下面對本文算法的時間負載特性進行分析.
從圖6中可以看出, 同一個載體圖像的總消耗時間隨著嵌入水印的增大而增大; 同一水印圖像的總消耗的時間隨著載體圖像的增大而增大.但是從圖中可以發(fā)現(xiàn)同一大小的水印圖像嵌入到不同大小的載體圖像的時間消耗差別很小, 而同一載體圖像嵌入不同大小的水印圖像時間消耗的變化幅度很大.因此可以得出, 嵌入的水印圖像的大小是影響總消耗時間的主要因素, 即利用公鑰密碼Paillier加密以及嵌入水印的時間消耗大, 而利用SM4分組密碼加密的時間消耗非常小.
圖6 時間消耗
圖7為本文算法與文獻[7]中的加密域水印算法的時間負載對比圖.圖中的實驗結果為嵌入水印圖像大小是64×64時, 不同大小的載體圖像對應的加密以及嵌入水印的總時間消耗.由圖7可以看出, 在嵌入水印圖像大小固定的情況下, 本方案中不同的載體圖像的大小, 對加密以及嵌入水印的時間影響較小, 而文獻[7]中的水印算法的總時間消耗隨著載體圖像大小的增加而大幅增加.從圖中可以看出, 在嵌入水印大小固定時,本方案的水印算法相較于方案[7], 時間消耗更少.
圖7 本算法與文獻[7]算法時間消耗比較
原因分析, 文獻[7]中的水印嵌入方法是對整幅圖像利用公鑰密碼的同態(tài)性質嵌入水印, 在水印嵌入的過程中, 需要對整幅圖像用同態(tài)密碼進行加密.而本方案將圖像分為加密部分與水印部分, 只有水印部分需要利用同態(tài)性質嵌入水印, 加密部分利用對稱密碼SM4進行加密.對稱密碼的加解密速度高于公鑰密碼, 因此本方案的效率更高.
本文基于Paillier同態(tài)加密算法、SM4加密算法以及DWT小波變換水印算法, 構造了一種新的密文域雙水印算法.與其他水印算法相比, 本文的水印算法既可以保障嵌入水印后的圖片質量高, 水印信息提取正確, 也可以保證高效的計算速率.實驗數據表明, 本方案中的水印嵌入方法具有較高的峰值信噪比, 提取出的水印質量好, 以及時間消耗少, 因此本文的算法具有一定的研究意義和參考性.
下一步的研究可以尋求一種更高效的水印嵌入方法, 來提高密文域雙水印算法的魯棒性, 從而進一步改善算法的性能.