信息安全工程实践hcrt.docx
信息安全全工程实实践安全编程程基于USSBKeey的软软件授权权编程实实验【实验内内容】了解USSBKeey的使使用和工工作原理理掌握通过过USBBKeyy控制软软件启动动和加密密的简单单程序【实验原原理】USBKKey是是一种插插在计算算机USSB口上上的软硬硬件结合合的设备备,USSBKeey内置置单片机机或智能能卡芯片片,具有有一定的的存储空空间和运运算处理理能力,使使得USSBKeey具有有判断、分分析的处处理能力力,增强强了主动动的反解解密能力力。USSBKeey的内内置芯片片里包含含有专用用的加密密算法软软件,UUSBKKey厂厂家提供供一套UUSBKKey的的读写接接口(AAPI)给开发发商,开开发商在在开发中中通过在在软件执执行过程程中和UUSBKKey交交换数据据来实现现加解密密。目前前多在UUSBKKey中中存储用用户的私私钥以及及数字证证书,利利用USSB KKey内内置的公公钥算法法实现对对用户身身份的认认证,同同时也可可以通过过USBBKeyy防止未未授权的的用户对对软件进进行复制制和破解解。【实验环环境】运行环境境:Miicroosofft VVisuual Stuudioo 20005编程语言言:C#【实验步步骤】一、 加密狗本实验使使用的加加密狗,是是一种类类似于UU盘的小小硬件,是是一种防防盗版的的方式。加密狗就就是一种种插在计计算机并并行口上上的软硬硬件结合合的加密密产品,为为多数软软件开发发商所采采用。加加密狗一一般都有有几十或或几百字字节的非非易失性性存储空空间可供供读写,现现在较新新的加密密狗内部部还包含含了单片片机。软软件开发发者可以以通过接接口函数数和加密密狗进行行数据交交换(即对加加密狗进进行读写写),来检检查加密密狗是否否插在并并行口上上;或者者直接用用加密狗狗附带的的工具加加密自己己EXEE文件(俗称"包壳")。这样样,软件件开发者者可以在在软件中中设置多多处软件件锁,利利用加密密狗做为为钥匙来来打开这这些锁;如果没没插加密密狗或加加密狗不不对应,软软件将不不能正常常执行。加密狗厂厂家都会会提供一一套加密密狗的读读写接口口(APPI)给给开发商商,厂家家卖给开开发商的的狗都有有各自的的区别,某某个开发发商只能能操作自自己买的的加密狗狗。加密密狗通过过在软件件执行过过程中和和加密狗狗交换数数据来实实现加密密的,加加密狗内内置单片片机电路路(也称CPPU),使使得加密密狗具有有判断、分分析的处处理能力力,增强强了主动动的反解解密能力力。这种种加密产产品称它它为“智能型型”加密狗狗。加密密狗内置置的单片片机里包包含有专专用于加加密的算算法软件件,该软软件被写写入单片片机后,就就不能再再被读出出。这样样,就保保证了加加密狗硬硬件不能能被复制制。二、 加密狗使使用的简简单实例例此实例通通过加密密狗来控控制软件件的启动动。(1) 运行页面面如图5.1.111所示为为主程序序窗口的的运行画画面,要要运行程程序,必必须先成成功启动动加密狗狗。图5.11.111(2) 主要代码码:注:把加加密狗所所提供的的DLLL文件(本实验验为Roockeey2.dlll)加载载到程序序的BBinDebbug目录下下。usinng SSysttem;usinng SSysttem.Colllecctioons.Genneriic;usinng SSysttem.CommponnenttModdel;usinng SSysttem.Datta;usinng SSysttem.Draawinng;usinng SSysttem.Texxt;usinng SSysttem.Winndowws.FFormms;usinng SSysttem.Runntimme.IInteeroppSerrvicces;nameespaace DoggTesstpubllicpparttiallclaassFFormm1 : Foorm publlic Forrm1() IInittiallizeeCommponnentt(); #rregiion引引用加密密狗所提提供的接接口 DDllIImpoort("Roockeey2.dlll")statticeexteerniint RY22_Fiind(); DDllIImpoort("Roockeey2.dlll")statticeexteerniint RY22_Oppen(intt moode, Innt322 uiid, reffIntt32 hidd); DDllIImpoort("Roockeey2.dlll")statticeexteernvvoidd RYY2_CClosse(iint hanndlee); DDllIImpoort("Roockeey2.dlll")statticeexteerniint RY22_GeenUIID(iint hanndlee, rrefIInt332 uuid, Sttrinng sseedd, iint isPProttectt); DDllIImpoort("Roockeey2.dlll")statticeexteerniint RY22_Reead(intt haandlle, intt bllockk_inndexx, SStriingBBuillderr buuffeer5112); DDllIImpoort("Roockeey2.dlll")statticeexteerniint RY22_Wrritee(innt hhanddle, innt bblocck_iindeex, Strringg buuffeer5112); #eendrregiion/启动动按钮的的事件代代码privvateevoiid BBtn_staart_Cliick(objjectt seendeer, EveentAArgss e) Striing strrinffo;int rett = 0;Int332 hhanddle = 00;Int332 hhid = 00;Int332 uuid = 00;Striing seeed, Wriitebbufff;Charr cRReadd = '0''striing ReaadBuuff = nnewsstriing(cReead, 5112);/查找找 rret = RRY2_Finnd();if (rett <= 0) lisstBoox1.Iteems.Addd("NNot Finnd RRockkey22!");retuurn; llisttBoxx1.IItemms.AAdd("Fiind Rocckeyy2 11!");/打开开 rret = RRY2_Opeen(00, 00, rref hidd);if (rett != 0) sstriinfoo = "Errr :" + haandlle; lisstBoox1.Iteems.Addd(sttrinnfo);retuurn; hhanddle = rret; sstriinfoo = "Roockeey2 :" + hhid; llisttBoxx1.IItemms.AAdd(strrinffo);/取得得UIDD sseedd = "Roockeey2"" rret = RRY2_GennUIDD(haandlle, reff uiid, seeed, 0); sstriinfoo = "Geen UUid:" + uiid; llisttBoxx1.IItemms.AAdd(strrinffo);/关闭闭 RRY2_Cloose(hanndlee); sstriinfoo = "Cllosee Roockeey2!" llisttBoxx1.IItemms.AAdd(strrinffo);/查找找,发现现 rret = RRY2_Finnd();/打开开 rret = RRY2_Opeen(11, uuid, reef hhid); hhanddle = rret;/写入入数据 WWrittebuuff = ""Wellcomme tto uusedd Roockeey2!" rret = RRY2_Wriite(hanndlee, 00, WWrittebuuff); sstriinfoo = "Wrritee Daata:" + "WWelccomee too ussed Rocckeyy2!"" llisttBoxx1.IItemms.AAdd(strrinffo);/读取取数据StriingBBuillderr reetbuuff = nnewSStriingBBuillderr("0"", 5512); rret = RRY2_Reaad(hhanddle, 0, reetbuuff); sstriinfoo = "Reead Datta:"" + rettbufff.TToSttrinng();listtBoxx1.IItemms.AAdd(strrinffo);DiallogRResuult dr = MMesssageeBoxx.Shhow("加密狗狗已经成成功启动动!", "xxiaooxi"", MeessaageBBoxBButttonss.OKK);if (dr = DiaaloggRessultt.OKK) WorkkMaiin wworkk = newwWorrkMaain(); worrk.SShoww(); privvateevoiid BBtn_cleear_Cliick(objjectt seendeer, EveentAArgss e) /清空按按钮的事事件代码码 llisttBoxx1.IItemms.CCleaar(); (3) 运行此实实例的界界面如果没有有正确加加载加密密狗,程程序会告告诉我们们没有发发现加密密狗,如如图5.1.112所示。图5.11.122如果正确确加载加加密狗,程程序会有有相应提提示,如如图5.1.113所示。图5.11.133点击“确确定”按钮后后,进入入工作页页面,如如图5.1.114所示。图5.11.144【实验思思考】根据自己己的硬件件不同,试试编写程程序通过过加密狗狗来控制制此程序序的运行行;通过加密密狗来控控制所编编程序的的使用人人数。利用BoounccyCaastlle AAPI加加密编程程实验【实验内内容】使用BoounccyCaastlleAPPI 接接口进行行编程【实验原原理】BounncyCCasttle 是一种种用于JJavaa平台的的开放源源码的轻轻量级密密码包。它它支持大大量的密密码算法法,并提提供JCCE 11.2.1的实实现。因因为Boounccy CCasttle被被设计成成轻量级级的,所所以从JJ2SEE 1.4 到到J2MME(包包括 MMIDPP)平台台,它都都可以运运行,是是在MIIDP上上运行的的唯一完完整的密密码包。后后来也提提供C#版本的的APII。Bounncy Casstlee APPI功能能很强大大,对于于初学者者来说,辨辨认类之之间的关关系以及及方法参参数和返返回值的的正确类类型有一一定难度度。通常常,开发发人员必必须浏览览源代码码和测试试用例来来研究BBounncy Casstlee APPI的主主要功能能。可以从hhttpp:/wwww.boounccycaastlle.oorg/cshharpp/ 网网站上可可以下载载最新的的C#版本本的DLLL类库库和源代代码。【实验环环境】运行环境境:Miicroosofft VVisuual Stuudioo 20005编程语言言:C#【实验步步骤】一、 利用Boounccy CCasttle APII编码实实现对数数据的加加解密将其DLLL类库库,添加加到自己己的项目目中,示示例的源源代码展展示如下下:(1) 本例的主主页面如如图5.1.221所示。图5.11.211(2) 其页面的的主要代代码为:usinng SSysttem;usinng SSysttem.Colllecctioons.Genneriic;usinng SSysttem.CommponnenttModdel;usinng SSysttem.Datta;usinng SSysttem.Draawinng;usinng SSysttem.Texxt;usinng SSysttem.Winndowws.FFormms;usinng SSysttem.IO;nameespaace BouuncyyCasstleeAPIIpubllicpparttiallclaassTTesttCryyptoo : Forrm striing sstrEEn = """, "" ;striing sstrDDe = """, "", "" ;publlic TesstCrryptto() IInittiallizeeCommponnentt(); privvateevoiid BBtn_Souurcee_Cllickk(obbjecct ssendder, EvventtArggs ee) OpennFilleDiialoog ffileedlgg = newwOpeenFiileDDiallog(); ffileedlgg.Fiilteer = "文本文文件(*.txxt)|*.ttxt""if (filledllg.SShowwDiaalogg() = DiaaloggRessultt.OKK) ttxt_Souurcee.Teext = ffileedlgg.FiileNNamee; privvateevoiid BBtn_tarrgett_Cllickk(obbjecct ssendder, EvventtArggs ee) OpennFilleDiialoog ffileedlgg = newwOpeenFiileDDiallog(); ffileedlgg.Fiilteer = "文本文文件(*.txxt)|*.ttxt""if (filledllg.SShowwDiaalogg() = DiaaloggRessultt.OKK) txtt_taargeet.TTextt = filledllg.FFileeNamme; /加密密privvateevoiid BBtn_Enccryppt_CClicck(oobjeect sennderr, EEvenntArrgs e) if (txtt_Soourcce.TTextt = """ | txxt_SSourrce.Texxt = sstriing.Emppty) MesssageeBoxx.Shhow("请选择择文件!");retuurn; if (txtt_taargeet.TTextt = """ | txxt_ttargget.Texxt = sstriing.Emppty) MesssageeBoxx.Shhow("请选择择文件!");retuurn; elsee strrEn0 = ttxt_Souurcee.Teext; strrEn1 = ttxt_tarrgett.Teext;DESEEncrryptto.IIninn(sttrEnn); /调用 DDESEEncrryptto 类类 /解密密privvateevoiid BBtn_Deccryppt_CClicck(oobjeect sennderr, EEvenntArrgs e) if (txtt_Soourcce.TTextt = """ | txxt_SSourrce.Texxt = sstriing.Emppty) MesssageeBoxx.Shhow("请选择择文件!"); retuurn; if (txtt_taargeet.TTextt = """ | txxt_ttargget.Texxt = sstriing.Emppty) MesssageeBoxx.Shhow("请选择择文件!");retuurn; elsee strrDe0 = ttxt_Souurcee.Teext; strrDe1 = ttxt_tarrgett.Teext;/相对对于当前前工作目目录striing strrPatth = Diirecctorry.GGetCCurrrenttDirrecttoryy(); striing strrKeyy = strrPatth + "" + ""desskeyy.daat" /密钥文文件路径径 sttrDee2 = strrKeyy;DESEEncrryptto.IIninn(sttrDee); /调用 DDESEEncrryptto 类类 (3) DESEEncrryptto的具具体代码码usinng SSysttem;usinng SSysttem.Colllecctioons.Genneriic;usinng SSysttem.Texxt;usinng SSysttem.IO;usinng OOrg.BouuncyyCasstlee.Crryptto; /请注注意命名名空间的的引用usinng OOrg.BouuncyyCasstlee.Crryptto.EEngiiness;usinng OOrg.BouuncyyCasstlee.Crryptto.GGeneerattorss;usinng OOrg.BouuncyyCasstlee.Crryptto.MModees;usinng OOrg.BouuncyyCasstlee.Crryptto.PPadddinggs;usinng OOrg.BouuncyyCasstlee.Crryptto.PParaametterss;usinng OOrg.BouuncyyCasstlee.Seecurrityy;usinng OOrg.BouuncyyCasstlee.Uttiliitiees.EEncooderrs;nameespaace BouuncyyCasstleeAPII publliccclasssDEESEnncryyptoo / truue:解解密,ffalsse:解解密privvateeboool eencrryptt = truue;/句句柄privvateePadddeddBuffferredBBlocckCiipheer cciphher = nnulll;/输输入流(源文件件)privvateeStrreamm innStrr = nulll;/输输出流(目标文文件)privvateeStrreamm ouutSttr = nuull;/密密钥privvateebytte keey = nuull;publlicsstatticvvoidd Innin(strringg arggs) booll enncryypt = ttruee;striing inffilee = nulll;striing outtfille = nuull;striing keyyfille = nuull;if (arggs.LLenggth < 22) Conssolee.Errrorr.WrriteeLinne(""Usaage: " + ttypeeof(DESSEnccryppto).Naame + "" innfille ooutffilee kkeyffilee");Enviironnmennt.EExitt(1); kkeyffilee = "deeskeey.ddat"" iinfiile = aargss0; ooutffilee = arggs11;if (arggs.LLenggth > 22) enccryppt = faalsee; keyyfille = arrgs2; DESEEncrryptto ddes = nnewDDESEEncrryptto(iinfiile, ouutfiile, keeyfiile, enncryypt); ddes.proocesss(); publlic DESSEnccryppto(strringg innfille,sstriing outtfille,sstriing keyyfille,bbooll enncryypt)thiss.enncryypt = eencrryptt;tryinSStr = FFilee.OppenRReadd(innfille); /打开文文件catcch (FilleNootFoounddExccepttionn)Conssolee.Errrorr.WrriteeLinne(""Inpput fille nnot fouund "+inffilee+"");Enviironnmennt.EExitt(1);tryouttStrr = Fille.CCreaate(outtfille); /打开文文件catcch (IOEExceeptiion)Conssolee.Errrorr.WrriteeLinne(""Outtputt fiile nott crreatted "+outtfille+""");Enviironnmennt.EExitt(1);if (enccryppt)try/创创建密钥钥文件ddeskkey.dattSecuureRRanddom sr = nnewSSecuureRRanddom();KeyGGeneerattionnParrameeterrs kkgp = nnewKKeyGGeneerattionnParrameeterrs(ssr,DesEEdePParaametterss.DeesEddeKeeyLeengtth * 8);DesEEdeKKeyGGeneerattor kgg = newwDessEdeeKeyyGenneraatorr();kg.Iniit(kkgp);keyy = kg.GenneraateKKey(); Streeam keyystrreamm = Fille.CCreaate(keyyfille);bytee keyyhexx = Hexx.Enncodde(kkey);keyystrreamm.Wrritee(keeyheex, 0, keyyhexx.Leengtth);keyystrreamm.Fllushh();keyystrreamm.Cllosee();catcch (IOEExceeptiion)Conssolee.Errrorr.WrriteeLinne(""Couuld nott deecryyptiion creeatee keey ffilee "+"""+keeyfiile+""");Enviironnmennt.EExitt(1);elseetry/读读密钥文文件deeskeey.ddatStreeam keyystrreamm = Fille.OOpennReaad(kkeyffilee);int lenn = (innt) keyystrreamm.Leengtth;bytee keyyhexx = newwbyttellen;keyystrreamm.Reead(keyyhexx, 00, llen);keyy = Hexx.Deecodde(kkeyhhex);catcch (IOEExceeptiion)Conssolee.Errror.WriiteLLinee("DDecrrypttionn keey ffilee noot ffounnd, "+ "oor nnot vallid "+keyyfille+""");Enviironnmennt.EExitt(1);privvateevoiid pproccesss() /填充模模式CBBC;分分组模式式Pkccs7 cippherr = newwPadddeddBuffferredBBlocckCiipheer(newwCbccBloockCCiphher(newwDessEdeeEngginee(); if (enccryppt) peerfoormEEncrryptt(keey); elsee peerfoormDDecrryptt(keey); try innStrr.Cllosee(); ouutSttr.FFlussh(); ouutSttr.CClosse(); catcch (IOEExceeptiion) /<<summmarry>/加加密/<</suummaary>>/<<parram namme=""keyy"><</paaramm>privvateevoiid pperfformmEnccryppt(bbytee keyy) cippherr.Innit(truue, newwKeyyParrameeterr(keey); int inBBlocckSiize = 447;int outtBloockSSizee = cippherr.GeetOuutpuutSiize(inBBlocckSiize);bytee inbblocck = neewbyyteinBBlocckSiize;bytee outtbloock = nnewbbyteeouutBllockkSizze;try int inLL;int outtL;bytee rv = nnulll;whille (innL = innStrr.Reead(inbblocck, 0, inBBlocckSiize) >> 0) ooutLL = cippherr.PrroceessBBytees(iinbllockk, 00, iinL, ouutbllockk, 00);if (outtL >> 0) rv = HHex.Enccodee(ouutbllockk, 00, ooutLL); outtStrr.Wrritee(rvv, 00, rrv.LLenggth); outtStrr.WrriteeBytte(bytte)'nn'); try ooutLL = cippherr.DooFinnal(outtbloock, 0);if (outtL >> 0) rv = HHex.Enccodee(ouutbllockk, 00, ooutLL); outtStrr.Wrritee(rvv, 00, rrv.LLenggth); outtStrr.WrriteeBytte(bytte)'nn'); catcch (CryyptooExccepttionn) catcch (IOEExceeptiion ioeereaad) Conssolee.Errrorr.WrriteeLinne(iioerreadd.SttackkTraace); /<<summmarry>/解解密/<</s