基于硬盤(pán)序列號(hào)和RSA算法的軟件加密系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn) 畢業(yè)設(shè)計(jì)論文_第1頁(yè)
基于硬盤(pán)序列號(hào)和RSA算法的軟件加密系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn) 畢業(yè)設(shè)計(jì)論文_第2頁(yè)
基于硬盤(pán)序列號(hào)和RSA算法的軟件加密系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn) 畢業(yè)設(shè)計(jì)論文_第3頁(yè)
基于硬盤(pán)序列號(hào)和RSA算法的軟件加密系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn) 畢業(yè)設(shè)計(jì)論文_第4頁(yè)
基于硬盤(pán)序列號(hào)和RSA算法的軟件加密系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn) 畢業(yè)設(shè)計(jì)論文_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

基于硬盤(pán)序列號(hào)和RSA算法的軟件加密系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)摘要隨著計(jì)算機(jī)軟件業(yè)的飛速發(fā)展和計(jì)算機(jī)的日益普及計(jì)算機(jī)軟件已經(jīng)進(jìn)入社會(huì)生活中的各個(gè)角落。但是由于計(jì)算機(jī)軟件易于復(fù)制,所以隨之而來(lái)的便是盜版軟件的泛濫。這使軟件開(kāi)發(fā)人員蒙受了巨大的經(jīng)濟(jì)和社會(huì)損失,防止軟件盜版最行之有效的方法就是對(duì)軟件進(jìn)行有效的加密。論文首先介紹了軟件加密的發(fā)展現(xiàn)狀和研究它的意義,接著對(duì)軟件序列號(hào)保護(hù)的相關(guān)技術(shù)分析和當(dāng)前流行的加密算法詳細(xì)研究?;谝陨侠碚摶A(chǔ),將本設(shè)計(jì)的基于硬盤(pán)序列號(hào)和RSA算法軟件加密系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)劃分為兩個(gè)層次:采用動(dòng)態(tài)鏈接庫(kù)文件DiskSerial.DLL導(dǎo)出的GetSerialNumber()函數(shù)獲取硬盤(pán)的物理序列號(hào),動(dòng)態(tài)鏈接庫(kù)的好處是可以采用多種編程語(yǔ)言來(lái)編寫(xiě),增強(qiáng)產(chǎn)品的功能,提供二次開(kāi)發(fā)的平臺(tái),簡(jiǎn)化項(xiàng)目管理,節(jié)省磁盤(pán)空間和內(nèi)存,有助于資源的共享;注冊(cè)機(jī)使用RSA加密算法將硬盤(pán)物理序列號(hào)加密生成為注冊(cè)碼,客戶(hù)端將注冊(cè)碼進(jìn)行解密運(yùn)算,其結(jié)果與獲取的本地計(jì)算機(jī)硬盤(pán)物理序列號(hào)對(duì)比,驗(yàn)證注冊(cè)碼的合法性。加密解密使用非對(duì)稱(chēng)密鑰RSA算法,私鑰和公鑰不同,理論上從公鑰推算出私鑰是不可行的,當(dāng)密鑰長(zhǎng)度達(dá)到1024位時(shí),破解難度極大,所以使用RSA算法加密確保了軟件的安全性。本設(shè)計(jì)因?yàn)槭褂玫男蛄刑?hào)是硬盤(pán)物理序列號(hào),及每臺(tái)電腦的序列號(hào)是不同的,從而保證了注冊(cè)碼的唯一性。經(jīng)過(guò)調(diào)試和測(cè)試的驗(yàn)證,本設(shè)計(jì)結(jié)構(gòu)簡(jiǎn)單,性能可靠,操作方便。本設(shè)計(jì)在軟件保護(hù)行業(yè)有著廣泛的使用價(jià)值,如在軟件防盜中,用作注冊(cè)碼的生成與驗(yàn)證等。關(guān)鍵詞:硬盤(pán)物理序列號(hào);RSA算法;注冊(cè)機(jī);軟件加密SystemdesignandimplementationofencryptionsystembasedonharddiskserialnumberandRSAalgorithmStudent:LIZhong-jieTeacher:ZHANGLie-pingAbstract:Withtherapiddevelopmentofcomputersoftwareindustry,andtheincreasingpopularityofcomputersoftwarehasenteredeverycornerofsociallife.However,becausecomputersoftwareiseasytoreplicate,sowhatcomesnextistheproliferationofpiratedsoftware.Thisallowssoftwaredeveloperssufferedhugeeconomicandsocialloss,topreventsoftwarepiracyisthemosteffectivewaytoencryptthesoftwareeffectively.First,thepaperintroducesthecurrentdevelopmentofsoftwareencryptionandresearchitsmeaning,thentheserialnumberofsoftwarerelatedtotechnicalanalysisandprotectionofthepopularencryptionalgorithmindetail.Basedontheabovetheory,thisdesignbasedontheharddiskserialnumberandtheRSAencryptionalgorithmsoftware,systemdesignandimplementationisdividedintotwolevels:thedynamiclinklibraryfilesDiskSerial.DLLexportedGetSerialNumber()functiontogettheharddriveofthephysicsserialnumber,Theadvantageofthedynamiclinklibrarycanbewrittenusingavarietyofprogramminglanguages,andenhanceproduct'sfeatures,provideseconddevelopmentplatform,simplifyingprojectmanagement,savingdiskspaceandmemorytohelpresourcesharing;KeygenusingRSAalgorithmencrypttheharddiskphysicalserialnumberofstudentstobecomeregistrationkey,registrationkeytodecrypttheclientwilloperation,itsresultsforthelocalcomputerharddiskphysicalserialnumbercontrast,validationLicenselegitimacy.EncryptionanddecryptionusingRSAasymmetrickeyalgorithm,theprivatekeyandpublickeydifference,intheorycalculatetheprivatekeyfromthepublickeyisnotfeasible,whenthe1024-bitkeylength,thecrackisextremelydifficult,sousetheRSAencryptionalgorithmtoensurethesecurityofthesoftware.Thedesignforusingtheserialnumberishardphysicalserialnumber,andserialnumberofeachcomputerisdifferent,thusensuringtheregistrationcodeisunique.Aftercommissioningandtestingoftheverification,thedesignissimple,reliable,easytooperate.Thedesignofthesoftwareprotectionindustryhasawiderangeofvalue,suchassoftwaresecurity,theregistrationcodeforthegenerationandverification.Keywords:sharddiskphysicalserialnumber;RSAalgorithm;keygen;softwareencryption目次TOC\o"1-3"\h\u14765摘要 I1470Abstract II106881緒論 1159461.1問(wèn)題的提出及研究意義 1295421.2軟件保護(hù)系統(tǒng)概念 1242151.3課題研究?jī)?nèi)容及論文的主要工作 254762軟件序列號(hào)保護(hù)的相關(guān)技術(shù)介紹 3132.1序列號(hào)保護(hù)機(jī)制 3272222.1.1注冊(cè)碼保持不變 3262102.1.2注冊(cè)碼因輸入信息而異 3216222.1.3注冊(cè)碼因用戶(hù)計(jì)算機(jī)而異 4273312.2注冊(cè)機(jī)信息采集技術(shù) 4124672.2.1網(wǎng)卡的物理地址(MAC)獲取 412912.2.2磁盤(pán)邏輯序列號(hào)獲取 549902.2.3磁盤(pán)物理序列號(hào)獲取 530412.3常用的軟件保護(hù)技術(shù)介紹 794582.3.1時(shí)間限制 7191372.3.2KeyFile保護(hù) 9243852.3.3CD-CHECK 9177102.4軟件保護(hù)總結(jié) 9188292.5本章小結(jié) 10308893加密算法介紹 11231973.1DES算法 11151303.1.1DES算法原理 11189483.1.2DES算法的應(yīng)用誤區(qū) 114673.2MD5算法 1129973.2.1MD5算法原理 11320823.2.2MD5算法的應(yīng)用 12207703.3RSA算法 1262533.3.1RSA算法原理 1211023.3.2RSA的安全性 1375693.3.3RSA的速度 1352493.4本章小結(jié) 1469664系統(tǒng)詳細(xì)設(shè)計(jì)及實(shí)現(xiàn) 15270014.1開(kāi)發(fā)環(huán)境介紹 15104254.1.1VisualC++6.0介紹 15146724.1.2MFC程序開(kāi)發(fā)流程 16305184.2大進(jìn)制數(shù)及其運(yùn)算類(lèi)定義 2077954.2.1大數(shù)類(lèi)的詳細(xì)描述 20138584.2.2大數(shù)類(lèi)的類(lèi)定義 21302924.3注冊(cè)機(jī)的設(shè)計(jì)及實(shí)現(xiàn) 22209094.3.1注冊(cè)機(jī)界面設(shè)計(jì) 2258334.3.2注冊(cè)機(jī)算法的詳細(xì)描述 253064.3.3算法的實(shí)現(xiàn)代碼 2659334.3.4完成的注冊(cè)機(jī)程序 2836574.4客戶(hù)端的設(shè)計(jì)及實(shí)現(xiàn) 2950554.4.1客戶(hù)端界面設(shè)計(jì) 29166864.4.2各種接口硬盤(pán)介紹 30176274.4.3客戶(hù)端算法詳細(xì)描述 3214354.4.4完成的客戶(hù)端程序 34207234.5本章小結(jié) 36131355結(jié)論 3714208致謝 3832716參考文獻(xiàn) 391緒論 1.1問(wèn)題的提出及研究意義計(jì)算機(jī)軟件業(yè)的飛速發(fā)展和計(jì)算機(jī)的日益普及計(jì)算機(jī)軟件已經(jīng)進(jìn)入社會(huì)生活中的各個(gè)角落。計(jì)算機(jī)軟件是開(kāi)發(fā)者腦力勞動(dòng)的成果,具有原創(chuàng)性質(zhì)[1]。計(jì)算機(jī)軟件開(kāi)發(fā)要求軟件開(kāi)發(fā)人員擁有豐富的專(zhuān)業(yè)相關(guān)知識(shí),具備優(yōu)秀的邏輯思維和抽象思維能力,了解計(jì)算機(jī)硬件與軟件的最新發(fā)展?fàn)顩r與發(fā)展趨勢(shì),熟練掌握和應(yīng)用編程語(yǔ)言。尤其是開(kāi)發(fā)具有大規(guī)模商業(yè)應(yīng)用的計(jì)算機(jī)軟件,通常需要專(zhuān)業(yè)分工、流水作業(yè)。必須具有的充足的物質(zhì)條件和良好的技術(shù)儲(chǔ)備。而計(jì)算機(jī)軟件的復(fù)制是對(duì)計(jì)算機(jī)軟件的客觀再現(xiàn),不改變軟件內(nèi)容,不影響軟件本身的價(jià)值,而把軟件轉(zhuǎn)載于有形物體的行為。由于軟件存在形式的特殊性,它比傳統(tǒng)的作品更容易被復(fù)制,且復(fù)制所需投入少、耗時(shí)短、傳播容易,無(wú)需借助特殊的裝置。尤其在網(wǎng)絡(luò)環(huán)境下計(jì)算機(jī)軟件的復(fù)制與傳播就更為方便,從而使盜版侵權(quán)成了輕易又且暴利的事情。這使軟件開(kāi)發(fā)人員蒙受了巨大的經(jīng)濟(jì)和社會(huì)損失,防止軟件盜版最行之有效的方法就是對(duì)軟件進(jìn)行有效的加密[2]。隨著軟件的防盜版措施越來(lái)越被軟件開(kāi)發(fā)者所重視,其采用的技術(shù)也變得越來(lái)越廣泛和復(fù)雜。軟件的破解技術(shù)與保護(hù)技術(shù)這兩者之間就是矛與盾的關(guān)系,它們是在互相斗爭(zhēng)中發(fā)展進(jìn)化的。這種技術(shù)上的較量歸根到底是一種利益的沖突。軟件開(kāi)發(fā)者為了維護(hù)自身的商業(yè)利益,不斷地尋找各種有效地技術(shù)來(lái)保護(hù)軟件版權(quán),以增加其保護(hù)強(qiáng)度,推遲軟件被破解的時(shí)間;而破解者則受盜版所帶來(lái)的高額利潤(rùn)的驅(qū)使,或出于純粹的個(gè)人興趣,而不斷制作新的破解工具并針對(duì)新出現(xiàn)的保護(hù)方式進(jìn)行跟蹤分析以找到相應(yīng)的破解方法。從理論上說(shuō),幾乎沒(méi)有破解不了的保護(hù)。但是如果一種保護(hù)技術(shù)的強(qiáng)大強(qiáng)到足以讓破解者在軟件的生命周期內(nèi)無(wú)法將其完全破解,這種保護(hù)技術(shù)就可以說(shuō)是非常成功的。因此,開(kāi)發(fā)研制一種安全可靠、難以破解軟件加密系統(tǒng)具有重大的經(jīng)濟(jì)意義和社會(huì)意義。1.2軟件保護(hù)系統(tǒng)概念軟件與普通作品不同,天生即具有技術(shù)屬性。軟件本身就是實(shí)現(xiàn)技術(shù)的一段計(jì)算機(jī)可以識(shí)別的編碼。因此,在既有功能的基礎(chǔ)上,很容易添加新的功能代碼用于保護(hù)版權(quán)。這也意味著,相對(duì)于其他普通作品,在軟件保護(hù)中使用技術(shù)手段的成本最低,效率最高。對(duì)于軟件而言,通過(guò)對(duì)軟件進(jìn)行加密等技術(shù)保護(hù)手段可以有效的防止他人對(duì)軟件擅自訪問(wèn)、復(fù)制、操作、散發(fā)及傳播,同時(shí)也便于控制軟件正常的授權(quán)使用以及使用后的監(jiān)督。目前各國(guó)對(duì)于軟件的保護(hù)性技術(shù)措施都有比較明確的概念。美國(guó)將技術(shù)措施的定義為“任何能夠有效控制進(jìn)入受版權(quán)保護(hù)的作品并能夠有效保護(hù)版權(quán)人權(quán)利的措施?!倍鴼W盟的定義為“設(shè)計(jì)用于阻止侵犯版權(quán)以及與數(shù)據(jù)庫(kù)有關(guān)的特殊權(quán)利的設(shè)備、產(chǎn)品或方法?!钡羌夹g(shù)措施事實(shí)上是一個(gè)開(kāi)放的系統(tǒng),隨著技術(shù)的不斷進(jìn)步,不斷地會(huì)有新類(lèi)型的技術(shù)保護(hù)措施的涌現(xiàn)。本文出發(fā)點(diǎn)即是通過(guò)硬盤(pán)物理序列號(hào)用RSA算法生成唯一的注冊(cè)碼,從而對(duì)軟件進(jìn)行保護(hù)。軟件權(quán)利人通過(guò)對(duì)軟件等數(shù)字化形式存在的作品上設(shè)置的能夠?qū)崿F(xiàn)對(duì)作品的訪問(wèn)、復(fù)制、傳播、修改和使用進(jìn)行有效控制的各種技術(shù)手段、設(shè)備、產(chǎn)品或方法,并借此達(dá)到對(duì)作品未經(jīng)授權(quán)的訪問(wèn)、復(fù)制、傳播、修改與使用行為的警示、禁止甚至制裁的目的。這些技術(shù)手段、設(shè)備、產(chǎn)品或方法的實(shí)施階段既包括在出售前與軟件本體打包封裝,亦包括在出售后通過(guò)在線(xiàn)升級(jí)、認(rèn)證等方式加載。上述的這一類(lèi)的技術(shù)手段、設(shè)備、產(chǎn)品或方法統(tǒng)稱(chēng)為軟件保護(hù)技術(shù)[3]。1.3課題研究?jī)?nèi)容及論文的主要工作本課題研究?jī)?nèi)容主要有:MFC編程技術(shù)、軟件保護(hù)技術(shù)概述、動(dòng)態(tài)鏈接庫(kù)文件的生產(chǎn)導(dǎo)入、獲得Ring0級(jí)權(quán)限、獲取硬盤(pán)物理序列號(hào)、定義大整數(shù)及其運(yùn)算法則類(lèi)、RSA非對(duì)稱(chēng)密鑰加密解密算法、素?cái)?shù)的判定和密鑰對(duì)的生成;在了解以上技術(shù)之后,確定了各個(gè)模塊的工作原理及作用,最后根據(jù)要實(shí)現(xiàn)的功能要求,繪制流程圖,由流程圖應(yīng)用C++語(yǔ)言編寫(xiě)程序。本論文的主要工作如下:1)了解軟件盜版的嚴(yán)重性,以及軟件防盜的現(xiàn)狀和發(fā)展趨勢(shì)。2)了解軟件產(chǎn)品的特點(diǎn),深入分析軟件易于復(fù)制傳播的原因。掌握軟件保護(hù)系統(tǒng)概念,熟悉軟件保護(hù)中常用的技術(shù)手段。4)掌握MFC可視化編程常用的方法,動(dòng)態(tài)鏈接庫(kù)文件的制作和該文件的導(dǎo)入。5)了解常用的進(jìn)入Ring0級(jí)權(quán)限的三種方法:第一種通過(guò)中斷陷入技術(shù),第二種通過(guò)寫(xiě)一個(gè)中斷VXD(虛擬驅(qū)動(dòng)設(shè)備)或WDM,最后一種通過(guò)WindowsAPI函數(shù)DeviceInControl調(diào)用Smartvsdvxd。掌握動(dòng)態(tài)鏈接庫(kù)導(dǎo)出函數(shù)獲取硬盤(pán)物理序列號(hào)。6)掌握大數(shù)類(lèi)的定義,大數(shù)類(lèi)中定義了賦值、比較大小、加法、減法、乘法、除法、求模等基本運(yùn)算法則。7)了解常用的加密算法,掌握RSA非對(duì)稱(chēng)加密算法的原理,隨機(jī)生成密鑰對(duì)(e,n)和(d,n)。熟悉序列號(hào)的加密和注冊(cè)碼的解密。8)根據(jù)功能需求,畫(huà)出程序流程圖,應(yīng)用C++語(yǔ)言編寫(xiě)應(yīng)用程序。2軟件序列號(hào)保護(hù)的相關(guān)技術(shù)介紹2.1序列號(hào)保護(hù)機(jī)制數(shù)學(xué)算法一項(xiàng)都是密碼加密的核心,但在一般的軟件加密中,它似乎并不太為人們關(guān)心,因?yàn)榇蠖鄶?shù)時(shí)候軟件加密本身實(shí)現(xiàn)的都是一種編程的技巧。但近幾年來(lái)隨著序列號(hào)加密程序的普及,數(shù)學(xué)算法在軟件加密中的比重似乎是越來(lái)越大了。所謂序列號(hào)保護(hù)機(jī)制就是軟件開(kāi)發(fā)者根據(jù)用戶(hù)提供的一些信息,然后使用數(shù)學(xué)算法生成注冊(cè)碼。用戶(hù)得到注冊(cè)碼后,經(jīng)過(guò)逆運(yùn)算得到的結(jié)果跟自己提供的信息對(duì)比,從而確定軟件注冊(cè)碼的合法性。因?yàn)椴杉挠脩?hù)信息類(lèi)型不同,所以就有了多種類(lèi)型的注冊(cè)碼。2.1.1注冊(cè)碼保持不變注冊(cè)碼保持不變就是說(shuō)不管是哪個(gè)用戶(hù)在哪個(gè)臺(tái)電腦上都能注冊(cè),整個(gè)軟件的安全性寄托在注冊(cè)碼本身的保密上,只要注冊(cè)碼泄漏了,所有人都可以注冊(cè)該軟件。早期的軟件保護(hù)都采用一串復(fù)雜的字符串作為注冊(cè)碼,因?yàn)楫?dāng)時(shí)的網(wǎng)絡(luò)并不發(fā)達(dá),加上注冊(cè)碼本身難于記憶,所以個(gè)人所擁有的注冊(cè)碼一般情況下,是不容易被大量用戶(hù)非法盜用的。隨著時(shí)間的推移,網(wǎng)絡(luò)逐漸普及,覆蓋面越來(lái)越廣,早期軟件保護(hù)防盜的方法面臨前所未有的挑戰(zhàn),只要有一個(gè)人把自己一款軟件的合法注冊(cè)碼發(fā)布在網(wǎng)上,其他使用該軟件的用戶(hù)就能很容易的利用搜索引擎找到此注冊(cè)碼,成功的注冊(cè)自己的軟件,而無(wú)需支付相應(yīng)的費(fèi)用,這給軟件開(kāi)發(fā)商造成了巨大的損失?,F(xiàn)在已經(jīng)很少有人使用注冊(cè)碼保持不變的方法保護(hù)軟件,此方法已經(jīng)慢慢淡出了人們的視線(xiàn)。2.1.2注冊(cè)碼因輸入信息而異這是傳統(tǒng)的注冊(cè)碼保護(hù)方法,根據(jù)用戶(hù)輸入的不同信息(如用戶(hù)名)產(chǎn)生注冊(cè)碼,這種方法產(chǎn)生的注冊(cè)碼和用戶(hù)的信息存在簡(jiǎn)單的對(duì)應(yīng)機(jī)制,安全性極差,只要“用戶(hù)名”和“注冊(cè)碼”泄漏就可以無(wú)限制地在任何計(jì)算機(jī)上注冊(cè)使用。網(wǎng)絡(luò)上大量的“注冊(cè)用戶(hù)”和“注冊(cè)碼”使軟件的保護(hù)形同虛設(shè)[4]。注冊(cè)碼保持不變的方法失利之后,軟件保護(hù)行業(yè)亟需一種有效地保護(hù)方法,于是在原來(lái)的方法上改進(jìn)為使用注冊(cè)時(shí)輸入的信息和注冊(cè)碼對(duì)應(yīng)的方式保護(hù)軟件,防止盜用,因?yàn)樯勺?cè)碼時(shí)時(shí)用戶(hù)輸入的用戶(hù)名只有用戶(hù)自己知道,因此,就算是本軟的某個(gè)注冊(cè)碼被別人知道了,但是不知道與這個(gè)注冊(cè)碼對(duì)應(yīng)的用戶(hù)名,同樣還是不能注冊(cè)成功。所以整個(gè)軟件的安全全部寄托在了用戶(hù)對(duì)自己信息的保密程度,只要某個(gè)用戶(hù)把自己的注冊(cè)碼和用戶(hù)名公開(kāi),或是黑客通過(guò)木馬獲取到了相關(guān)信息,那么其他人就可以用這些信息成功的注冊(cè)該軟件。2.1.3注冊(cè)碼因用戶(hù)計(jì)算機(jī)而異根據(jù)用戶(hù)計(jì)算機(jī)各種軟硬件信息:如CPUID、分區(qū)卷標(biāo)、硬盤(pán)大小、硬盤(pán)物理序列號(hào)、網(wǎng)卡號(hào)等等。通過(guò)這些信息可以將任意兩臺(tái)機(jī)器區(qū)分出來(lái),從而可以生成一段唯一的序列號(hào)。這些信息中有的是不可取的,例如分區(qū)卷標(biāo)這種不穩(wěn)定信息,因其僅與軟件系統(tǒng)有關(guān)。而有一些是無(wú)法得到的,例如當(dāng)機(jī)器中沒(méi)有網(wǎng)卡時(shí)或早于PentiumIII型號(hào)的CPU,網(wǎng)卡號(hào)和CPUID就得不到了[5]。網(wǎng)絡(luò)的普及,因一個(gè)注冊(cè)碼泄漏而可以無(wú)限制的注冊(cè)該軟件的問(wèn)題越發(fā)突出,軟件開(kāi)發(fā)商為了能保護(hù)自己的合法權(quán)益,開(kāi)發(fā)出了一套新的軟件保護(hù)方法,這也是現(xiàn)階段最主要的保護(hù)方式,因計(jì)算機(jī)不同而生成不同的注冊(cè)碼。這種注冊(cè)碼一般都是與本機(jī)的相關(guān)的具有唯一性的一種或多種物理信息,這種物理信息是出廠時(shí)就確定了的,一般是固化在了計(jì)算機(jī)內(nèi)部,不能修改,因此生成的注冊(cè)碼即使是發(fā)布在了網(wǎng)上,別的人還是無(wú)法使用該注冊(cè)碼注冊(cè)自己的軟件,因?yàn)樽约旱挠?jì)算機(jī)硬件的相關(guān)信息和本注冊(cè)碼不相關(guān)。有了這種全新的軟件保護(hù)方式,軟件開(kāi)發(fā)商就能在網(wǎng)絡(luò)環(huán)境中很容易的保護(hù)自己的利益,避免軟件被非法盜版。2.2注冊(cè)機(jī)信息采集技術(shù)注冊(cè)機(jī)信息采集技術(shù)是指利用計(jì)算機(jī)軟件技術(shù),針對(duì)計(jì)算機(jī)相關(guān)軟硬件信息進(jìn)行采集保存,從而為各種信息服務(wù)系統(tǒng)提供數(shù)據(jù)輸入的整個(gè)過(guò)程。硬件信息包括CPUID、網(wǎng)卡物理地址(MAC)、硬盤(pán)的相關(guān)物理信息例如硬盤(pán)物理序列號(hào)等等。這些硬件物理信息有些可以通過(guò)windows提供的API函數(shù)直接獲取,有些需要自己編寫(xiě)相關(guān)的函數(shù),而且在windows下,必須編寫(xiě)一個(gè)驅(qū)動(dòng)程序或通過(guò)一定的技術(shù)手段獲取,例如,硬盤(pán)信息的獲取操作,需要運(yùn)行在Ring0級(jí)別,而正常情況,windows的應(yīng)用程序是運(yùn)行在Ring3級(jí)的,因此在獲取硬盤(pán)物理信息前,必須通過(guò)一定的技術(shù)方法進(jìn)入windows的Ring0級(jí)。2.2.1網(wǎng)卡的物理地址(MAC)獲取MAC(MediaAccessControl,介質(zhì)訪問(wèn)控制)MAC地址是燒錄在NetworkInterfaceCard(網(wǎng)卡,NIC)里的。MAC地址,也叫硬件地址,是由48比特長(zhǎng)(6字節(jié)),16進(jìn)制的數(shù)字組成。0-23位叫做組織唯一標(biāo)志符(organizationallyunique),是識(shí)別LAN(局域網(wǎng))節(jié)點(diǎn)的標(biāo)識(shí),24-47位是由廠家自己分配,其中第40位是組播地址標(biāo)志位。網(wǎng)卡的物理地址通常是由網(wǎng)卡生產(chǎn)廠家燒入網(wǎng)卡的EPROM(一種閃存芯片,通??梢酝ㄟ^(guò)程序擦寫(xiě)),它存儲(chǔ)的是傳輸數(shù)據(jù)時(shí)真正賴(lài)以標(biāo)識(shí)發(fā)出數(shù)據(jù)的電腦和接收數(shù)據(jù)的主機(jī)的地址。也就是說(shuō),在網(wǎng)絡(luò)底層的物理傳輸過(guò)程中,是通過(guò)物理地址來(lái)識(shí)別主機(jī)的,它一般也是全球唯一的。比如,著名的以太網(wǎng)卡,其物理地址是48bit(比特位)的整數(shù),如:44-45-53-54-00-00,以機(jī)器可讀的方式存入主機(jī)接口中。以太網(wǎng)地址管理機(jī)構(gòu)(除了管這個(gè)外還管別的)(IEEE)(IEEE:電氣和電子工程師協(xié)會(huì))將以太網(wǎng)地址,也就是48比特的不同組合,分為若干獨(dú)立的連續(xù)地址組,生產(chǎn)以太網(wǎng)網(wǎng)卡的廠家就購(gòu)買(mǎi)其中一組,具體生產(chǎn)時(shí),逐個(gè)將唯一地址賦予以太網(wǎng)卡。形象的說(shuō),MAC地址就如同我們身份證上的身份證號(hào)碼,具有全球唯一性。眾所周知,一個(gè)網(wǎng)卡對(duì)應(yīng)唯一MAC地址,對(duì)一些應(yīng)用程序來(lái)說(shuō),獲取網(wǎng)卡MAC地址有時(shí)是必要的,使用VC提供的NetBIOS網(wǎng)絡(luò)編程接口可以方便獲取網(wǎng)卡MAC地址。NetBIOS中所有的函數(shù)聲明、常數(shù)等等均是在頭文件nb30.h內(nèi)定義的,nb30.h中一些類(lèi)型在wtypes.h中定義,另外,若想使用NetBIOS,須連接的庫(kù)是netapi.dll。2.2.2磁盤(pán)邏輯序列號(hào)獲取硬盤(pán)的磁盤(pán)邏輯序列號(hào)的獲取很簡(jiǎn)單,可直接調(diào)用windows的API函數(shù)GetVolumeInformation()獲取硬盤(pán)的邏輯序列號(hào)[6]。該函數(shù)如下所示:GetVolumeInformation(

lpRootPathName:PChar;{磁盤(pán)驅(qū)動(dòng)器代碼字符串}

lpVolumeNameBuffer:PChar;{磁盤(pán)驅(qū)動(dòng)器卷標(biāo)名稱(chēng)}

nVolumeNameSize:DWORD;{磁盤(pán)驅(qū)動(dòng)器卷標(biāo)名稱(chēng)長(zhǎng)度}

lpVolumeSerialNumber:PDWORD;{磁盤(pán)驅(qū)動(dòng)器卷標(biāo)序列號(hào)}

varlpMaximumComponentLength:DWORD;{系統(tǒng)允許的最大文件名長(zhǎng)度}

varlpFileSystemFlags:DWORD;{文件系統(tǒng)標(biāo)識(shí)}

lpFileSystemNameBuffer:PChar;{文件操作系統(tǒng)名稱(chēng)}

nFileSystemNameSize:DWORD{文件操作系統(tǒng)名稱(chēng)長(zhǎng)度}

):BOOL;采用注冊(cè)碼的保護(hù)方式,最好是一機(jī)一碼,即注冊(cè)碼與機(jī)器特征相關(guān),這樣一臺(tái)機(jī)器上的注冊(cè)碼就無(wú)法在另外一臺(tái)機(jī)器上使用,可以防止有人散播注冊(cè)碼,然而硬盤(pán)邏輯序列號(hào)用相關(guān)工具可以修改其值,所以使用邏輯序列號(hào)不安全。2.2.3磁盤(pán)物理序列號(hào)獲取硬盤(pán)的序列號(hào)是廠家設(shè)定的,且只能用I/O指令讀取,所以,這在以前的DOS時(shí)根本不是什么問(wèn)題,方法非常簡(jiǎn)單,如下面的代碼所示:

staticintWaitIde(){

intal;

while((al=inp(0x1F7))>=0x80);

returnal;

}

staticvoidReadIDE(){

intal;

inti;

WORDpw[256];

WaitId();

outp(0x1F6,0xA0);

al=WaitIde();

if((al&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);

}

}

至此,關(guān)于IDE硬盤(pán)的信息已經(jīng)在pw數(shù)組中了,需要注意的是該數(shù)組是一個(gè)WORD類(lèi)型,硬盤(pán)的序列號(hào)存放于pw[10]開(kāi)始的10個(gè)WORD中,使用時(shí)需要將每個(gè)WORD的高低字節(jié)顛倒一下。真正有點(diǎn)麻煩的是在Windows95/98下,I/O指令作為特權(quán)指令在應(yīng)用程序級(jí)別,即Ring3是不可使用的,所以上面的代碼在執(zhí)行到WaitIde()時(shí)會(huì)陷到死循環(huán)中,原因就是IN0x1F7總是返回0xFF容易想到的解決辦法是寫(xiě)一個(gè)VxD,因?yàn)閂xD運(yùn)行Ring0級(jí)別上,即最高特權(quán)級(jí)上,所以所有的指令都是可用的,硬盤(pán)物理序列號(hào)的獲取需要使用特權(quán)指令,要進(jìn)入Ring0特權(quán)級(jí)常用的還有兩種方法:1)中斷陷入技術(shù);2)通過(guò)WindowsAPI函數(shù)DeviceInControl調(diào)用Smartvsdvxd。其中第一種方法相對(duì)簡(jiǎn)單實(shí)用,但不能取得NT下的Ring0級(jí),因?yàn)镹T下得不到中斷向量表,本文只介紹第一種方法的實(shí)現(xiàn)機(jī)制。計(jì)算機(jī)操作系統(tǒng)都有一個(gè)中斷描述表(IDT),該表有IDTR寄存器指向。矢量號(hào)作為IDT表的索引,從IDT表中獲取一個(gè)8字節(jié)的門(mén)描述符。在門(mén)中包含48位的全指針及占用了16位的屬性。48位的全指針包含32位的偏移量及16位的選擇子。這里的偏移量分為兩個(gè)部分存放。全指針的選擇子部分存放在m+2及m+3字節(jié),偏移量的低16位存放在m及m+1字節(jié),高16位存放在m+6及m+7字節(jié)。在門(mén)描述符中,屬性位存放在m+4及m+5字節(jié)。P為存在位,P=1表示門(mén)有效,P=0表示門(mén)無(wú)效,使用無(wú)效門(mén)將引起異常。DPL為描述符特權(quán)級(jí),定義與門(mén)相聯(lián)系的特權(quán)級(jí)。門(mén)的DPL只在INTn及INTO時(shí)進(jìn)行檢查,以避免應(yīng)用程序執(zhí)行INTn時(shí),使用了各種設(shè)備在中斷表中使用的矢量號(hào)。對(duì)于所有其它的異?;蛑袛?,忽略門(mén)DPL。DT為DType位,用于區(qū)分儲(chǔ)存段(DT=1)及非儲(chǔ)存段(及系統(tǒng)段或門(mén),DT=0)。我們現(xiàn)在討論的是門(mén)描述符,故此處有DT=0。Type為四位類(lèi)型字段,用于定義門(mén)的類(lèi)型:5為任務(wù)門(mén);6為286中斷門(mén);7為286陷阱門(mén);14為386中斷門(mén);15為386陷阱門(mén)。我們利用重新定義門(mén)描述符的偏移量將自己的程序放入中斷中,通過(guò)執(zhí)行中斷從而得到Ring0級(jí)的權(quán)限來(lái)讀到硬盤(pán)序列號(hào)[7]。2.3常用的軟件保護(hù)技術(shù)介紹2.3.1時(shí)間限制定時(shí)器

有些程序的試用版每次運(yùn)行都有時(shí)間限制,例如運(yùn)行10分鐘或20分鐘就停止工作,必須重新運(yùn)行該程序才能正常工作。這些程序里面自然有個(gè)定時(shí)器來(lái)統(tǒng)計(jì)程序運(yùn)行的時(shí)間。

1)使用Settimer()

常用的計(jì)數(shù)器是函數(shù)Settimer(),調(diào)用這個(gè)函數(shù)創(chuàng)建的定時(shí)器可以發(fā)出消息VM_TIMER,或者在定時(shí)期滿(mǎn)時(shí)調(diào)用一個(gè)回調(diào)函數(shù)。使用這個(gè)函數(shù)會(huì)使時(shí)間延時(shí),精度不高。

2)使用timeSetEvent()

給Windows驅(qū)動(dòng)程序最精確的周期性通知是由Windows的多媒體服務(wù)timeSetEvent()提供的。它的時(shí)間可以精確到1毫秒。

3)使用VXD

可以使用VMM的Set_Global_time_Out()服務(wù)來(lái)迫使回調(diào)函數(shù)的幾個(gè)毫秒再執(zhí)行,這就創(chuàng)造了一個(gè)“只有一次”的定時(shí)器。VXD可以在回調(diào)中再次調(diào)用Set_Global_time_Out()來(lái)開(kāi)始下一個(gè)定時(shí)器,這樣提供了一個(gè)連續(xù)運(yùn)行的定時(shí)器了。4)其它

GetTickCount():精度不高;timeGetTime():可以以毫秒級(jí)返回windows開(kāi)始后的時(shí)間。

時(shí)間限制

一般這類(lèi)保護(hù)的軟件都有時(shí)間上的限制,如試用30天等,當(dāng)過(guò)了共享軟件的試用期后,就不予運(yùn)行,只有向軟件作者付費(fèi)注冊(cè)之后才能得到一個(gè)無(wú)時(shí)間限制的注冊(cè)版本。這種類(lèi)型程序很多,讓你有10天、20天、30天等,它們?cè)诎惭b時(shí),在你的系統(tǒng)某處做上時(shí)間標(biāo)記,每次運(yùn)行時(shí)用當(dāng)前系統(tǒng)時(shí)間和安裝時(shí)的時(shí)間比較,判斷你還否能使用。如最典型的30天限制的一種情況:

movecx,1E;把1E(30天十進(jìn)制)放入ecx

moveax,[esp+10];把用過(guò)天數(shù)放到eax

cmpeax,ecx;在此比較

如碰到這種情況,只需把moveax,[esp+10]改成moveax,1。

要記住當(dāng)前年份、月份的十六進(jìn)制的一些表示方法,如:2000年的十六進(jìn)制是07D0,然后用W32DASM反匯編你的程序,用查找字符串的方法找D007(在機(jī)器碼中位置顛倒了一下)或其它類(lèi)似時(shí)間的數(shù)字,有可能會(huì)找到有價(jià)值的線(xiàn)索。你別小看這種方法,對(duì)那些沒(méi)怎么防范的程序,此招很有效。如:一程序限定在2000年使用,可能有如下一代碼::00037805817C2404D0070000cmpdwordptr[esp+04],000007D0比較是否在2000年。

1)GetSystemTime得當(dāng)前系統(tǒng)時(shí)間

在一個(gè)SYSTEMTIME中載入當(dāng)前系統(tǒng)時(shí)間,這個(gè)時(shí)間采用的是“協(xié)同世界時(shí)間”(即UTC,也叫做GMT)格式。

VOIDGetSystemTime(LPSYSTEMTIMElpSystemTime);//隨同當(dāng)前時(shí)間載入的結(jié)構(gòu)。

2)GetLocalTime得當(dāng)前本地時(shí)間

VOIDGetLocalTime(LPSYSTEMTIMElpSystemTime);//用于裝載本地時(shí)間的結(jié)構(gòu)。

3)SystemTimeToFileTime根據(jù)一個(gè)FILETIME結(jié)構(gòu)內(nèi)容,載入一個(gè)SYSTEMTIME

BOOLSystemTimeToFileTime(CONSTSYSTEMTIME*lpst,LPFILETIMElpft);//包含了系統(tǒng)時(shí)間信息的一個(gè)結(jié)構(gòu)。

//用于裝載文件時(shí)間的一個(gè)結(jié)構(gòu)。4)SetTimer創(chuàng)建一定時(shí)器,在指定時(shí)間內(nèi)暫停

UINTSetTimer(HWNDhwnd,UINTidtimer,UINTuTimeout,TIMERPROCtmprc);

//時(shí)間信息句柄。

//定時(shí)器ID標(biāo)識(shí)符。

//暫停時(shí)間。

//處理定時(shí)過(guò)程的程序入口地址。一般這類(lèi)保護(hù)的軟件都有時(shí)間上的限制,如試用30天等,當(dāng)過(guò)了共享軟件的試用期后,就不予運(yùn)行,只有向軟件作者付費(fèi)注冊(cè)之后才能得到一個(gè)有(或無(wú))時(shí)間限制的注冊(cè)版本。使用時(shí)間限制技術(shù)時(shí),不要依賴(lài)于GetLocalTime()、GetSystemTime()這樣眾所周知的函數(shù)來(lái)獲取系統(tǒng)時(shí)間,可以通過(guò)讀取關(guān)鍵的系統(tǒng)文件的修改時(shí)間來(lái)得到系統(tǒng)時(shí)間的信息。2.3.2KeyFile保護(hù)KeyFile(注冊(cè)文件)是一種利用文件來(lái)注冊(cè)軟件的保護(hù)方式。KeyFile一般是一個(gè)小文件,可以是純文本文件,也可以是包含不可顯示字符的二進(jìn)制文件,其內(nèi)容是一些加密過(guò)或未加密的數(shù)據(jù),其中可能有用戶(hù)名、注冊(cè)碼等信息。文件格式則由軟件作者自己定義。采用keyfile的保護(hù)方式時(shí),keyfile的尺寸不能太小,可將其結(jié)構(gòu)設(shè)計(jì)得比較復(fù)雜,在程序中不同的地方對(duì)keyfile的不同部分進(jìn)行復(fù)雜的運(yùn)算和檢查。試用版軟件沒(méi)有注冊(cè)文件,當(dāng)用戶(hù)向作者付費(fèi)注冊(cè)之后,會(huì)收到作者寄來(lái)的注冊(cè)文件,其中可能包含用戶(hù)的個(gè)人信息。用戶(hù)只要將該文件放入指定的目錄,就可以讓軟件成為正式版。該文件一般是放在軟件的安裝目錄中或系統(tǒng)目錄下。軟件每次啟動(dòng)時(shí),從該文件中讀取數(shù)據(jù),然后利用某種算法進(jìn)行處理,根據(jù)處理的結(jié)果判斷是否為正確的注冊(cè)文件,如果正確則以注冊(cè)版模式來(lái)運(yùn)行[8]。2.3.3CD-CHECK簡(jiǎn)單也最常見(jiàn)的光盤(pán)保護(hù)就是程序在啟動(dòng)時(shí)判斷光驅(qū)中的光盤(pán)上是否存在特定的文件,如果不存在則認(rèn)為用戶(hù)沒(méi)有正版光盤(pán),拒絕運(yùn)行。在程序運(yùn)行的過(guò)程當(dāng)中一般不再檢查光盤(pán)的存在與否。Windows下的具體實(shí)現(xiàn)一般是這樣的:先用GetLogicalDriveStrings()或GetLogicalDrives()得到系統(tǒng)中安裝的所有驅(qū)動(dòng)器的列表,然后再用GetDriveType()檢查每一個(gè)驅(qū)動(dòng)器,如果是光驅(qū)則用CreateFileA()或FindFirstFileA()等函數(shù)檢查特定的文件存在與否,并可能進(jìn)一步地檢查文件的屬性、大小、內(nèi)容等。這種光盤(pán)檢查是比較容易被破解的,解密者只要利用上述函數(shù)設(shè)斷點(diǎn)找到程序啟動(dòng)時(shí)檢查光驅(qū)的地方,修改判斷指令就可以跳過(guò)光盤(pán)檢查[9]。2.4軟件保護(hù)總結(jié)本節(jié)將給出關(guān)于軟件保護(hù)的一般性建議,這些都是無(wú)數(shù)人經(jīng)驗(yàn)的總結(jié)。程序員在設(shè)計(jì)自己的保護(hù)方式時(shí)最好能夠遵守這里給出的準(zhǔn)則,這樣會(huì)提高軟件的保護(hù)強(qiáng)度。1)軟件最終發(fā)行之前一定要將可執(zhí)行程序進(jìn)行加殼/壓縮,使得解密者無(wú)法直接修改程序。如果時(shí)間允許并且有相應(yīng)的技術(shù)能力,最好是設(shè)計(jì)自己的加殼/壓縮方法。如果采用現(xiàn)成的加殼工具,最好不要選擇流行的工具,因?yàn)檫@些工具已被廣泛深入地加以研究,有了通用的脫殼/解壓辦法。另外,最好采用兩種以上的不同的工具來(lái)對(duì)程序進(jìn)行加殼/壓縮,并盡可能地利用這些工具提供的反跟蹤特性。2)增加對(duì)軟件自身的完整性檢查。這包括對(duì)磁盤(pán)文件和內(nèi)存映像的檢查,以防止有人未經(jīng)允許修改程序以達(dá)到破解的目的。DLL和EXE之間可以互相檢查完整性。3)所有與軟件保護(hù)相關(guān)的字符串都不能以明文形式直接存放在可執(zhí)行文件中,這些字符串最好是動(dòng)態(tài)生成。盡可能少地給用戶(hù)提示信息,因?yàn)檫@些蛛絲馬跡都可能導(dǎo)致解密者直接深入到保護(hù)的核心。比如,當(dāng)檢測(cè)到破解企圖之后,不要立即給用戶(hù)提示信息,而是在系統(tǒng)的某個(gè)地方做一個(gè)記號(hào),隨機(jī)地過(guò)一段時(shí)間后使軟件停止工作,或者裝作正常工作但實(shí)際上卻在所處理的數(shù)據(jù)中加入了一些垃圾。4)將注冊(cè)碼、安裝時(shí)間記錄在多個(gè)不同的地方。檢查注冊(cè)信息和時(shí)間的代碼越分散越好。不要調(diào)用同一個(gè)函數(shù)或判斷同一個(gè)全局標(biāo)志,因?yàn)檫@樣做的話(huà)只要修改了一個(gè)地方則全部都被破解了。在檢查注冊(cè)信息的時(shí)候插入大量無(wú)用的運(yùn)算以誤導(dǎo)解密者,并在檢查出錯(cuò)誤的注冊(cè)信息之后加入延時(shí)。5)如果試用版與正式版是分開(kāi)的兩個(gè)版本,且試用版的軟件沒(méi)有某項(xiàng)功能,則不要僅僅使相關(guān)的菜單變灰,而是徹底刪除相關(guān)的代碼,使得編譯后的程序中根本沒(méi)有相關(guān)的功能代碼。2.5本章小結(jié)本章主要介紹了序列號(hào)保護(hù)機(jī)制,注冊(cè)機(jī)信息采集技術(shù),其中詳細(xì)介紹了硬盤(pán)物理序列號(hào)的獲取和一些其它的軟件保護(hù)技術(shù),通過(guò)對(duì)比分析,每種算法都有自己的優(yōu)勢(shì),具體使用哪種算法要根據(jù)問(wèn)題的需求,最終本設(shè)計(jì)選用硬盤(pán)物理序列生成注冊(cè)碼的方法。采用硬盤(pán)物理序列號(hào)生成注冊(cè)碼的保護(hù)方式,最好的優(yōu)勢(shì)是一機(jī)一碼,即注冊(cè)碼與機(jī)器特征相關(guān),這樣一臺(tái)機(jī)器上的注冊(cè)碼就無(wú)法在另外一臺(tái)機(jī)器上使用,能有效地防止軟件盜版的問(wèn)題。

3加密算法介紹3.1DES算法3.1.1DES算法原理數(shù)據(jù)加密算法(DataEncryptionAlgorithm,DEA)的數(shù)據(jù)加密標(biāo)準(zhǔn)(DataEncryptionStandard,DES)是規(guī)范的描述,它出自IBM的研究工作,并在1977年被美國(guó)政府正式采納。它是一種對(duì)稱(chēng)加密算法,很可能是使用最廣泛的密鑰系統(tǒng),特別是在保護(hù)金融數(shù)據(jù)的安全中,最初開(kāi)發(fā)的DES是嵌入硬件中的。通常自動(dòng)取款機(jī)(AutomatedTellerMachine,ATM)都使用DES。

DES使用一個(gè)56位的密鑰以及附加的8位奇偶校驗(yàn)位,產(chǎn)生最大64位的分組大小。這是一個(gè)迭代的分組密碼,使用稱(chēng)為Feistel的技術(shù),其中將加密的文本塊分成兩半。使用子密鑰對(duì)其中一半應(yīng)用循環(huán)功能,然后將輸出與另一半進(jìn)行“異或”運(yùn)算;接著交換這兩半,這一過(guò)程會(huì)繼續(xù)下去,但最后一個(gè)循環(huán)不交換。DES使用16個(gè)循環(huán),使用異或,置換,代換,移位操作四種基本運(yùn)算。3.1.2DES算法的應(yīng)用誤區(qū)DES算法加密與解密均工作中。唯一需要避免的是:在應(yīng)用中,避開(kāi)使用Key的第8,1664位作為有效數(shù)據(jù)位,從而便避開(kāi)DES算法在應(yīng)用中的誤區(qū)。避開(kāi)DES算法應(yīng)用誤區(qū)的具體操作在DES密鑰Key的使用、管理及密鑰更換的過(guò)程中,應(yīng)絕對(duì)避開(kāi)DES算法的應(yīng)用誤區(qū),即:絕對(duì)不能把Key的第8,16,2464位作為有效數(shù)據(jù)位,來(lái)對(duì)Key進(jìn)行管理。這一點(diǎn),特別推薦給金融銀行界及非金融業(yè)界的領(lǐng)導(dǎo)及決策者們,尤其是負(fù)責(zé)管理密鑰的人,要對(duì)此點(diǎn)予以高度重視。有的銀行金融交易網(wǎng)絡(luò),利用定期更換DES密鑰Key的辦法來(lái)進(jìn)一步提高系統(tǒng)的安全性和可靠性,如果忽略了上述應(yīng)用誤區(qū),那么,更換新密鑰將是徒勞的,對(duì)金融交易網(wǎng)絡(luò)的安全運(yùn)行將是十分危險(xiǎn)的,所以更換密鑰一定要保證新Key與舊Key真正的不同,即除了第8,16,24,...64位外其它位數(shù)據(jù)發(fā)生了變化,請(qǐng)務(wù)必對(duì)此保持高度重視[10]!3.2MD5算法3.2.1MD5算法原理MD5的典型應(yīng)用是對(duì)一段信息(Message)產(chǎn)生信息摘要(Message-Digest),以防止被篡改。大家都知道,地球上任何人都有自己獨(dú)一無(wú)二的指紋,這常常成為公安機(jī)關(guān)鑒別罪犯身份最值得信賴(lài)的方法;與之類(lèi)似,MD5就可以為任何文件(不管其大小、格式、數(shù)量)產(chǎn)生一個(gè)同樣獨(dú)一無(wú)二的“數(shù)字指紋”,如果任何人對(duì)文件做了任何改動(dòng),其MD5值也就是對(duì)應(yīng)的“數(shù)字指紋”都會(huì)發(fā)生變化。

我們常常在某些軟件下載站點(diǎn)的某軟件信息中看到其MD5值,它的作用就在于我們可以在下載該軟件后,對(duì)下載回來(lái)的文件用專(zhuān)門(mén)的軟件(如WindowsMD5Check等)做一次MD5校驗(yàn),以確保我們獲得的文件與該站點(diǎn)提供的文件為同一文件。利用MD5算法來(lái)進(jìn)行文件校驗(yàn)的方案被大量應(yīng)用到軟件下載站、論壇數(shù)據(jù)庫(kù)、系統(tǒng)文件安全等方面。3.2.2MD5算法的應(yīng)用MD5的典型應(yīng)用是對(duì)一段Message(字節(jié)串)產(chǎn)生fingerprint(指紋),以防止被“篡改”。舉個(gè)例子,你將一段話(huà)寫(xiě)在一個(gè)叫readme.txt文件中,并對(duì)這個(gè)readme.txt產(chǎn)生一個(gè)MD5的值并記錄在案,然后你可以傳播這個(gè)文件給別人,別人如果修改了文件中的任何內(nèi)容,你對(duì)這個(gè)文件重新計(jì)算MD5時(shí)就會(huì)發(fā)現(xiàn)(兩個(gè)MD5值不相同)。如果再有一個(gè)第三方的認(rèn)證機(jī)構(gòu),用MD5還可以防止文件作者的“抵賴(lài)”,這就是所謂的數(shù)字簽名應(yīng)用。

MD5還廣泛用于操作系統(tǒng)的登陸認(rèn)證上,如Unix、各類(lèi)BSD系統(tǒng)登錄密碼、數(shù)字簽名等諸多方。如在UNIX系統(tǒng)中用戶(hù)的密碼是以MD5(或其它類(lèi)似的算法)經(jīng)Hash運(yùn)算后存儲(chǔ)在文件系統(tǒng)中。當(dāng)用戶(hù)登錄的時(shí)候,系統(tǒng)把用戶(hù)輸入的密碼進(jìn)行MD5Hash運(yùn)算,然后再去和保存在文件系統(tǒng)中的MD5值進(jìn)行比較,進(jìn)而確定輸入的密碼是否正確。通過(guò)這樣的步驟,系統(tǒng)在并不知道用戶(hù)密碼的明碼的情況下就可以確定用戶(hù)登錄系統(tǒng)的合法性。這可以避免用戶(hù)的密碼被具有系統(tǒng)管理員權(quán)限的用戶(hù)知道。MD5將任意長(zhǎng)度的“字節(jié)串”映射為一個(gè)128bit的大整數(shù),并且是通過(guò)該128bit反推原始字符串是困難的,換句話(huà)說(shuō)就是,即使你看到源程序和算法描述,也無(wú)法將一個(gè)MD5的值變換回原始的字符串,從數(shù)學(xué)原理上說(shuō),是因?yàn)樵嫉淖址袩o(wú)窮多個(gè),這有點(diǎn)象不存在反函數(shù)的數(shù)學(xué)函數(shù)。所以,要遇到了md5密碼的問(wèn)題,比較好的辦法是:你可以用這個(gè)系統(tǒng)中的md5()函數(shù)重新設(shè)一個(gè)密碼,如admin,把生成的一串密碼的Hash值覆蓋原來(lái)Hash值就行了[11]。3.3RSA算法3.3.1RSA算法原理密鑰對(duì)的產(chǎn)生:選擇兩個(gè)大素?cái)?shù)p和q計(jì)算:

n=p*q

然后隨機(jī)選擇加密密鑰e,要求e和(p-1)*(q-1)互質(zhì)。最后,利用Euclid算法計(jì)算解密密鑰d,滿(mǎn)足:

e*d=1(mod(p-1)*(q-1))

其中n和d也要互質(zhì)。數(shù)e和n是公鑰,d是私鑰。兩個(gè)素?cái)?shù)p和q不再需要,應(yīng)該丟棄,不要讓任何人知道。

加密信息m(二進(jìn)制表示)時(shí),首先把m分成等長(zhǎng)數(shù)據(jù)塊m1,m2,...,mi,塊長(zhǎng)s,其中2^s<=n,s盡可能的大。對(duì)應(yīng)的密文是:

ci=mi^e(modn)(a)

解密時(shí)作如下計(jì)算:

mi=ci^d(modn)(b)

RSA可用于數(shù)字簽名,方案是用(a)式簽名,(b)式驗(yàn)證。具體操作時(shí)考慮到安全性和m信息量較大等因素,一般是先作HASH運(yùn)算[12]。3.3.2RSA的安全性RSA的安全性依賴(lài)于大數(shù)的因子分解,但并沒(méi)有從理論上證明破譯RSA的難度與大數(shù)分解難度等價(jià)。即RSA的重大缺陷是無(wú)法從理論上把握它的保密性能如何,而且密碼學(xué)界多數(shù)人士?jī)A向于因子分解不是NPC問(wèn)題。RSA的缺點(diǎn)主要有:1)產(chǎn)生密鑰很麻煩,受到素?cái)?shù)產(chǎn)生技術(shù)的限制,因而難以做到一次一密。2)分組長(zhǎng)度太大,為保證安全性,n至少也要600bits以上,使運(yùn)算代價(jià)很高,尤其是速度較慢,較對(duì)稱(chēng)密碼算法慢幾個(gè)數(shù)量級(jí);且隨著大數(shù)分解技術(shù)的發(fā)展,這個(gè)長(zhǎng)度還在增加,不利于數(shù)據(jù)格式的標(biāo)準(zhǔn)化。目前,SET(SecureElectronicTransaction)協(xié)議中要求CA采用2048比特長(zhǎng)的密鑰,其他實(shí)體使用1024比特的密鑰。

這種算法1978年就出現(xiàn)了,它是第一個(gè)既能用于數(shù)據(jù)加密也能用于數(shù)字簽名的算法。它易于理解和操作,也很流行。算法的名字以發(fā)明者的名字命名:RonRivest,AdiShamir和LeonardAdleman。但RSA的安全性一直未能得到理論上的證明。RSA的安全性依賴(lài)于大數(shù)分解。公鑰和私鑰都是兩個(gè)大素?cái)?shù)(大于100個(gè)十進(jìn)制位)的函數(shù)。據(jù)猜測(cè),從一個(gè)密鑰和密文推斷出明文的難度等同于分解兩個(gè)大素?cái)?shù)的積。3.3.3RSA的速度由于進(jìn)行的都是大數(shù)計(jì)算,使得RSA最快的情況也比DES慢上100倍,無(wú)論是軟件還是硬件實(shí)現(xiàn)。速度一直是RSA的缺陷。一般來(lái)說(shuō)只用于少量數(shù)據(jù)加密。RSA的選擇密文攻擊。RSA在選擇密文攻擊面前很脆弱。一般攻擊者是將某一信息作一下偽裝(Blind),讓擁有私鑰的實(shí)體簽署。然后,經(jīng)過(guò)計(jì)算就可得到它所想要的信息。實(shí)際上,攻擊利用的都是同一個(gè)弱點(diǎn),即存在這樣一個(gè)事實(shí):乘冪保留了輸入的乘法結(jié):(XM)^d=X^d*M^dmodn

前面已經(jīng)提到,這個(gè)固有的問(wèn)題來(lái)自于公鑰密碼系統(tǒng)的最有用的特征--每個(gè)人都能使用公鑰。但從算法上無(wú)法解決這一問(wèn)題,主要措施有兩條:一條是采用好的公鑰協(xié)議,保證工作過(guò)程中實(shí)體不對(duì)其他實(shí)體任意產(chǎn)生的信息解密,不對(duì)自己一無(wú)所知的信息簽名;另一條是決不對(duì)陌生人送來(lái)的隨機(jī)文檔簽名,簽名時(shí)首先使用One-WayHashFunction對(duì)文檔作HASH處理,或同時(shí)使用不同的簽名算法。在中提到了幾種不同類(lèi)型的攻擊方法。3.4本章小結(jié)本章詳細(xì)介紹了當(dāng)前比較流行的幾種加密算法,使我們對(duì)加密解密有了更深入的了解,從中我們可以看出各種加密算法的安全性,速度,和適用的條件,以便針對(duì)不同的問(wèn)題使用不同的加密算法。那我們?cè)趯?shí)際使用的過(guò)程中究竟該使用哪一種比較好呢?我們應(yīng)該根據(jù)自己的使用特點(diǎn)來(lái)確定,由于非對(duì)稱(chēng)加密算法的運(yùn)行速度比對(duì)稱(chēng)加密算法的速度慢很多,當(dāng)我們需要加密大量的數(shù)據(jù)時(shí),建議采用對(duì)稱(chēng)加密算法,提高加解密速度。對(duì)稱(chēng)加密算法不能實(shí)現(xiàn)簽名,因此簽名只能非對(duì)稱(chēng)算法。由于對(duì)稱(chēng)加密算法的密鑰管理是一個(gè)復(fù)雜的過(guò)程,密鑰的管理直接決定著他的安全性,因此當(dāng)數(shù)據(jù)量很小時(shí),我們可以考慮采用非對(duì)稱(chēng)加密算法。在實(shí)際的操作過(guò)程中,我們通常采用的方式是:采用非對(duì)稱(chēng)加密算法管理對(duì)稱(chēng)算法的密鑰,然后用對(duì)稱(chēng)加密算法加密數(shù)據(jù),這樣我們就集成了兩類(lèi)加密算法的優(yōu)點(diǎn),既實(shí)現(xiàn)了加密速度快的優(yōu)點(diǎn),又實(shí)現(xiàn)了安全方便管理密鑰的優(yōu)點(diǎn)。如果在選定了加密算法后,那采用多少位的密鑰呢?一般來(lái)說(shuō),密鑰越長(zhǎng),運(yùn)行的速度就越慢,應(yīng)該根據(jù)的我們實(shí)際需要的安全級(jí)別來(lái)選擇,一般來(lái)說(shuō),RSA建議采用1024位的數(shù)字,如果有更高的保密要求,可采用2048位數(shù)字。通過(guò)比較分析,本設(shè)計(jì)決定使用RSA加密算法加密生成注冊(cè)碼,雖然RSA算法沒(méi)有DES算法速度快,但是RSA加密解密使用不同的非對(duì)稱(chēng)密鑰這是它的優(yōu)勢(shì)。本設(shè)計(jì)注冊(cè)碼的生成是在注冊(cè)機(jī)上完成的,注冊(cè)碼的驗(yàn)證在客服端程序上,客戶(hù)端程序段中含有解密時(shí)使用的密鑰,如我們使用DES對(duì)稱(chēng)密鑰算法加密,破解人員很容就能根據(jù)客服端程序?qū)懗鲎约旱淖?cè)機(jī),從而完成注冊(cè),在軟件保護(hù)中,這是很不安全的。但我們使用RSA加密算法,這些問(wèn)題就迎刃而解了,因?yàn)镽SA算法的密鑰對(duì)私鑰和公鑰是非對(duì)稱(chēng)的,客服端程序驗(yàn)證時(shí)使用公鑰進(jìn)行解密,注冊(cè)機(jī)由開(kāi)發(fā)商保管,注冊(cè)機(jī)使用私鑰加密生成注冊(cè)碼,破解者根據(jù)公鑰推導(dǎo)出私鑰在理論上是不可能的,開(kāi)發(fā)商為了增大破解難度,還可以加長(zhǎng)密鑰的位數(shù)和分組的長(zhǎng)度,這使得該軟件在其生命周期內(nèi)可以有效避免被人破解,非法使用。4系統(tǒng)詳細(xì)設(shè)計(jì)及實(shí)現(xiàn)4.1開(kāi)發(fā)環(huán)境介紹4.1.1VisualC++6.0介紹用VC6編寫(xiě)并處理的任何程序都與工程有關(guān)(都要?jiǎng)?chuàng)建一個(gè)與其相關(guān)的工程),而每一個(gè)工程又總與一個(gè)工程工作區(qū)相關(guān)聯(lián)。實(shí)際上,VC6是通過(guò)工程工作區(qū)來(lái)組織工程及其各相關(guān)元素的,就好像是一個(gè)工作間(對(duì)應(yīng)于一個(gè)獨(dú)立的文件夾,或稱(chēng)子目錄),以后程序所牽扯到的所有的文件、資源等元素都將放入到這一工作間中,從而使得各個(gè)工程之間互不干擾,使編程工作更有條理,更具模塊化。最簡(jiǎn)單情況下,一個(gè)工作區(qū)中用來(lái)存放一個(gè)工程,代表著某一個(gè)要進(jìn)行處理的程序(我們先學(xué)習(xí)這種用法)。但如果需要,一個(gè)工作區(qū)中也可以用來(lái)存放多個(gè)工程,其中可以包含該工程的子工程或者與其有依賴(lài)關(guān)系的其他工程??煽闯觯こ坦ぷ鲄^(qū)就像是一個(gè)“容器”,由它來(lái)“盛放”相關(guān)工程的所有有關(guān)信息,當(dāng)創(chuàng)建新工程時(shí),同時(shí)要?jiǎng)?chuàng)建這樣一個(gè)工程工作區(qū),而后則通過(guò)該工作窗口來(lái)觀察與存取此工程的各種元素及其有關(guān)信息。創(chuàng)建工程工作區(qū)之后,系統(tǒng)將創(chuàng)建出一個(gè)相應(yīng)的工作區(qū)文件(.dsw),用來(lái)存放與該工作區(qū)相關(guān)的信息;另外還將創(chuàng)建出的其他幾個(gè)相關(guān)文件是:工程文件(.dsp)以及選擇信息文件(.opt)等。編制并處理C++程序時(shí)要?jiǎng)?chuàng)建工程,VC6已經(jīng)預(yù)先為用戶(hù)準(zhǔn)備好了近20種不同的工程類(lèi)型以供選擇,選定不同的類(lèi)型意味著讓VC6系統(tǒng)幫著提前做某些不同的準(zhǔn)備以及初始化工作(例如,事先為用戶(hù)自動(dòng)生成一個(gè)所謂的底層程序框架或稱(chēng)框架程序,并進(jìn)行某些隱含設(shè)置,如隱含位置、預(yù)定義常量、輸出結(jié)果類(lèi)型等)。工程類(lèi)型中,其中有一個(gè)為“MFCAppWizard(exe)”如圖4.1所示,它是我們本設(shè)計(jì)要掌握的、用來(lái)編制具有可視化窗體界面運(yùn)行C++程序的工程。圖4.14.1.2MFC程序開(kāi)發(fā)流程MFC介紹MFC,微軟基礎(chǔ)類(lèi)(MicrosoftFoundationClasses),同VCL類(lèi)似,是一種ApplicationFramework,隨微軟VisualC++開(kāi)發(fā)工具發(fā)布。目前最新版本為9.0(截止2008年11月)。該類(lèi)庫(kù)提供一組通用的可重用的類(lèi)庫(kù)供開(kāi)發(fā)人員使用。大部分類(lèi)均從CObject直接或間接派生,只有少部分類(lèi)例外。MFC應(yīng)用程序的總體結(jié)構(gòu)通常由開(kāi)發(fā)人員從MFC類(lèi)派生的幾個(gè)類(lèi)和一個(gè)CWinApp類(lèi)對(duì)象(應(yīng)用程序?qū)ο螅┙M成。MFC提供了MFCAppWizard自動(dòng)生成框架。Windows應(yīng)用程序中,MFC的主包含文件為"Afxwin.h"。此外MFC的部分類(lèi)為MFC/ATL通用,可以在Win32應(yīng)用程序中單獨(dú)包含并使用這些類(lèi)。由于它的易用性,初學(xué)者常誤認(rèn)為VC++開(kāi)發(fā)必須使用MFC。這種想法是錯(cuò)誤的。作為ApplicationFramework,MFC的使用只能提高某些情況下的開(kāi)發(fā)效率,只起到輔助作用,而不能替代整個(gè)Win32程序設(shè)計(jì)。MFC特點(diǎn)MFC,微軟基礎(chǔ)類(lèi)(MicrosoftFoundationClasses),實(shí)際上是微軟提供的,用于在C++環(huán)境下編寫(xiě)應(yīng)用程序的一個(gè)框架和引擎,VC++是WinDOS下開(kāi)發(fā)人員使用的專(zhuān)業(yè)C++SDK(SDK,StandardSoftWareDevelopKit,專(zhuān)業(yè)軟件開(kāi)發(fā)平臺(tái)),MFC就是掛在它之上的一個(gè)輔助軟件開(kāi)發(fā)包,MFC作為與VC++血肉相連的部分(注意C++和VC++的區(qū)別:C++是一種程序設(shè)計(jì)語(yǔ)言,是一種大家都承認(rèn)的軟件編制的通用規(guī)范,而VC++只是一個(gè)編譯器,或者說(shuō)是一種編譯器+源程序編輯器的IDE,WS,PlatForm,這跟Pascal和Delphi的關(guān)系一個(gè)道理,Pascal是Delphi的語(yǔ)言基礎(chǔ),Delphi使用Pascal規(guī)范來(lái)進(jìn)行Win下應(yīng)用程序的開(kāi)發(fā)和編譯,卻不同于Basic語(yǔ)言和VB的關(guān)系,Basic語(yǔ)言在VB開(kāi)發(fā)出來(lái)被應(yīng)用的年代已經(jīng)成了Basic語(yǔ)言的新規(guī)范,VB新加的Basic語(yǔ)言要素,如面向?qū)ο蟪绦蛟O(shè)計(jì)的要素,是一種性質(zhì)上的飛躍,使VB既是一個(gè)IDE,又成長(zhǎng)成一個(gè)新的程序設(shè)計(jì)語(yǔ)言),MFC同BC++集成的VCL一樣是一個(gè)非外掛式的軟件包,類(lèi)庫(kù),只不過(guò)MFC類(lèi)是微軟為VC++專(zhuān)配的。MFC是WinAPI與C++的結(jié)合,API,即微軟提供的WinDOS下應(yīng)用程序的編程語(yǔ)言接口,是一種軟件編程的規(guī)范,但不是一種程序開(kāi)發(fā)語(yǔ)言本身,可以允許用戶(hù)使用各種各樣的第三方(如我是一方,微軟是一方,Borland就是第三方)的編程語(yǔ)言來(lái)進(jìn)行對(duì)WinDOS下應(yīng)用程序的開(kāi)發(fā),使這些被開(kāi)發(fā)出來(lái)的應(yīng)用程序能在WinDOS下運(yùn)行,比如VB,VC++,Java,Dehpi編程語(yǔ)言函數(shù)本質(zhì)上全部源于API,因此用它們開(kāi)發(fā)出來(lái)的應(yīng)用程序都能工作在WinOS的消息機(jī)制和繪圖里,遵守WinDOS作為一個(gè)操作系統(tǒng)的內(nèi)部實(shí)現(xiàn),這其實(shí)也是一種必要,微軟如果不提供API,這個(gè)世上對(duì)Win編程的工作就不會(huì)存在,微軟的產(chǎn)品就會(huì)迅速?gòu)臅r(shí)尚變成垃圾,上面說(shuō)到MFC是微軟對(duì)API函數(shù)的專(zhuān)用C++封裝,這種結(jié)合一方面讓用戶(hù)使用微軟的專(zhuān)業(yè)C++SDK來(lái)進(jìn)行Win下應(yīng)用程序的開(kāi)發(fā)變得容易,因?yàn)镸FC是對(duì)API的封裝,微軟做了大量的工作,隱藏了好多程序開(kāi)發(fā)人員在Win下用C++&MFC編制軟件時(shí)的大量?jī)?nèi)節(jié),如應(yīng)用程序?qū)崿F(xiàn)消息的處理,設(shè)備環(huán)境繪圖,這種結(jié)合是以方便為目的的,必定要付出一定代價(jià)(這是微軟的一向作風(fēng)),因此就造成了MFC對(duì)類(lèi)封裝中的一定程度的的冗余和迂回,但這是可以接受的。最后要明白MFC不只是一個(gè)功能單純的界面開(kāi)發(fā)系統(tǒng),它提供的類(lèi)絕大部分用來(lái)進(jìn)行界面開(kāi)發(fā),關(guān)聯(lián)一個(gè)窗口的動(dòng)作,但它提供的類(lèi)中有好多類(lèi)不與一個(gè)窗口關(guān)聯(lián),即類(lèi)的作用不是一個(gè)界面類(lèi),不實(shí)現(xiàn)對(duì)一個(gè)窗口對(duì)象的控制(如創(chuàng)建,銷(xiāo)毀),而是一些在WinDOS(用MFC編寫(xiě)的程序絕大部分都在WinDOS中運(yùn)行)中實(shí)現(xiàn)內(nèi)部處理的類(lèi),如數(shù)據(jù)庫(kù)的管理類(lèi)等,學(xué)習(xí)中最應(yīng)花費(fèi)時(shí)間的是消息和設(shè)備環(huán)境,對(duì)C++和MFC的學(xué)習(xí)中最難的部分是指針,C++面向?qū)ο癯绦蛟O(shè)計(jì)的其它部分,如數(shù)據(jù)類(lèi)型,流程控制都不難,建議學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)C++版。MFC是微軟封裝了的API。什么意思呢?windows作為一個(gè)提供功能強(qiáng)大的應(yīng)用程序接口編程的操作系統(tǒng),的確方便了許多程序員,傳統(tǒng)的win32開(kāi)發(fā)(直接使用windows的接口函數(shù)API)對(duì)于程序員來(lái)說(shuō)非常的困難,因?yàn)?,API函數(shù)實(shí)在太多了,而且名稱(chēng)很亂,從零構(gòu)架一個(gè)窗口動(dòng)輒就是上百行的代碼。MFC是面向?qū)ο蟪绦蛟O(shè)計(jì)與Applicationframework的完美結(jié)合,他將傳統(tǒng)的API進(jìn)行了分類(lèi)封裝,并且為你創(chuàng)建了程序的一般框架。MFC是對(duì)WindowsAPI的封裝,大大簡(jiǎn)化了我們的工作;學(xué)VC主要就是要學(xué)MFC,大約有100多個(gè)類(lèi),但常用的也就二三十個(gè)。應(yīng)該象背4級(jí)單詞一樣將這些常用類(lèi)搞懂;當(dāng)然不要死記,要通過(guò)看幫助、看例子、動(dòng)手練習(xí)來(lái)學(xué)會(huì)它們;而且,并非每個(gè)類(lèi)的內(nèi)部的所有函數(shù)都要學(xué)會(huì),要日積月累。如果真的想成為高手,做個(gè)筆記本把自己認(rèn)為重要的類(lèi)、函數(shù)記下來(lái),隨時(shí)學(xué)習(xí),也是很好的突擊方法。MFC基于事件驅(qū)動(dòng)的程序設(shè)計(jì)MFC是基于事件驅(qū)動(dòng)的程序設(shè)計(jì),事件的產(chǎn)生有操作輸入設(shè)備,如鍵盤(pán)和鼠標(biāo);點(diǎn)擊屏幕上可視的對(duì)象,如菜單、工具欄按鈕、滾動(dòng)條和對(duì)話(huà)框上的控件;來(lái)自Windows內(nèi)部,如當(dāng)一個(gè)后面的窗口顯示到前面來(lái)時(shí)?;谑录?qū)動(dòng)的程序模型如圖4.2所示。程序開(kāi)始程序開(kāi)始消息源1消息源1捕獲消息派發(fā)消息消息源2捕獲消息派發(fā)消息消息源2 . .退出消息?處理消息N退出消息?處理消息消息源n 消息源n 程序結(jié)束Y 程序結(jié)束圖4.2支持隊(duì)列特征的消息驅(qū)動(dòng)模型Windows程序的消息處理過(guò)程Windows程序的消息處理過(guò)程首先是application都有其對(duì)應(yīng)的windowprocedure,當(dāng)窗口顯現(xiàn)出來(lái)以后,對(duì)窗口所做的操作就會(huì)作為消息傳遞給application,而application就用GetMessage()函數(shù)來(lái)接收,接著application則必須對(duì)消息進(jìn)行分析,這使用TranslateMessage()來(lái)實(shí)現(xiàn),接著application就要把分析后的消息傳遞給此application的windowprocedure,即lpfnWndProc所指定的處理過(guò)程,要使用DispatchMessage()來(lái)實(shí)現(xiàn),而windowprocedure則會(huì)根據(jù)收到的消息作出具體的措施。到此為止已經(jīng)形成了一個(gè)完整的消息處理循環(huán),其形式如下所示:while(GetMessage(&Msg,NULL,0,0)){

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}這便是典型的windows應(yīng)用程序的消息處理與傳遞機(jī)制。Windows程序和消息的基本流程如圖4.3所示。開(kāi)始執(zhí)行開(kāi)始執(zhí)行初始化初始化從消息隊(duì)列取得一個(gè)消息從消息隊(duì)列取得一個(gè)消息是否本程序要處理的消息?是否本程序要處理的消息?當(dāng)前消息是否“退出當(dāng)前消息是否“退出”消息?處理消息默認(rèn)處理終止執(zhí)行 Y N默認(rèn)處理終止執(zhí)行圖4.3Windows程序和消息的基本流程MFC(MicrosoftFoundationClass,微軟基礎(chǔ)類(lèi)庫(kù))是基于Win32API的C++類(lèi)庫(kù)集,它提供了管理窗口、菜單、對(duì)話(huà)框等大量可重用代碼,隱藏了程序設(shè)計(jì)中的許多復(fù)雜工作,是用戶(hù)能夠較為輕松地開(kāi)發(fā)出標(biāo)準(zhǔn)的Wingdows應(yīng)用程序。MFC按照C++類(lèi)的層次形式進(jìn)行組織,層次較高的類(lèi)提供一般的功能,層次較低的類(lèi)從層次較高的類(lèi)派生而來(lái),繼承了高層次類(lèi)的行為,實(shí)現(xiàn)更為具體的功能。MFC用C++類(lèi)對(duì)大多數(shù)Win32API函數(shù)進(jìn)行了封裝,使程序員的開(kāi)發(fā)工作變得更加容易。MFC提供的基于文檔/視圖(簡(jiǎn)稱(chēng)Doc/View)的應(yīng)用程序開(kāi)發(fā)模型,是將應(yīng)用程序數(shù)據(jù)與用戶(hù)界面元素分離的編程方法,使得更改其中一部分程序時(shí)不必大量更改另一部分程序。程序設(shè)計(jì)流程圖本系統(tǒng)程序采用MFC編程,整個(gè)系統(tǒng)分為兩個(gè)部分,軟件使用方的客戶(hù)端程序和軟件開(kāi)發(fā)方的注冊(cè)機(jī)程序,客戶(hù)端程序通過(guò)訪問(wèn)硬盤(pán)信息,獲取硬盤(pán)物理序列號(hào),然后通過(guò)E-mail等方式發(fā)給軟件開(kāi)發(fā)方,軟件開(kāi)發(fā)方通過(guò)自己的注冊(cè)機(jī)把獲取到的硬盤(pán)物理序列號(hào)加密生成注冊(cè)碼,加密使用RSA非對(duì)稱(chēng)加密算法的私鑰K,軟件開(kāi)發(fā)方把生成的注冊(cè)號(hào)R返回給軟件使用者,軟件使用方根據(jù)得到的注冊(cè)碼,通過(guò)使用RSA非對(duì)稱(chēng)加密算法的公鑰p解密,把解密出來(lái)的字符串和本機(jī)的硬盤(pán)物理序列號(hào)進(jìn)行對(duì)比匹配,若相同則注冊(cè)成功,否則注冊(cè)失敗。整個(gè)流程圖如圖4.4所示。軟件使用方 軟件開(kāi)發(fā)方私有密鑰k模數(shù)n獲取硬盤(pán)序列號(hào)S私有密鑰k模數(shù)n獲取硬盤(pán)序列號(hào)S公有密鑰p模數(shù)nRSA加密算法公有密鑰p模數(shù)nRSA加密算法注冊(cè)號(hào)R注冊(cè)號(hào)RRSA解密算法RSA解密算法解密值S解密值S匹配匹配注冊(cè)失敗否注冊(cè)失敗注冊(cè)成功 是注冊(cè)成功圖4.4本系統(tǒng)設(shè)計(jì)流程圖4.2大進(jìn)制數(shù)及其運(yùn)算類(lèi)定義4.2.1大數(shù)類(lèi)的詳細(xì)描述RSA依賴(lài)大數(shù)運(yùn)算,目前主流RSA算法都建立在512位到1024位的大數(shù)運(yùn)算之上,所以我們?cè)诂F(xiàn)階段首先需要掌握1024位的大數(shù)運(yùn)算原理。其優(yōu)點(diǎn)是算法符合人們的日常習(xí)慣,易于理解。另一種思路是將大數(shù)當(dāng)作一個(gè)二進(jìn)制流進(jìn)行處理,使用各種移位和邏輯操作來(lái)進(jìn)行加減乘除運(yùn)算,但是這樣做代碼設(shè)計(jì)非常復(fù)雜,可讀性很低,難以理解也難以調(diào)試。于是選取了一種介于兩者之間的思路:將大數(shù)看作一個(gè)n進(jìn)制數(shù)組,對(duì)于目前的32位系統(tǒng)而言n可以取值為2的32次方,即0x100000000,假如將一個(gè)1024位的大數(shù)轉(zhuǎn)化成0x100000000進(jìn)制,它就變成了32位,而每一位的取值范圍就不是0-1或0-9,而是0-0xffffffff。我們正好可以用一個(gè)無(wú)符號(hào)長(zhǎng)整數(shù)來(lái)表示這一數(shù)值。所以1024位的大數(shù)就是一個(gè)有32個(gè)元素的unsignedlong數(shù)組。而且0x100000000進(jìn)制的數(shù)組排列與2進(jìn)制流對(duì)于計(jì)算機(jī)來(lái)說(shuō),實(shí)際上是一回事,但是我們完全可以針對(duì)unsignedlong數(shù)組進(jìn)行“豎式計(jì)算”,而循環(huán)規(guī)模被降低到了32次之內(nèi),并且算法很容易理解。4.2.2大數(shù)類(lèi)的類(lèi)定義本設(shè)計(jì)在使用RSA算法加密時(shí)會(huì)遇到大整數(shù)的運(yùn)算,VC++自帶的數(shù)據(jù)結(jié)構(gòu)無(wú)法滿(mǎn)足1024位加密運(yùn)算的需求,根據(jù)以上大數(shù)運(yùn)算的原理,于是定義了一個(gè)大數(shù)類(lèi),使其能完成大整數(shù)的計(jì)算。自定義的大數(shù)CBigInt類(lèi)為0x100000000進(jìn)制,同時(shí)根據(jù)十進(jìn)制的基本運(yùn)算法則為大數(shù)類(lèi)定義了基本的運(yùn)算成員函數(shù),例如加減乘除等等,具體定義見(jiàn)以下代碼。classCBigInt{public:unsignedm_nLength; //大數(shù)在0x100000000進(jìn)制下的長(zhǎng)度。unsignedlongm_ulValue[BI_MAXLEN];//用數(shù)組記錄大數(shù)在0x100000000進(jìn)制下每一位的值。CBigInt();~CBigInt();/*****************************************************************基本操作與運(yùn)算Mov,賦值運(yùn)算,可賦值為大數(shù)或普通整數(shù),可重載為運(yùn)算符“=”Cmp,比較運(yùn)算,可重載為運(yùn)算符“==”、“!=”、“>=”、“<=”等Add,加,求大數(shù)與大數(shù)或大數(shù)與普通整數(shù)的和,可重載為運(yùn)算符“+”Sub,減,求大數(shù)與大數(shù)或大數(shù)與普通整數(shù)的差,可重載為運(yùn)算符“-”Mul,乘,求大數(shù)與大數(shù)或大數(shù)與普通整數(shù)的積,可重載為運(yùn)算符“*”Div,除,求大數(shù)與大數(shù)或大數(shù)與普通整數(shù)的商,可重載為運(yùn)算符“/”Mod,模,求大數(shù)與大數(shù)或大數(shù)與普通整數(shù)的模,可重載為運(yùn)算符“%”*****************************************************************/voidMov(unsigned__int64A);voidMov(CBigInt&A);CBigIntAdd(CBigInt&A);CBigIntSub(CBigInt&A);CBigIntMul(CBigInt&A);CBigIntDiv(CBigInt&A);CBigIntMod(CBigInt&A);CBigIntAdd(unsignedlongA);CBigIntSub(unsignedlongA);CBigIntMul(unsignedlong

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論