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