李天科
摘要: 隨著軟件產業的迅速發展,軟件版權的保護已成為亟待解決的問題。分析了軟件版權保護的重要性和必要性,給出了軟件水印模型,介紹了DM軟件水印算法和Easter EGG軟件水印算法,借鑒了DM軟件水印算法中水印信息預處理方法,同時借鑒了Easter EGG軟件水印算法,給出了一種軟件水印實現的方法,并對實現的結果做了分析。
關鍵詞: DM算法;Easter EGG算法;軟件水印
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2017)35-0116-02
隨著計算機軟件技術的發展,計算機軟件已經成為國家的基礎性、戰略性產業。計算機軟件在促進國民經濟和社會發展、轉變經濟增長方式、提高經濟運行效率、推進信息化與工業化融合等方面具有重要的地位和作用。同時,隨著計算機網絡的普遍應用,計算機網絡為軟件產品的傳播帶來了極大的便利,普通用戶可以隨時通過網絡下載、復制、分發軟件。
然而,在網絡環境下,軟件產品的非授權復制和分發現象越來越多,軟件的盜版、篡改日趨泛濫。這不僅給軟件產品的開發企業、分銷商和服務商帶來極大的經濟損失,同時,這也不利于軟件產業的持續發展,容易引發諸多的計算機安全問題。因此,軟件產品的版權保護技術是軟件產業界和學術界長期研究的主要問題。
軟件水印是20世紀90年代出現的一種源于數字水印技術的軟件版權保護技術,受到國內外許多學者的重視,出現了不少研究成果。但是這些研究主要集中在完善軟件水印理論以及構造新的或者改進原有的軟件水印算法,很少涉及到軟件水印的具體實現。本文基于Davidson-Myhrvold水印算法和Easter EGG水印算法,對軟件水印的具體實現做了簡單的嘗試。
1 軟件水印的概念、模型
1.1 概念
軟件水印是指不被感知地嵌入在軟件中的一段有標識意義的信息[1],有標識意義的信息既水印信息,可以是用來標識作者、發行者、所有者、使用者身份的信息,也可以是其它能用來標識版權的信息,如數字、字符串、圖片等;這里的軟件通常是指可執行的應用程序,
如java應用程序經過編譯之后生成的class文件、或者是有多個class文件經打包后生成的jar文件、或者是Windows系統中可執行的PE文件等,它們是軟件水印的載體。將水印信息嵌入到軟件中,需要驗證軟件版權的時候可以從載體軟件中提取出來,以證明該載體軟件所有者的版權,并且在保持載體軟件的功能和語義不變的情況下難以去除所嵌入的水印消息,以達到軟件版權保護的目的。
1.2 模型
軟件水印的模型如圖1所示,主要包括:軟件水印信息的預處理、軟件水印信息的嵌入和軟件水印信息的提取。軟件水印信息的預處理是將代表軟件版權的水印信息或標識有用戶身份的水印信息(w),應用某算法進行處理,如使用Knuth算法將整數水印信息轉換成長度為t的排列,使用Graph-Theoretic算法將整數信息編碼成為圖等等,通過這樣的預處理能提高水印信息的隱蔽性。水印信息的嵌入是應用嵌入算法將預處理后的水印信息(w)嵌入到軟件P中,形成攜帶有特殊水印信息的目標軟件(Pw)。水印信息的提取是嵌入部分的逆過程,應用相應的提取算法從受保護的軟件(Pw)中提取出水印 信息(w'),再經過反預處理得到解密后的水印信息(w),或者應用相應的驗證算法驗證水印信息(w)是否存在于受保護的軟件(Pw)中,這兩種提取方法都可以證明軟件的版權。
2 軟件水印算法
2.1 DM軟件水印算法
DM軟件水印算法是Davidson和Myhrvold于1996年提出的是最早的軟件水印算法,該算法通過對程序流程圖中的基本塊進行重排嵌入水印信息。其基本思想是將水印信息轉換成一個唯一的序列,在程序中選取指定個數的基本塊,選取的基本塊的個數不小于序列的長度,按照序列的順序對基本塊在程序流程中的位置進行重排,然后在基本塊中加入分支指令,保持基本塊原始的執行順序,從而確保程序的功能不變。
DM算法的缺點是提取水印信息需要提供原始程序,將原始程序的流程圖與嵌入了水印信息程序的流程圖進行比較。同時還需要知道水印信息序列的長度或水印信息的值才能正確的提取。
2.2 Easter Egg軟件水印算法
Easter Egg軟件水印算法的基本思想是將水印信息隱藏在源程序中,水印信息可以是一個字符串、一幅圖像、一段動畫或者是一段視頻。驗證軟件版權的時候,需要運行該應用程序,并輸入一個特定的序列,激活與水印相關的代碼,水印信息就會呈現在屏幕上。
Easter EGG水印信息在應用程序設計階段或者實現階段嵌入,水印信息提取的實現代碼也封裝在應用程序中,水印信息的提取需要特定的輸入并在程序運行過程中實現,因此,Easter Egg水印算法屬于動態軟件水印算法。Easter EGG水印的優點是不容易受到扭曲攻擊,缺點是水印容易被定位,一旦特定的輸入序列被發現,采用標準的調試技術就可以跟蹤可執行代碼中水印的位置,然后可以將其移除或者使其失效。
3 軟件水印實現
3.1 軟件水印實現思想
借鑒DM算法中水印信息的處理方法,選取一個數字做水印信息,在應用程序中將該水印數字轉換成對應的序列,保存在數組中。需要驗證應用程序版權的時候,啟動該應用程序啟動,在登錄界面的用戶名欄輸入水印信息,在密碼欄輸入包含有水印序列數字和其他字符組成的密碼,應用程序從輸入的密碼中提取數字序列,與水印數字轉換成的序列進行對比,若相同則輸出驗證成功的提示信息。
3.2 軟件水印實現過程
1) 水印信息的預處理
利用permute算法將水印信息轉換成一個唯一的序列,其實現的核心代碼如下:
private static int[] permute(int i, int array[]) {
// i表示水印信息;array[]存放轉換后的序列;t表示水印序列的長度。
int s;
for (int a = 2; a < t; a++) {
s = i % a;
i = i / a;
int j = array[a - 1];
array[a - 1] = array[s];
array[s] = j; }
return array; }
2) 水印信息的嵌入與提取
借鑒Easter EGG算法,將水印信息處理方法、密碼處理方法,提示信息的輸出方法分散在應用程序源代碼中的不同位置。需要驗證版權時,輸入水印信息和密碼,從密碼中采用正則表達式提取水印數字序列,然后與調用permute()方法轉換的序列進行比較,兩者相同則輸出提示信息。核心代碼如下:
private static String toNumString(String str){
//str輸入的密碼字符串
String a=str;
String regEx="[^0-9]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(a);
String s = m.replaceAll("").trim();
return s; }//s水印數字序列字符串
4 結果分析
1) DM算法中提取水印信息,需要將嵌入了水印的程序與原始程序進行比對,找出重排的基本塊,同時還要知道重排的基本塊的個數,因為重排的基本快個數不同表示的水印信息也不同。DM算法實現困難,無法抵抗扭曲攻擊。本文借鑒了DM算法中水印信息的預處理方法,實現簡單。由于沒有基本塊的重排,所以能抵抗扭曲攻擊。
2) 借鑒了Easter Egg算法,通過一個特殊的輸入激活水印信息的輸出,如在應用程序運行的登錄界面用戶名欄輸入數字7,密碼欄輸入:re3j4cx12k5zZ6p7m。生成的水印序列與密碼中提取的序列相同,屏幕上輸出提示信息。Easter EGG算法實現簡單,但是容易受去除攻擊,本文將水印信息處理方法、密碼處理方法、提示信息輸出方法分布在源程序的不同位置,對抵抗去除攻擊有所改善。
3) 對水印序列與密碼中提取的數字序列匹配成功后,輸出的提示信息進行變換,如輸出一幅特定的圖像或者演示一段動畫,可以用這個特定的圖像或者動畫表示該應用程序的版權信息。
參考文獻:
[1] 王建明,王朝坤,余志偉.軟件保護技術[M].北京:清華大學出版社,2013.
[2] 王葉茂,車生兵.軟件水印及其研究現狀概述[J].計算機應用與軟件,2015,32(4):6-10.
[3] 楊建龍,王建民,李德毅.軟件水印技術及其新進展[J]. 計算機工程,2007,33(17):168-175.
[4] 張立和,楊義先,鈕心忻.軟件水印綜述[J]. 軟件學報,2003,14(2):268-277.
[5] 羅養霞,房鼎益. 多水印技術在軟件版權管理中的應用研究[J].計算機科學,2011, 38 (10):103-109.