基于硬盤序列號和RSA算法的軟件加密系統(tǒng)的設計和實現(xiàn) 畢業(yè)設計論文
《基于硬盤序列號和RSA算法的軟件加密系統(tǒng)的設計和實現(xiàn) 畢業(yè)設計論文》由會員分享,可在線閱讀,更多相關《基于硬盤序列號和RSA算法的軟件加密系統(tǒng)的設計和實現(xiàn) 畢業(yè)設計論文(43頁珍藏版)》請在裝配圖網上搜索。
1、 本科畢業(yè)設計·論文 基于硬盤序列號和RSA算法的軟件加密系統(tǒng)的設計和實現(xiàn) 摘 要 隨著計算機軟件業(yè)的飛速發(fā)展和計算機的日益普及計算機軟件已經進入社會生活中的各個角落。但是由于計算機軟件易于復制,所以隨之而來的便是盜版軟件的泛濫。這使軟件開發(fā)人員蒙受了巨大的經濟和社會損失,防止軟件盜版最行之有效的方法就是對軟件進行有效的加密。 論文首先介紹了軟件加密的發(fā)展現(xiàn)狀和研究它的意義,接著對軟件序列號保護的相關技術分析和當前流行的加密算法詳細研究。基于以上理論基礎,將本設計的基于硬盤序列號和RSA算法軟件加密系統(tǒng)的設計和實現(xiàn)劃分為兩個層次:采用動態(tài)鏈接庫文件DiskSerial.DLL導出的Ge
2、tSerialNumber()函數(shù)獲取硬盤的物理序列號,動態(tài)鏈接庫的好處是可以采用多種編程語言來編寫,增強產品的功能,提供二次開發(fā)的平臺,簡化項目管理,節(jié)省磁盤空間和內存,有助于資源的共享;注冊機使用RSA加密算法將硬盤物理序列號加密生成為注冊碼,客戶端將注冊碼進行解密運算,其結果與獲取的本地計算機硬盤物理序列號對比,驗證注冊碼的合法性。加密解密使用非對稱密鑰RSA算法,私鑰和公鑰不同,理論上從公鑰推算出私鑰是不可行的,當密鑰長度達到1024位時,破解難度極大,所以使用RSA算法加密確保了軟件的安全性。 本設計因為使用的序列號是硬盤物理序列號,及每臺電腦的序列號是不同的,從而保證了注冊碼的唯
3、一性。經過調試和測試的驗證,本設計結構簡單,性能可靠,操作方便。本設計在軟件保護行業(yè)有著廣泛的使用價值,如在軟件防盜中,用作注冊碼的生成與驗證等。 關鍵詞:硬盤物理序列號;RSA算法;注冊機;軟件加密 System design and implementation of encryption system based on hard disk serial number and RSA algorithm Student:LI Zhong-jie Teacher:ZHANG Lie-ping Abstract:With t
4、he rapid development of computer software industry, and the increasing popularity of computer software has entered every corner of social life. However, because computer software is easy to replicate, so what comes next is the proliferation of pirated software. This allows software developers suffer
5、ed huge economic and social loss, to prevent software piracy is the most effective way to encrypt the software effectively. First, the paper introduces the current development of software encryption and research its meaning, then the serial number of software related to technical analysis and p
6、rotection of the popular encryption algorithm in detail. Based on the above theory, this design based on the hard disk serial number and the RSA encryption algorithm software, system design and implementation is divided into two levels: the dynamic link library files DiskSerial.DLL exported GetSeria
7、lNumber() function to get the hard drive of the physics serial number, The advantage of the dynamic link library can be written using a variety of programming languages, and enhance product's features, provide second development platform, simplifying project management, saving disk space and memory
8、to help resource sharing; Keygen using RSA algorithm encrypt the hard disk physical serial number of students to become registration key, registration key to decrypt the client will operation, its results for the local computer hard disk physical serial number contrast, validation License legitimacy
9、. Encryption and decryption using RSA asymmetric key algorithm, the private key and public key difference, in theory calculate the private key from the public key is not feasible, when the 1024-bit key length, the crack is extremely difficult, so use the RSA encryption algorithm to ensure the securi
10、ty of the software. The design for using the serial number is hard physical serial number, and serial number of each computer is different, thus ensuring the registration code is unique. After commissioning and testing of the verification, the design is simple, reliable, easy to operate. The de
11、sign of the software protection industry has a wide range of value, such as software security, the registration code for the generation and verification. Keywords:shard disk physical serial number;RSA algorithm;keygen;software encryption 目次 摘要 I Abstract II 1 緒論 1 1.1 問題的提出及研究意義 1 1.2 軟件
12、保護系統(tǒng)概念 1 1.3 課題研究內容及論文的主要工作 2 2 軟件序列號保護的相關技術介紹 3 2.1 序列號保護機制 3 2.1.1 注冊碼保持不變 3 2.1.2 注冊碼因輸入信息而異 3 2.1.3 注冊碼因用戶計算機而異 4 2.2 注冊機信息采集技術 4 2.2.1 網卡的物理地址(MAC)獲取 4 2.2.2 磁盤邏輯序列號獲取 5 2.2.3 磁盤物理序列號獲取 5 2.3 常用的軟件保護技術介紹 7 2.3.1 時間限制 7 2.3.2 Key File保護 9 2.3.3 CD-CHECK 9 2.4 軟件保護總結 9 2.5 本章小結 1
13、0 3 加密算法介紹 11 3.1 DES算法 11 3.1.1 DES算法原理 11 3.1.2 DES算法的應用誤區(qū) 11 3.2 MD5算法 11 3.2.1 MD5算法原理 11 3.2.2 MD5算法的應用 12 3.3 RSA算法 12 3.3.1 RSA算法原理 12 3.3.2 RSA的安全性 13 3.3.3 RSA的速度 13 3.4 本章小結 14 4 系統(tǒng)詳細設計及實現(xiàn) 15 4.1 開發(fā)環(huán)境介紹 15 4.1.1 Visual C++ 6.0 介紹 15 4.1.2 MFC程序開發(fā)流程 16 4.2 大進制數(shù)及其運算類定義 20
14、 4.2.1 大數(shù)類的詳細描述 20 4.2.2 大數(shù)類的類定義 21 4.3 注冊機的設計及實現(xiàn) 22 4.3.1 注冊機界面設計 22 4.3.2 注冊機算法的詳細描述 25 4.3.3 算法的實現(xiàn)代碼 26 4.3.4 完成的注冊機程序 28 4.4 客戶端的設計及實現(xiàn) 29 4.4.1 客戶端界面設計 29 4.4.2 各種接口硬盤介紹 30 4.4.3 客戶端算法詳細描述 32 4.4.4 完成的客戶端程序 34 4.5 本章小結 36 5 結論 37 致謝 38 參考文獻 39 38 桂林理工大學本科畢業(yè)設計·論文
15、1 緒論 1.1 問題的提出及研究意義 計算機軟件業(yè)的飛速發(fā)展和計算機的日益普及計算機軟件已經進入社會生活中的各個角落。計算機軟件是開發(fā)者腦力勞動的成果,具有原創(chuàng)性質[1]。計算機軟件開發(fā)要求軟件開發(fā)人員擁有豐富的專業(yè)相關知識,具備優(yōu)秀的邏輯思維和抽象思維能力,了解計算機硬件與軟件的最新發(fā)展狀況與發(fā)展趨勢,熟練掌握和應用編程語言。尤其是開發(fā)具有大規(guī)模商業(yè)應用的計算機軟件,通常需要專業(yè)分工、流水作業(yè)。必須具有的充足的物質條件和良好的技術儲備。而計算機軟件的復制是對計算機軟件的客觀再現(xiàn),不改變軟件內容,不影響軟件本身的價值,而把軟件轉載于有形物體的行為。由于軟件存在形式的特殊性,它
16、比傳統(tǒng)的作品更容易被復制,且復制所需投入少、耗時短、傳播容易,無需借助特殊的裝置。尤其在網絡環(huán)境下計算機軟件的復制與傳播就更為方便,從而使盜版侵權成了輕易又且暴利的事情。這使軟件開發(fā)人員蒙受了巨大的經濟和社會損失,防止軟件盜版最行之有效的方法就是對軟件進行有效的加密[2]。 隨著軟件的防盜版措施越來越被軟件開發(fā)者所重視,其采用的技術也變得越來越廣泛和復雜。軟件的破解技術與保護技術這兩者之間就是矛與盾的關系,它們是在互相斗爭中發(fā)展進化的。這種技術上的較量歸根到底是一種利益的沖突。軟件開發(fā)者為了維護自身的商業(yè)利益,不斷地尋找各種有效地技術來保護軟件版權,以增加其保護強度,推遲軟件被破解的
17、時間;而破解者則受盜版所帶來的高額利潤的驅使,或出于純粹的個人興趣,而不斷制作新的破解工具并針對新出現(xiàn)的保護方式進行跟蹤分析以找到相應的破解方法。 從理論上說,幾乎沒有破解不了的保護。但是如果一種保護技術的強大強到足以讓破解者在軟件的生命周期內無法將其完全破解,這種保護技術就可以說是非常成功的。因此,開發(fā)研制一種安全可靠、難以破解軟件加密系統(tǒng)具有重大的經濟意義和社會意義。 1.2 軟件保護系統(tǒng)概念 軟件與普通作品不同,天生即具有技術屬性。軟件本身就是實現(xiàn)技術的一段計算機可以識別的編碼。因此,在既有功能的基礎上,很容易添加新的功能代碼用于保護版權。這也意味著,相對于其他普通
18、作品,在軟件保護中使用技術手段的成本最低,效率最高。對于軟件而言,通過對軟件進行加密等技術保護手段可以有效的防止他人對軟件擅自訪問、復制、操作、散發(fā)及傳播,同時也便于控制軟件正常的授權使用以及使用后的監(jiān)督。 目前各國對于軟件的保護性技術措施都有比較明確的概念。美國將技術措施的定義為“任何能夠有效控制進入受版權保護的作品并能夠有效保護版權人權利的措施?!倍鴼W盟的定義為“設計用于阻止侵犯版權以及與數(shù)據(jù)庫有關的特殊權利的設備、產品或方法?!钡羌夹g措施事實上是一個開放的系統(tǒng),隨著技術的不斷進步,不斷地會有新類型的技術保護措施的涌現(xiàn)。本文出發(fā)點即是通過硬盤物理序列號用RSA算法生成唯一的注冊
19、碼,從而對軟件進行保護。 軟件權利人通過對軟件等數(shù)字化形式存在的作品上設置的能夠實現(xiàn)對作品的訪問、復制、傳播、修改和使用進行有效控制的各種技術手段、設備、產品或方法,并借此達到對作品未經授權的訪問、復制、傳播、修改與使用行為的警示、禁止甚至制裁的目的。這些技術手段、設備、產品或方法的實施階段既包括在出售前與軟件本體打包封裝,亦包括在出售后通過在線升級、認證等方式加載。上述的這一類的技術手段、設備、產品或方法統(tǒng)稱為軟件保護技術[3]。 1.3 課題研究內容及論文的主要工作 本課題研究內容主要有:MFC編程技術、軟件保護技術概述、動態(tài)鏈接庫文件的生產導入、獲得Ring0級權限
20、、獲取硬盤物理序列號、定義大整數(shù)及其運算法則類、RSA非對稱密鑰加密解密算法、素數(shù)的判定和密鑰對的生成;在了解以上技術之后,確定了各個模塊的工作原理及作用,最后根據(jù)要實現(xiàn)的功能要求,繪制流程圖,由流程圖應用C++語言編寫程序。 本論文的主要工作如下: 1)了解軟件盜版的嚴重性,以及軟件防盜的現(xiàn)狀和發(fā)展趨勢。 2)了解軟件產品的特點,深入分析軟件易于復制傳播的原因。 3) 掌握軟件保護系統(tǒng)概念,熟悉軟件保護中常用的技術手段。 4)掌握MFC可視化編程常用的方法,動態(tài)鏈接庫文件的制作和該文件的導入。 5)了解常用的進入Ring0級權限的三種方法:第一種通過中斷陷入技術,第二種通過寫一個
21、中斷VXD(虛擬驅動設備)或WDM,最后一種通過WindowsAPI函數(shù)DeviceInControl調用Smartvsdvxd。掌握動態(tài)鏈接庫導出函數(shù)獲取硬盤物理序列號。 6)掌握大數(shù)類的定義,大數(shù)類中定義了賦值、比較大小、加法、減法、乘法、除法、求模等基本運算法則。 7)了解常用的加密算法,掌握RSA非對稱加密算法的原理,隨機生成密鑰對(e,n)和(d,n)。熟悉序列號的加密和注冊碼的解密。 8)根據(jù)功能需求,畫出程序流程圖,應用C++語言編寫應用程序。 2 軟件序列號保護的相關技術介紹 2.1 序列號保護機制 數(shù)學算法一項都是密碼加密的核心,但在一般的軟
22、件加密中,它似乎并不太為人們關心,因為大多數(shù)時候軟件加密本身實現(xiàn)的都是一種編程的技巧。但近幾年來隨著序列號加密程序的普及,數(shù)學算法在軟件加密中的比重似乎是越來越大了。所謂序列號保護機制就是軟件開發(fā)者根據(jù)用戶提供的一些信息,然后使用數(shù)學算法生成注冊碼。用戶得到注冊碼后,經過逆運算得到的結果跟自己提供的信息對比,從而確定軟件注冊碼的合法性。因為采集的用戶信息類型不同,所以就有了多種類型的注冊碼。 2.1.1 注冊碼保持不變 注冊碼保持不變就是說不管是哪個用戶在哪個臺電腦上都能注冊,整個軟件的安全性寄托在注冊碼本身的保密上,只要注冊碼泄漏了,所有人都可以注冊該軟件。早期的軟件保護都采用一
23、串復雜的字符串作為注冊碼,因為當時的網絡并不發(fā)達,加上注冊碼本身難于記憶,所以個人所擁有的注冊碼一般情況下,是不容易被大量用戶非法盜用的。 隨著時間的推移,網絡逐漸普及,覆蓋面越來越廣,早期軟件保護防盜的方法面臨前所未有的挑戰(zhàn),只要有一個人把自己一款軟件的合法注冊碼發(fā)布在網上,其他使用該軟件的用戶就能很容易的利用搜索引擎找到此注冊碼,成功的注冊自己的軟件,而無需支付相應的費用,這給軟件開發(fā)商造成了巨大的損失?,F(xiàn)在已經很少有人使用注冊碼保持不變的方法保護軟件,此方法已經慢慢淡出了人們的視線。 2.1.2 注冊碼因輸入信息而異 這是傳統(tǒng)的注冊碼保護方法,根據(jù)用戶輸入的不同信息
24、(如用戶名)產生注冊碼,這種方法產生的注冊碼和用戶的信息存在簡單的對應機制,安全性極差,只要“用戶名”和“注冊碼”泄漏就可以無限制地在任何計算機上注冊使用。網絡上大量的“注冊用戶”和“注冊碼”使軟件的保護形同虛設[4]。 注冊碼保持不變的方法失利之后,軟件保護行業(yè)亟需一種有效地保護方法,于是在原來的方法上改進為使用注冊時輸入的信息和注冊碼對應的方式保護軟件,防止盜用,因為生成注冊碼時時用戶輸入的用戶名只有用戶自己知道,因此,就算是本軟的某個注冊碼被別人知道了,但是不知道與這個注冊碼對應的用戶名,同樣還是不能注冊成功。所以整個軟件的安全全部寄托在了用戶對自己信息的保密程度,只要某個用戶
25、把自己的注冊碼和用戶名公開,或是黑客通過木馬獲取到了相關信息,那么其他人就可以用這些信息成功的注冊該軟件。 2.1.3 注冊碼因用戶計算機而異 根據(jù)用戶計算機各種軟硬件信息:如CPU ID、分區(qū)卷標、硬盤大小、硬盤物理序列號、網卡號等等。通過這些信息可以將任意兩臺機器區(qū)分出來,從而可以生成一段唯一的序列號。這些信息中有的是不可取的,例如分區(qū)卷標這種不穩(wěn)定信息,因其僅與軟件系統(tǒng)有關。而有一些是無法得到的,例如當機器中沒有網卡時或早于Pentium III型號的CPU,網卡號和CPU ID就得不到了[5]。 網絡的普及,因一個注冊碼泄漏而可以無限制的注冊該軟件的問題越發(fā)突出,
26、軟件開發(fā)商為了能保護自己的合法權益,開發(fā)出了一套新的軟件保護方法,這也是現(xiàn)階段最主要的保護方式,因計算機不同而生成不同的注冊碼。這種注冊碼一般都是與本機的相關的具有唯一性的一種或多種物理信息,這種物理信息是出廠時就確定了的,一般是固化在了計算機內部,不能修改,因此生成的注冊碼即使是發(fā)布在了網上,別的人還是無法使用該注冊碼注冊自己的軟件,因為自己的計算機硬件的相關信息和本注冊碼不相關。有了這種全新的軟件保護方式,軟件開發(fā)商就能在網絡環(huán)境中很容易的保護自己的利益,避免軟件被非法盜版。 2.2 注冊機信息采集技術 注冊機信息采集技術是指利用計算機軟件技術,針對計算機相關軟硬件信息進行采集
27、保存,從而為各種信息服務系統(tǒng)提供數(shù)據(jù)輸入的整個過程。 硬件信息包括CPU ID、網卡物理地址(MAC)、硬盤的相關物理信息例如硬盤物理序列號等等。這些硬件物理信息有些可以通過windows提供的API函數(shù)直接獲取,有些需要自己編寫相關的函數(shù),而且在windows下,必須編寫一個驅動程序或通過一定的技術手段獲取,例如,硬盤信息的獲取操作,需要運行在Ring 0級別,而正常情況,windows的應用程序是運行在Ring 3級的,因此在獲取硬盤物理信息前,必須通過一定的技術方法進入windows的Ring 0級。 2.2.1 網卡的物理地址(MAC)獲取 MAC(Media A
28、ccess Control, 介質訪問控制)MAC地址是燒錄在Network Interface Card(網卡,NIC)里的。MAC地址,也叫硬件地址,是由48比特長(6字節(jié)),16進制的數(shù)字組成。0-23位叫做組織唯一標志符(organizationally unique),是識別LAN(局域網)節(jié)點的標識,24-47位是由廠家自己分配,其中第40位是組播地址標志位。網卡的物理地址通常是由網卡生產廠家燒入網卡的EPROM(一種閃存芯片,通??梢酝ㄟ^程序擦寫),它存儲的是傳輸數(shù)據(jù)時真正賴以標識發(fā)出數(shù)據(jù)的電腦和接收數(shù)據(jù)的主機的地址。也就是說,在網絡底層的物理傳輸過程中,是通過物理地址來識別主機
29、的,它一般也是全球唯一的。比如,著名的以太網卡,其物理地址是48bit(比特位)的整數(shù),如:44-45-53-54-00-00,以機器可讀的方式存入主機接口中。以太網地址管理機構(除了管這個外還管別的)(IEEE)(IEEE:電氣和電子工程師協(xié)會)將以太網地址,也就是48比特的不同組合,分為若干獨立的連續(xù)地址組,生產以太網網卡的廠家就購買其中一組,具體生產時,逐個將唯一地址賦予以太網卡。形象的說,MAC地址就如同我們身份證上的身份證號碼,具有全球唯一性。 眾所周知,一個網卡對應唯一MAC地址,對一些應用程序來說,獲取網卡MAC地址有時是必要的,使用VC提供的NetBIOS網絡編程接口
30、可以方便獲取網卡MAC地址。NetBIOS中所有的函數(shù)聲明、常數(shù)等等均是在頭文件nb30.h內定義的,nb30.h中一些類型在wtypes.h中定義,另外,若想使用NetBIOS,須連接的庫是netapi.dll。 2.2.2 磁盤邏輯序列號獲取 硬盤的磁盤邏輯序列號的獲取很簡單,可直接調用windows的API函數(shù)GetVolumeInformation()獲取硬盤的邏輯序列號[6]。該函數(shù)如下所示: GetVolumeInformation( lpRootPathName: PChar; {磁盤驅動器代碼字符串} lpVolumeNameBuffer:
31、PChar; {磁盤驅動器卷標名稱} nVolumeNameSize: DWORD; {磁盤驅動器卷標名稱長度} lpVolumeSerialNumber: PDWORD; {磁盤驅動器卷標序列號} var lpMaximumComponentLength: DWORD; {系統(tǒng)允許的最大文件名長度} var lpFileSystemFlags: DWORD; {文件系統(tǒng)標識} lpFileSystemNameBuffer: PChar; {文件操作系統(tǒng)名稱} nFileSystemNameSize: DWORD {文件
32、操作系統(tǒng)名稱長度} ): BOOL; 采用注冊碼的保護方式,最好是一機一碼,即注冊碼與機器特征相關,這樣一臺機器上的注冊碼就無法在另外一臺機器上使用,可以防止有人散播注冊碼,然而硬盤邏輯序列號用相關工具可以修改其值,所以使用邏輯序列號不安全。 2.2.3 磁盤物理序列號獲取 硬盤的序列號是廠家設定的,且只能用I/O指令讀取,所以,這在以前的DOS時根本不是什么問題,方法非常簡單,如下面的代碼所示: static int WaitIde(){ int al; while ((al=i
33、np(0x1F7))>=0x80); return al; } static void ReadIDE(){ int al; int i; WORD pw[256]; WaitId(); outp(0x1F6,0xA0); al = WaitIde(); if((al
34、&0x50)!=0x50) return; outp(0x1F6,0xA0); outp(0x1F7,0xEC); al = WaitIde(); if((al&0x58)!=0x58) return; for(i=0;i<256;i++){ pw[i] = inpw(0x1F0); } }
35、至此,關于IDE硬盤的信息已經在pw數(shù)組中了,需要注意的是該數(shù)組是一個WORD類型,硬盤的序列號存放于pw[10]開始的10個WORD中,使用時需要將每個WORD的高低字節(jié)顛倒一下。真正有點麻煩的是在Windows 95/98下,I/O指令作為特權指令在應用程序級別,即Ring3是不可使用的,所以上面的代碼在執(zhí)行到WaitIde()時會陷到死循環(huán)中,原因就是IN 0x1F7總是返回0xFF容易想到的解決辦法是寫一個VxD,因為VxD運行Ring 0級別上,即最高特權級上,所以所有的指令都是可用的,硬盤物理序列號的獲取需要使用特權指令,要進入Ring0特權級常用的還有兩種方法:1)中斷陷入技術;
36、2)通過WindowsAPI函數(shù)DeviceInControl調用Smartvsdvxd。其中第一種方法相對簡單實用,但不能取得NT下的Ring0級,因為NT下得不到中斷向量表,本文只介紹第一種方法的實現(xiàn)機制。 計算機操作系統(tǒng)都有一個中斷描述表(IDT),該表有IDTR寄存器指向。矢量號作為IDT表的索引,從IDT表中獲取一個8字節(jié)的門描述符。在門中包含48位的全指針及占用了16位的屬性。48位的全指針包含32位的偏移量及16位的選擇子。這里的偏移量分為兩個部分存放。全指針的選擇子部分存放在m+2及m+3字節(jié),偏移量的低16位存放在m及m+1字節(jié),高16位存放在m+6及m+7字節(jié)。在
37、門描述符中,屬性位存放在m+4及m+5字節(jié)。 P為存在位,P=1表示門有效,P=0表示門無效,使用無效門將引起異常。DPL為描述符特權級,定義與門相聯(lián)系的特權級。門的DPL只在INTn及INTO時進行檢查,以避免應用程序執(zhí)行INTn時,使用了各種設備在中斷表中使用的矢量號。對于所有其它的異?;蛑袛?,忽略門DPL。DT為DType位,用于區(qū)分儲存段(DT=1)及非儲存段(及系統(tǒng)段或門,DT=0)。我們現(xiàn)在討論的是門描述符,故此處有DT=0。Type為四位類型字段,用于定義門的類型:5為任務門;6為286中斷門;7為286陷阱門;14為386中斷門;15為386陷阱門。我們利用重新定義門
38、描述符的偏移量將自己的程序放入中斷中,通過執(zhí)行中斷從而得到Ring0級的權限來讀到硬盤序列號[7]。 2.3 常用的軟件保護技術介紹 2.3.1 時間限制 2.3.1.1 定時器 有些程序的試用版每次運行都有時間限制,例如運行10分鐘或20分鐘就停止工作,必須重新運行該程序才能正常工作。這些程序里面自然有個定時器來統(tǒng)計程序運行的時間。 1)使用Settimer() 常用的計數(shù)器是函數(shù)Settimer(),調用這個函數(shù)創(chuàng)建的定時器可以發(fā)出消息VM_TIMER,或者在定時期滿時調用一個回調函數(shù)。使用這個函數(shù)會使時間延時,精度不高。 2)使用timeSetEv
39、ent() 給Windows驅動程序最精確的周期性通知是由Windows的多媒體服務timeSetEvent()提供的。它的時間可以精確到1毫秒。 3)使用VXD 可以使用VMM的Set_Global_time_Out()服務來迫使回調函數(shù)的幾個毫秒再執(zhí)行,這就創(chuàng)造了一個“只有一次”的定時器。VXD可以在回調中再次調用Set_Global_time_Out()來開始下一個定時器,這樣提供了一個連續(xù)運行的定時器了。 4)其它 GetTickCount():精度不高;timeGetTime():可以以毫秒級返回windows開始后的時間。 2.3.1.2 時
40、間限制 一般這類保護的軟件都有時間上的限制,如試用30天等,當過了共享軟件的試用期后,就不予運行,只有向軟件作者付費注冊之后才能得到一個無時間限制的注冊版本。這種類型程序很多,讓你有10天、20天、30天等,它們在安裝時,在你的系統(tǒng)某處做上時間標記,每次運行時用當前系統(tǒng)時間和安裝時的時間比較,判斷你還否能使用。如最典型的30天限制的一種情況: mov ecx,1E ; 把1E (30天 十進制) 放入 ecx mov eax,[esp+10] ; 把用過天數(shù)放到eax cmp eax,ecx ; 在此比較 如碰到這種情況,只需把mov eax,[esp+10]改成mo
41、v eax,1。 要記住當前年份、月份的十六進制的一些表示方法,如:2000年的十六進制是07D0,然后用W32DASM反匯編你的程序,用查找字符串的方法找D007(在機器碼中位置顛倒了一下)或其它類似時間的數(shù)字,有可能會找到有價值的線索。你別小看這種方法,對那些沒怎么防范的程序,此招很有效。 如:一程序限定在2000年使用,可能有如下一代碼::00037805 817C2404D0070000 cmp dword ptr [esp+04], 000007D0 比較是否在2000年。 2.3.1.3與時間相關函數(shù) 1)GetSystemTime 得當前系統(tǒng)時間 在一個
42、SYSTEMTIME中載入當前系統(tǒng)時間,這個時間采用的是“協(xié)同世界時間”(即UTC,也叫做GMT)格式。 VOID GetSystemTime( LPSYSTEMTIME lpSystemTime ); // 隨同當前時間載入的結構。 2)GetLocalTime 得當前本地時間 VOID GetLocalTime( LPSYSTEMTIME lpSystemTime ); // 用于裝載本地時間的結構。 3)SystemTimeToFileTime 根據(jù)一個FILETIME結構內容,載入一個SYSTEMTIME BOOL SystemTim
43、eToFileTime(CONST SYSTEMTIME * lpst,LPFILETIME lpft); // 包含了系統(tǒng)時間信息的一個結構。 // 用于裝載文件時間的一個結構。 4)SetTimer 創(chuàng)建一定時器,在指定時間內暫停 UINT SetTimer( HWND hwnd,UINT idtimer,UINT uTimeout,TIMERPROC tmprc); // 時間信息句柄。 // 定時器ID 標識符。 // 暫停時間。 // 處理定時過程的程序入口地址。 一般這類保護的軟件都有時間上的限制,如試用30天等,當過了共享軟件的試用期后,
44、就不予運行,只有向軟件作者付費注冊之后才能得到一個有(或無)時間限制的注冊版本。使用時間限制技術時,不要依賴于GetLocalTime()、GetSystemTime()這樣眾所周知的函數(shù)來獲取系統(tǒng)時間,可以通過讀取關鍵的系統(tǒng)文件的修改時間來得到系統(tǒng)時間的信息。 2.3.2 Key File保護 Key File(注冊文件)是一種利用文件來注冊軟件的保護方式。Key File一般是一個小文件,可以是純文本文件,也可以是包含不可顯示字符的二進制文件,其內容是一些加密過或未加密的數(shù)據(jù),其中可能有用戶名、注冊碼等信息。文件格式則由軟件作者自己定義。采用keyfile的保護方式時,key
45、file的尺寸不能太小,可將其結構設計得比較復雜,在程序中不同的地方對keyfile的不同部分進行復雜的運算和檢查。試用版軟件沒有注冊文件,當用戶向作者付費注冊之后,會收到作者寄來的注冊文件,其中可能包含用戶的個人信息。用戶只要將該文件放入指定的目錄,就可以讓軟件成為正式版。該文件一般是放在軟件的安裝目錄中或系統(tǒng)目錄下。軟件每次啟動時,從該文件中讀取數(shù)據(jù),然后利用某種算法進行處理,根據(jù)處理的結果判斷是否為正確的注冊文件,如果正確則以注冊版模式來運行[8]。 2.3.3 CD-CHECK 簡單也最常見的光盤保護就是程序在啟動時判斷光驅中的光盤上是否存在特定的文件,如果不存在則認為用戶
46、沒有正版光盤,拒絕運行。在程序運行的過程當中一般不再檢查光盤的存在與否。Windows下的具體實現(xiàn)一般是這樣的:先用GetLogicalDriveStrings()或GetLogicalDrives()得到系統(tǒng)中安裝的所有驅動器的列表,然后再用GetDriveType()檢查每一個驅動器,如果是光驅則用CreateFileA()或FindFirstFileA()等函數(shù)檢查特定的文件存在與否,并可能進一步地檢查文件的屬性、大小、內容等。這種光盤檢查是比較容易被破解的,解密者只要利用上述函數(shù)設斷點找到程序啟動時檢查光驅的地方,修改判斷指令就可以跳過光盤檢查[9]。 2.4 軟件保護總結
47、 本節(jié)將給出關于軟件保護的一般性建議,這些都是無數(shù)人經驗的總結。程序員在設計自己的保護方式時最好能夠遵守這里給出的準則,這樣會提高軟件的保護強度。 1)軟件最終發(fā)行之前一定要將可執(zhí)行程序進行加殼/壓縮,使得解密者無法直接修改程序。如果時間允許并且有相應的技術能力,最好是設計自己的加殼/壓縮方法。如果采用現(xiàn)成的加殼工具,最好不要選擇流行的工具,因為這些工具已被廣泛深入地加以研究,有了通用的脫殼/解壓辦法。另外,最好采用兩種以上的不同的工具來對程序進行加殼/壓縮,并盡可能地利用這些工具提供的反跟蹤特性。 2)增加對軟件自身的完整性檢查。這包括對磁盤文件和內存映像的檢查,以防止有人未經允
48、許修改程序以達到破解的目的。DLL和EXE之間可以互相檢查完整性。 3)所有與軟件保護相關的字符串都不能以明文形式直接存放在可執(zhí)行文件中,這些字符串最好是動態(tài)生成。盡可能少地給用戶提示信息,因為這些蛛絲馬跡都可能導致解密者直接深入到保護的核心。比如,當檢測到破解企圖之后,不要立即給用戶提示信息,而是在系統(tǒng)的某個地方做一個記號,隨機地過一段時間后使軟件停止工作,或者裝作正常工作但實際上卻在所處理的數(shù)據(jù)中加入了一些垃圾。 4)將注冊碼、安裝時間記錄在多個不同的地方。檢查注冊信息和時間的代碼越分散越好。不要調用同一個函數(shù)或判斷同一個全局標志,因為這樣做的話只要修改了一個地方則全部都被破解了。在檢
49、查注冊信息的時候插入大量無用的運算以誤導解密者,并在檢查出錯誤的注冊信息之后加入延時。 5)如果試用版與正式版是分開的兩個版本,且試用版的軟件沒有某項功能,則不要僅僅使相關的菜單變灰,而是徹底刪除相關的代碼,使得編譯后的程序中根本沒有相關的功能代碼。 2.5 本章小結 本章主要介紹了序列號保護機制,注冊機信息采集技術,其中詳細介紹了硬盤物理序列號的獲取和一些其它的軟件保護技術,通過對比分析,每種算法都有自己的優(yōu)勢,具體使用哪種算法要根據(jù)問題的需求,最終本設計選用硬盤物理序列生成注冊碼的方法。采用硬盤物理序列號生成注冊碼的保護方式,最好的優(yōu)勢是一機一碼,即注冊碼與機器特征相關,這樣
50、一臺機器上的注冊碼就無法在另外一臺機器上使用,能有效地防止軟件盜版的問題。 3 加密算法介紹 3.1 DES算法 3.1.1 DES算法原理 數(shù)據(jù)加密算法(Data Encryption Algorithm,DEA)的數(shù)據(jù)加密標準(Data Encryption Standard,DES)是規(guī)范的描述,它出自IBM的研究工作,并在 1977 年被美國政府正式采納。它是一種對稱加密算法,很可能是使用最廣泛的密鑰系統(tǒng),特別是在保護金融數(shù)據(jù)的安全中,最初開發(fā)的 DES 是嵌入硬件中的。通常自動取款機(Automated Teller Machine,AT
51、M)都使用 DES。 DES 使用一個56位的密鑰以及附加的8位奇偶校驗位,產生最大64位的分組大小。這是一個迭代的分組密碼,使用稱為Feistel的技術,其中將加密的文本塊分成兩半。使用子密鑰對其中一半應用循環(huán)功能,然后將輸出與另一半進行“異或”運算;接著交換這兩半,這一過程會繼續(xù)下去,但最后一個循環(huán)不交換。DES 使用 16 個循環(huán),使用異或,置換,代換,移位操作四種基本運算。 3.1.2 DES算法的應用誤區(qū) DES算法加密與解密均工作中。唯一需要避免的是:在應用中,避開使用Key的第8,16......64位作為有效數(shù)據(jù)位,從而便避開DES算法在應用中的誤區(qū)。避開
52、DES算法應用誤區(qū)的具體操作在DES密鑰Key的使用、管理及密鑰更換的過程中,應絕對避開DES 算法的應用誤區(qū),即:絕對不能把Key的第8,16,24......64位作為有效數(shù)據(jù)位,來對Key進行管理。這一點,特別推薦給金融銀行界及非金融業(yè)界的領導及決策者們,尤其是負責管理密鑰的人,要對此點予以高度重視。有的銀行金融交易網絡,利用定期更換DES密鑰Key的辦法來進一步提高系統(tǒng)的安全性和可靠性,如果忽略了上述應用誤區(qū),那么,更換新密鑰將是徒勞的,對金融交易網絡的安全運行將是十分危險的,所以更換密鑰一定要保證新Key與舊Key真正的不同,即除了第8,16,24,...64位外其它位數(shù)據(jù)發(fā)生了
53、變化,請務必對此保持高度重視[10]! 3.2 MD5算法 3.2.1 MD5算法原理 MD5的典型應用是對一段信息(Message)產生信息摘要(Message-Digest),以防止被篡改。大家都知道,地球上任何人都有自己獨一無二的指紋,這常常成為公安機關鑒別罪犯身份最值得信賴的方法;與之類似,MD5就可以為任何文件(不管其大小、格式、數(shù)量)產生一個同樣獨一無二的“數(shù)字指紋”,如果任何人對文件做了任何改動,其MD5值也就是對應的“數(shù)字指紋”都會發(fā)生變化。 我們常常在某些軟件下載站點的某軟件信息中看到其MD5值,它的作用就在于我們可以在下載該軟件后,對下載回來的文件
54、用專門的軟件(如Windows MD5 Check等)做一次MD 5校驗,以確保我們獲得的文件與該站點提供的文件為同一文件。利用MD5算法來進行文件校驗的方案被大量應用到軟件下載站、論壇數(shù)據(jù)庫、系統(tǒng)文件安全等方面?! ? 3.2.2 MD5算法的應用 MD5的典型應用是對一段Message(字節(jié)串)產生fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫 readme.txt文件中,并對這個readme.txt產生一個MD5的值并記錄在案,然后你可以傳播這個文件給別人,別人如果修改了文件中的任何內容,你對這個文件重新計算MD5時就會發(fā)現(xiàn)(兩個MD5值不相同
55、)。如果再有一個第三方的認證機構,用MD5還可以防止文件作者的“抵賴”,這就是所謂的數(shù)字簽名應用。 MD5還廣泛用于操作系統(tǒng)的登陸認證上,如Unix、各類BSD系統(tǒng)登錄密碼、數(shù)字簽名等諸多方。如在UNIX系統(tǒng)中用戶的密碼是以MD5(或其它類似的算法)經Hash運算后存儲在文件系統(tǒng)中。當用戶登錄的時候,系統(tǒng)把用戶輸入的密碼進行MD5 Hash運算,然后再去和保存在文件系統(tǒng)中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統(tǒng)在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這可以避免用戶的密碼被具有系統(tǒng)管理員權限的用戶知道。MD5將任意長度的“字節(jié)串”映射
56、為一個128bit的大整數(shù),并且是通過該128bit反推原始字符串是困難的,換句話說就是,即使你看到源程序和算法描述,也無法將一個MD5的值變換回原始的字符串,從數(shù)學原理上說,是因為原始的字符串有無窮多個,這有點象不存在反函數(shù)的數(shù)學函數(shù)。所以,要遇到了md5密碼的問題,比較好的辦法是:你可以用這個系統(tǒng)中的md5()函數(shù)重新設一個密碼,如admin,把生成的一串密碼的Hash值覆蓋原來Hash值就行了[11]。 3.3 RSA算法 3.3.1 RSA算法原理 密鑰對的產生:選擇兩個大素數(shù)p和q 計算: n=p*q 然后隨機選擇加密密鑰e,要求e和(p
57、-1)*(q-1)互質。最后,利用Euclid 算法計算解密密鑰d,滿足: e*d=1(mod(p-1)*(q-1)) 其中n和d也要互質。數(shù)e和n是公鑰,d是私鑰。兩個素數(shù)p和q不再需要,應該丟棄,不要讓任何人知道。 加密信息 m(二進制表示)時,首先把m分成等長數(shù)據(jù)塊 m1 ,m2,..., mi ,塊長s,其中 2^s <= n, s 盡可能的大。對應的密文是: ci=mi^e( mod n) (a) 解密時作如下計算: mi=ci^d( mod n) (b) RSA可用于數(shù)字簽名,
58、方案是用(a)式簽名,(b)式驗證。具體操作時考慮到安全性和m信息量較大等因素,一般是先作HASH運算[12]。 3.3.2 RSA的安全性 RSA的安全性依賴于大數(shù)的因子分解,但并沒有從理論上證明破譯RSA的難度與大數(shù)分解難度等價。即RSA的重大缺陷是無法從理論上把握它的保密性能如何,而且密碼學界多數(shù)人士傾向于因子分解不是NPC問題。RSA的缺點主要有:1)產生密鑰很麻煩,受到素數(shù)產生技術的限制,因而難以做到一次一密。2)分組長度太大,為保證安全性,n 至少也要 600 bits以上,使運算代價很高,尤其是速度較慢,較對稱密碼算法慢幾個數(shù)量級;且隨著大數(shù)分解技術的發(fā)展,這個長度還
59、在增加,不利于數(shù)據(jù)格式的標準化。目前,SET(Secure Electronic Transaction)協(xié)議中要求CA采用2048比特長的密鑰,其他實體使用1024比特的密鑰。 這種算法1978年就出現(xiàn)了,它是第一個既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也很流行。算法的名字以發(fā)明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。但RSA的安全性一直未能得到理論上的證明。RSA的安全性依賴于大數(shù)分解。公鑰和私鑰都是兩個大素數(shù)( 大于 100個十進制位)的函數(shù)。據(jù)猜測,從一個密鑰和密文推斷出明文的難度等同于分解兩個大素數(shù)的積。
60、 3.3.3 RSA的速度 由于進行的都是大數(shù)計算,使得RSA最快的情況也比DES慢上100倍,無論是軟件還是硬件實現(xiàn)。速度一直是RSA的缺陷。一般來說只用于少量數(shù)據(jù)加密。RSA的選擇密文攻擊。RSA在選擇密文攻擊面前很脆弱。一般攻擊者是將某一信息作一下偽裝(Blind),讓擁有私鑰的實體簽署。然后,經過計算就可得到它所想要的信息。實際上,攻擊利用的都是同一個弱點,即存在這樣一個事實:乘冪保留了輸入的乘法結: ( XM )^d = X^d *M^d mod n 前面已經提到,這個固有的問題來自于公鑰密碼系統(tǒng)的最有用的特征--每個人都能使用公鑰。但從算法上無法解決
61、這一問題,主要措施有兩條:一條是采用好的公鑰協(xié)議,保證工作過程中實體不對其他實體任意產生的信息解密,不對自己一無所知的信息簽名;另一條是決不對陌生人送來的隨機文檔簽名,簽名時首先使用One-Way Hash Function對文檔作HASH處理,或同時使用不同的簽名算法。在中提到了幾種不同類型的攻擊方法。 3.4 本章小結 本章詳細介紹了當前比較流行的幾種加密算法,使我們對加密解密有了更深入的了解,從中我們可以看出各種加密算法的安全性,速度,和適用的條件,以便針對不同的問題使用不同的加密算法。那我們在實際使用的過程中究竟該使用哪一種比較好呢? 我們應該根據(jù)自己的使用特點來
62、確定,由于非對稱加密算法的運行速度比對稱加密算法的速度慢很多,當我們需要加密大量的數(shù)據(jù)時,建議采用對稱加密算法,提高加解密速度。對稱加密算法不能實現(xiàn)簽名,因此簽名只能非對稱算法。由于對稱加密算法的密鑰管理是一個復雜的過程,密鑰的管理直接決定著他的安全性,因此當數(shù)據(jù)量很小時,我們可以考慮采用非對稱加密算法。在實際的操作過程中,我們通常采用的方式是:采用非對稱加密算法管理對稱算法的密鑰,然后用對稱加密算法加密數(shù)據(jù),這樣我們就集成了兩類加密算法的優(yōu)點,既實現(xiàn)了加密速度快的優(yōu)點,又實現(xiàn)了安全方便管理密鑰的優(yōu)點。 如果在選定了加密算法后,那采用多少位的密鑰呢?一般來說,密鑰越長,運行的速度就越
63、慢,應該根據(jù)的我們實際需要的安全級別來選擇,一般來說,RSA建議采用1024位的數(shù)字,如果有更高的保密要求,可采用2048位數(shù)字。 通過比較分析,本設計決定使用RSA加密算法加密生成注冊碼,雖然RSA算法沒有DES算法速度快,但是RSA加密解密使用不同的非對稱密鑰這是它的優(yōu)勢。本設計注冊碼的生成是在注冊機上完成的,注冊碼的驗證在客服端程序上,客戶端程序段中含有解密時使用的密鑰,如我們使用DES對稱密鑰算法加密,破解人員很容就能根據(jù)客服端程序寫出自己的注冊機,從而完成注冊,在軟件保護中,這是很不安全的。但我們使用RSA加密算法,這些問題就迎刃而解了,因為RSA算法的密鑰對私鑰和公鑰是非
64、對稱的,客服端程序驗證時使用公鑰進行解密,注冊機由開發(fā)商保管,注冊機使用私鑰加密生成注冊碼,破解者根據(jù)公鑰推導出私鑰在理論上是不可能的,開發(fā)商為了增大破解難度,還可以加長密鑰的位數(shù)和分組的長度,這使得該軟件在其生命周期內可以有效避免被人破解,非法使用。 4 系統(tǒng)詳細設計及實現(xiàn) 4.1 開發(fā)環(huán)境介紹 4.1.1 Visual C++ 6.0 介紹 用 VC6 編寫并處理的任何程序都與工程有關(都要創(chuàng)建一個與其相關的工程),而每一個工程又總與一個工程工作區(qū)相關聯(lián)。實際上,VC6 是通過工程工作區(qū)來組織工程及其各相關元素的,就好像是一個工作間(對應于一個獨立的文件夾
65、,或稱子目錄),以后程序所牽扯到的所有的文件、資源等元素都將放入到這一工作間中,從而使得各個工程之間互不干擾,使編程工作更有條理,更具模塊化。最簡單情況下,一個工作區(qū)中用來存放一個工程,代表著某一個要進行處理的程序(我們先學習這種用法)。但如果需要,一個工作區(qū)中也可以用來 存放多個工程,其中可以包含該工程的子工程或者與其有依賴關系的其他工程。 可看出,工程工作區(qū)就像是一個“容器”,由它來“盛放”相關工程的所有有關信息,當創(chuàng)建新工程時,同時要創(chuàng)建這樣一個工程工作區(qū),而后則通過該工作窗口來觀察與存取此工程的各種元素及其有關信息。創(chuàng)建工程工作區(qū)之后,系統(tǒng)將創(chuàng)建出一個相應的工作區(qū)文件(.d
66、sw),用來存放與該工作區(qū)相關的信息;另外還將創(chuàng)建出的其他幾個相關文件是:工程文件(.dsp)以及選擇信息文件(.opt) 等。 編制并處理 C++程序時要創(chuàng)建工程,VC6已經預先為用戶準備好了近20 種不同的工程類型以供選擇,選定不同的類型意味著讓 VC6 系統(tǒng)幫著提前做某些不同的準備以及初始化工作(例如,事先為用戶自動生成一個所謂的底層程序框架或稱框架程序,并進行某些隱含設置,如隱含位置、預定義常量、輸出結果類型等)。工程類型中,其中有一個為“MFC AppWizard(exe)”如圖4.1所示,它是我們本設計要掌握的、用來編制具有可視化窗體界面運行C++程序的工程。 圖4.1 Visual C++ 6.0開發(fā)環(huán)境 4.1.2 MFC程序開發(fā)流程 4.1.2.1 MFC介紹 MFC,微軟基礎類(Microsoft Foundation Classes),同VCL類似,是一種Application Framework,隨微軟Visual C++ 開發(fā)工具發(fā)布。目前最新版本為9.0(截止2008年11月)。該類庫提供一組通用的可重用的類庫供開發(fā)人員使用。
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。