來源:月光博客
網址:http://www.williamlong.info/archives/704.html
[資料是從免費網站上獲取的,上載在這裏,只爲交流學習目的,文章原做者保留全部權力,
如本博客的內容侵犯了你的權益,請與如下地址聯繫,本人獲知後,立刻刪除。同時本人深表歉意,並致以崇高的謝意!]
本文是一篇軟件加密技術的基礎性文章,簡要介紹了軟件加密的一些基本常識和一些加密產品,適用於國內軟件開發商或者我的共享軟件開發者閱讀參考。html
一、加密技術概述算法
一個密碼系統的安全性只在於密鑰的保密性,而不在算法的保密性。數據庫
對純數據的加密的確是這樣。對於你不肯意讓他看到這些數據(數據的明文)的人,用可靠的加密算法,只要破解者不知道被加密數據的密碼,他就不可解讀這些數據。編程
可是,軟件的加密不一樣於數據的加密,它只能是「隱藏」。無論你願意不肯意讓他(合法用戶,或 Cracker)看見這些數據(軟件的明文),軟件最終總要在機器上運行,對機器,它就必須是明文。既然機器能夠「看見」這些明文,那麼 Cracker,經過一些技術,也能夠看到這些明文。安全
因而,從理論上,任何軟件加密技術均可以破解。只是破解的難度不一樣而已。有的要讓最高明的 Cracker 忙上幾個月,有的可能不費吹灰之力,就被破解了。網絡
因此,反盜版的任務(技術上的反盜版,而非行政上的反盜版)就是增長 Cracker 的破解難度。讓他們花費在破解軟件上的成本,比他破解這個軟件的獲利還要高。這樣 Cracker 的破解變得毫無心義——誰會花比正版軟件更多的錢去買盜版軟件?函數
二、密碼學簡介工具
2.1 概念post
(1) 發送者和接收者學習
假設發送者想發送消息給接收者,且想安全地發送信息:她想確信偷聽者不能閱讀發送的消息。
(2) 消息和加密
消息被稱爲明文。用某種方法假裝消息以隱藏它的內容的過程稱爲加密,加了密的消息稱爲密文,而把密文轉變爲明文的過程稱爲解密。
明文用M(消息)或P(明文)表示,它多是比特流(文本文件、位圖、數字化的語音流或數字化的視頻圖像)。至於涉及到計算機,P是簡單的二進制數據。明文可被傳送或存儲,不管在哪一種狀況,M指待加密的消息。
密文用C表示,它也是二進制數據,有時和M同樣大,有時稍大(經過壓縮和加密的結合,C有可能比P小些。然而,單單加密一般達不到這一點)。加密函數E做用於M獲得密文C,用數學表示爲:
E(M)=C.
相反地,解密函數D做用於C產生M
D(C)=M.
先加密後再解密消息,原始的明文將恢復出來,下面的等式必須成立:
D(E(M))=M
(3) 鑑別、完整性和抗抵賴
除了提供機密性外,密碼學一般有其它的做用:.
(a) 鑑別
消息的接收者應該可以確認消息的來源;入侵者不可能假裝成他人。
(b) 完整性檢驗
消息的接收者應該可以驗證在傳送過程當中消息沒有被修改;入侵者不可能用假消息代替合法消息。
(c) 抗抵賴
發送者過後不可能虛假地否定他發送的消息。
(4) 算法和密鑰
密碼算法也叫密碼,是用於加密和解密的數學函數。(一般狀況下,有兩個相關的函數:一個用做加密,另外一個用做解密)
若是算法的保密性是基於保持算法的祕密,這種算法稱爲受限制的算法。受限制的算法具備歷史意義,但按如今的標準,它們的保密性已遠遠不夠。大的或常常變換的用戶組織不能使用它們,由於每有一個用戶離開這個組織,其它的用戶就必須改換另外不一樣的算法。若是有人無心暴露了這個祕密,全部人都必須改變他們的算法。
更糟的是,受限制的密碼算法不可能進行質量控制或標準化。每一個用戶組織必須有他們本身的惟一算法。這樣的組織不可能採用流行的硬件或軟件產品。但竊聽者卻能夠買到這些流行產品並學習算法,因而用戶不得不本身編寫算法並予以實現,若是這個組織中沒有好的密碼學家,那麼他們就沒法知道他們是否擁有安全的算法。
儘管有這些主要缺陷,受限制的算法對低密級的應用來講仍是很流行的,用戶或者沒有認識到或者不在意他們系統中內在的問題。
現代密碼學用密鑰解決了這個問題,密鑰用K表示。K能夠是不少數值裏的任意值。密鑰K的可能值的範圍叫作密鑰空間。加密和解密運算都使用這個密鑰(即運算都依賴於密鑰,並用K做爲下標表示),這樣,加/解密函數如今變成:
EK(M)=C
DK(C)=M.
DK(EK(M))=M.
有些算法使用不一樣的加密密鑰和解密密鑰,也就是說加密密鑰K1與相應的解密密鑰K2不一樣,在這種狀況下:
EK1(M)=C
DK2(C)=M
DK2 (EK1(M))=M
全部這些算法的安全性都基於密鑰的安全性;而不是基於算法的細節的安全性。這就意味着算法能夠公開,也能夠被分析,能夠大量生產使用算法的產品,即便偷聽者知道你的算法也沒有關係;若是他不知道你使用的具體密鑰,他就不可能閱讀你的消息。
密碼系統由算法、以及全部可能的明文、密文和密鑰組成的。
基於密鑰的算法一般有兩類:對稱算法和公開密鑰算法。下面將分別介紹:
2.2 對稱密碼算法
對稱算法有時又叫傳統密碼算法,就是加密密鑰可以從解密密鑰中推算出來,反過來也成立。在大多數對稱算法中,加/解密密鑰是相同的。這些算法也叫祕密密鑰算法或單密鑰算法,它要求發送者和接收者在安全通訊以前,商定一個密鑰。對稱算法的安全性依賴於密鑰,泄漏密鑰就意味着任何人都能對消息進行加/解密。只要通訊須要保密,密鑰就必須保密。
對稱算法的加密和解密表示爲:
EK(M)=C
DK(C)=M
對稱算法可分爲兩類。一次只對明文中的單個比特(有時對字節)運算的算法稱爲序列算法或序列密碼。另外一類算法是對明文的一組比特亞行運算,這些比特組稱爲分組,相應的算法稱爲分組算法或分組密碼。現代計算機密碼算法的典型分組長度爲64比特——這個長度大到足以防止分析破譯,但又小到足以方便使用(在計算機出現前,算法廣泛地每次只對明文的一個字符運算,可認爲是序列密碼對字符序列的運算)。
2.3 公開密碼算法
公開密鑰算法(也叫非對稱算法)是這樣設計的:用做加密的密鑰不一樣於用做解密的密鑰,並且解密密鑰不能根據加密密鑰計算出來(至少在合理假定的長時間內)。之因此叫作公開密鑰算法,是由於加密密鑰可以公開,即陌生者能用加密密鑰加密信息,但只有用相應的解密密鑰才能解密信息。在這些系統中,加密密鑰叫作公開密鑰(簡稱公鑰),解密密鑰叫作私人密鑰(簡稱私鑰)。私人密鑰有時也叫祕密密鑰。爲了不與對稱算法混淆,此處不用祕密密鑰這個名字。
用公開密鑰K加密表示爲
EK(M)=C.
雖然公開密鑰和私人密鑰是不一樣的,但用相應的私人密鑰解密可表示爲:
DK(C)=M
有時消息用私人密鑰加密而用公開密鑰解密,這用於數字簽名(後面將詳細介紹),儘管可能產生混淆,但這些運算可分別表示爲:
EK(M)=C
DK(C)=M
當前的公開密碼算法的速度,比起對稱密碼算法,要慢的多,這使得公開密碼算法在大數據量的加密中應用有限。
2.4 單向散列函數
單向散列函數 H(M) 做用於一個任意長度的消息 M,它返回一個固定長度的散列值 h,其中 h 的長度爲 m .
輸入爲任意長度且輸出爲固定長度的函數有不少種,但單向散列函數還有使其單向的其它特性:
(1) 給定 M ,很容易計算 h ;
(2) 給定 h ,根據 H(M) = h 計算 M 很難 ;
(3) 給定 M ,要找到另外一個消息 M‘ 並知足 H(M) = H(M’) 很難。
在許多應用中,僅有單向性是不夠的,還須要稱之爲「抗碰撞」的條件:
要找出兩個隨機的消息 M 和 M‘,使 H(M) = H(M’) 知足很難。
因爲散列函數的這些特性,因爲公開密碼算法的計算速度每每很慢,因此,在一些密碼協議中,它能夠做爲一個消息 M 的摘要,代替原始消息 M,讓發送者爲 H(M) 簽名而不是對 M 簽名 .
如 SHA 散列算法用於數字簽名協議 DSA中。
2.5 數字簽名
提到數字簽名就離不開公開密碼系統和散列技術。
有幾種公鑰算法能用做數字簽名。在一些算法中,例如RSA,公鑰或者私鑰均可用做加密。用你的私鑰加密文件,你就擁有安全的數字簽名。在其它狀況下,如DSA,算法便區分開來了??數字簽名算法不能用於加密。這種思想首先由Diffie和Hellman提出 .
基本協議是簡單的 :
(1) A 用她的私鑰對文件加密,從而對文件簽名。
(2) A 將簽名的文件傳給B.
(3) B用A的公鑰解密文件,從而驗證簽名。
這個協議中,只須要證實A的公鑰的確是她的。若是B不能完成第(3)步,那麼他知道簽名是無效的。
這個協議也知足如下特徵:
(1) 簽名是可信的。當B用A的公鑰驗證信息時,他知道是由A簽名的。
(2) 簽名是不可僞造的。只有A知道她的私鑰。
(3) 簽名是不可重用的。簽名是文件的函數,而且不可能轉換成另外的文件。
(4) 被簽名的文件是不可改變的。若是文件有任何改變,文件就不可能用A的公鑰驗證。
(5) 簽名是不可抵賴的。B不用A的幫助就能驗證A的簽名。
在實際應用中,由於公共密碼算法的速度太慢,簽名者每每是對消息的散列簽名而不是對消息自己簽名。這樣作並不會下降簽名的可信性。
3 當前流行的一些軟件保護技術
3.1 序列號保護
數學算法一項都是密碼加密的核心,但在通常的軟件加密中,它彷佛並不太爲人們關心,由於大多數時候軟件加密自己實現的都是一種編程的技巧。但近幾年來隨着序列號加密程序的普及,數學算法在軟件加密中的比重彷佛是愈來愈大了。
看看在網絡上大行其道的序列號加密的工做原理。當用戶從網絡上下載某個shareware——共享軟件後,通常都有使用時間上的限制,當過了共享軟件的試用期後,你必須到這個軟件的公司去註冊後方能繼續使用。註冊過程通常是用戶把本身的私人信息(通常主要指名字)連同信用卡號碼告訴給軟件公司,軟件公司會根據用戶的信息計算出一個序列碼,在用戶獲得這個序列碼後,按照註冊須要的步驟在軟件中輸入註冊信息和註冊碼,其註冊信息的合法性由軟件驗證經過後,軟件就會取消掉自己的各類限制,這種加密實現起來比較簡單,不須要額外的成本,用戶購買也很是方便,在互聯網上的軟件80%都是以這種方式來保護的。
軟件驗證序列號的合法性過程,其實就是驗證用戶名和序列號之間的換算關係是否正確的過程。其驗證最基本的有兩種,一種是按用戶輸入的姓名來生成註冊碼,再同用戶輸入的註冊碼比較,公式表示以下:
序列號 = F(用戶名)
但這種方法等於在用戶軟件中再現了軟件公司生成註冊碼的過程,其實是很是不安全的,不論其換算過程多麼複雜,解密者只需把你的換算過程從程序中提取出來就能夠編制一個通用的註冊程序。
另一種是經過註冊碼來驗證用戶名的正確性,公式表示以下:
用戶名稱 = F逆(序列號) (如ACDSEE)
這實際上是軟件公司註冊碼計算過程的反算法,若是正向算法與反向算法不是對稱算法的話,對於解密者來講,的確有些困難,但這種算法至關很差設計。
因而有人考慮到如下的算法:
F1(用戶名稱) = F2(序列號)
F一、F2是兩種徹底不一樣的的算法,但用戶名經過F1算法計算出的特徵字等於序列號經過F2算法計算出的特徵字,這種算法在設計上比較簡單,保密性相對以上兩種算法也要好的多。若是可以把F一、F2算法設計成不可逆算法的話,保密性至關的好;可一旦解密者找到其中之一的反算法的話,這種算法就不安全了。一元算法的設計看來再如何努力也很難有太大的突破,那麼二元呢?
特定值 = F(用戶名,序列號)
這個算法看上去至關不錯,用戶名稱與序列號之間的關係再也不那麼清晰了,但同時也失去了用戶名於序列號的一一對應關係,軟件開發者必須本身維護用戶名稱與序列號之間的惟一性,但這彷佛不是難以辦到的事,建個數據庫就能夠了。固然也能夠把用戶名稱和序列號分爲幾個部分來構造多元的算法。
特定值 = F(用戶名1,用戶名2,...序列號1,序列號2...)
現有的序列號加密算法大可能是軟件開發者自行設計的,大部分至關簡單。並且有些算法做者雖然下了很大的功夫,效果卻每每得不到它所但願的結果。
3.2 時間限制
有些程序的試用版每次運行都有時間限制,例如運行10分鐘或20分鐘就中止工做,必須從新運行該程序才能正常工做。這些程序裏面天然有個定時器來統計程序運行的時間。
這種方法使用的較少。
3.3 Key File 保護
Key File(註冊文件)是一種利用文件來註冊軟件的保護方式。Key File通常是一個小文件,能夠是純文本文件,也能夠是包含不可顯示字符的二進制文件,其內容是一些加密過或未加密的數據,其中可能有用戶名、註冊碼等信息。文件格式則由軟件做者本身定義。試用版軟件沒有註冊文件,當用戶向做者付費註冊以後,會收到做者寄來的註冊文件,其中可能包含用戶的我的信息。用戶只要將該文件放入指定的目錄,就可讓軟件成爲正式版。該文件通常是放在軟件的安裝目錄中或系統目錄下。軟件每次啓動時,從該文件中讀取數據,而後利用某種算法進行處理,根據處理的結果判斷是否爲正確的註冊文件,若是正確則以註冊版模式來運行。
這種保護方法使用也很少。
3.4 CD-check
即光盤保護技術。程序在啓動時判斷光驅中的光盤上是否存在特定的文件,若是不存在則認爲用戶沒有正版光盤,拒絕運行。在程序運行的過程中通常再也不檢查光盤的存在與否。Windows下的具體實現通常是這樣的:先用GetLogicalDriveStrings( )或GetLogicalDrives( )獲得系統中安裝的全部驅動器的列表,而後再用GetDriveType( )檢查每個驅動器,若是是光驅則用CreateFileA( )或FindFirstFileA( )等函數檢查特定的文件存在與否,並可能進一步地檢查文件的屬性、大小、內容等。
3.5 軟件狗
軟件狗是一種智能型加密工具。它是一個安裝在並口、串口等接口上的硬件電路,同時有一套使用於各類語言的接口軟件和工具軟件。當被狗保護的軟件運行時,程序向插在計算機上的軟件狗發出查詢命令,軟件狗迅速計算查詢並給出響應,正確的響應保證軟件繼續運行。若是沒有軟件狗,程序將不能運行,複雜的軟硬件技術結合在一塊兒防止軟件盜版。真正有商業價值得軟件通常都用軟件狗來保護。
平時常見的狗主要有「洋狗」(國外狗)和「土狗」(國產狗)。這裏「洋狗」主要指美國的彩虹和以色列的HASP,「土狗」主要有金天地(如今與美國彩虹合資,叫「彩虹天地」)、深思、尖石。總的說來,「洋狗」在軟件接口、加殼、反跟蹤等「軟」方面沒有「土狗」好,但在硬件上破解難度很是大;而「土狗」在軟的方面作的很好,但在硬件上不如「洋狗」,稍有單片機功力的人,均可以複製。
3.6 軟盤加密
經過在軟盤上格式化一些非標準磁道,在這些磁道上寫入一些數據,如軟件的解密密鑰等等。這種軟盤成爲「鑰匙盤」。軟件運行時用戶將軟盤插入,軟件讀取這些磁道中的數據,判斷是否合法的「鑰匙盤」。
軟盤加密還有其它一些技術,如弱位加密等等。
隨着近年來軟盤的沒落,這種方法基本上退出了歷史舞臺。
3.7 將軟件與機器硬件信息結合
用戶獲得(買到或從網上下載)軟件後,安裝時軟件從用戶的機器上取得該機器的一些硬件信息(如硬盤序列號、BOIS序列號等等),而後把這些信息和用戶的序列號、用戶名等進行計算,從而在必定程度上將軟件和硬件部分綁定。用戶須要把這一序列號用Email、電話或郵寄等方法寄給軟件提供商或開發商,軟件開發商利用註冊機(軟件)產生該軟件的註冊號寄給用戶便可。軟件加密雖然加密強度比硬件方法較弱,但它具備很是廉價的成本、方便的使用方法等優勢。很是適合作爲採用光盤(CDROM)等方式發授軟件的加密方案。
此種加密算法的優勢
· 不一樣機器註冊碼不一樣。用戶得到一個密碼只能在一臺機器上註冊使用軟件。不一樣於目前大多軟件採用的註冊方法,即只要知道註冊碼,可在任何機器上安裝註冊。
· 不須要任何硬件或軟盤
· 能夠選擇控制軟件運行在什麼機器、運行多長時間或次數等
· 可以讓軟件在不註冊前的功能爲演示軟件,只能運行一段時間或部分功能。註冊後就當即變爲正式軟件
· 採用特別技術,解密者很難找到產生註冊號碼的規律
· 在使用註冊號產生軟件(註冊機)時可採用使用密碼、密鑰盤、總次數限制等方法
· 方便易用,價格低廉。
這種加密還有如下特色
一、 註冊加密的軟件,只能在一臺機器上安裝使用。把軟件拷貝到其它機器上不能運行。
二、 若用戶想在另外一機器上安裝運行,必須把軟件在這一機器上運行時的序列號,寄給軟件出版商換取註冊密碼。固然應再交一份軟件費用。
三、 此加密方法特別適應在因特網上發佈的軟件及用光盤發佈的軟件。
註釋:
一、「加密技術概述」部份內容參考了大學教材「密碼學基礎」。
二、「當前流行的一些軟件保護技術」部份內容參考了「加密與解密--軟件保護技術及徹底解決方案」一文。
出處:http://www.cnblogs.com/erwin/archive/2007/06/13/782706.html