陳平平 譚永明
(東莞理工學(xué)院 電子工程學(xué)院,廣東東莞 523808)
加密狗是接在微機(jī)端口上的一個(gè)軟件保護(hù)裝置,它包括主機(jī)檢查程序和密鑰 (也稱加密盒)兩部分,是屬于軟硬件結(jié)合的加密技術(shù),具有加密強(qiáng)度大、可靠性高等特點(diǎn),現(xiàn)已廣泛應(yīng)用于計(jì)算機(jī)軟件保護(hù)[1]。加密狗技術(shù)已經(jīng)發(fā)展到第4代,它以USB接口、微控制器和EEPROM為核心器件,又稱微狗,在智能性、應(yīng)用靈活性和抗破解能力等方面都得到了很大提高[2]。
USB加密狗的實(shí)現(xiàn)有三種方式:一是最簡(jiǎn)單的,不需加密只返回確認(rèn)信息,即計(jì)算機(jī)發(fā)送數(shù)據(jù)給加密狗,加密狗接收到數(shù)據(jù)后驗(yàn)證是否正確,返回一個(gè)確認(rèn)信息給計(jì)算機(jī)。二是對(duì)數(shù)據(jù)進(jìn)行加密,即計(jì)算機(jī)發(fā)送數(shù)據(jù)給加密狗,加密狗按照某個(gè)算法處理接收到的數(shù)據(jù),同時(shí)加密狗將處理后的數(shù)據(jù)返回給上位機(jī),由上位機(jī)來驗(yàn)證加密后的數(shù)據(jù)[3-5]。以上兩種方式,都只是簡(jiǎn)單地實(shí)現(xiàn)加密狗的功能,雖然也有加密處理,但是數(shù)據(jù)經(jīng)過USB接口傳輸時(shí)是明碼傳輸,很容易在計(jì)算機(jī)上被數(shù)據(jù)監(jiān)控軟件獲取數(shù)據(jù)后破解。三是多重加密的方式,即數(shù)據(jù)傳輸過程再次進(jìn)行加密[6]。
現(xiàn)在流行的USB加密狗設(shè)計(jì)方案是單片機(jī)+USB接口芯片+EEPROM存儲(chǔ)器,此方案不但系統(tǒng)復(fù)雜,而且具有體積大、硬件成本高等缺點(diǎn)[7]。選擇的設(shè)計(jì)方案是通過一款內(nèi)帶EEPROM的單片機(jī),通過普通IO口來模擬USB時(shí)序,完成USB1.1協(xié)議的通信,利用DES算法來實(shí)現(xiàn)保密傳輸與數(shù)據(jù)加密,最終實(shí)現(xiàn)USB加密狗的功能,即通過單芯片就能解決問題。
USB加密狗采用的硬件電路圖如圖1所示,全部功能由一個(gè)芯片完成,既降低了硬件成本同時(shí)也提高了系統(tǒng)可靠性。電路中選用的單片機(jī)是Atmel公司生產(chǎn)的ATtiny85,它是一款基于AVR RISC低功耗CMOS的8位單片機(jī),工作電壓為1.8~5.5 V,內(nèi)嵌8K字節(jié)的Flash程序存儲(chǔ)器,512字節(jié)的SRAM數(shù)據(jù)存儲(chǔ)器和512字節(jié)的EEPROM,其Flash程序存儲(chǔ)器支持ISP和debugWIR編程方式。采用SOP8的封裝,有6個(gè)多功能復(fù)用的I/O引腳,都可配置為外部中斷,有2個(gè)獨(dú)立可設(shè)置預(yù)分頻的8位定時(shí)/計(jì)數(shù)器。內(nèi)部還集成了上電復(fù)位電路、看門狗、RC振蕩器和片內(nèi)溫度傳感器等[8]。如圖1所示,從USB接口引入的5 V電壓,經(jīng)過兩個(gè)二極管降壓后變?yōu)?.6 V電壓作為系統(tǒng)電源供給單片機(jī)使用。將單片機(jī)的第1引腳配置為IO口外接LED用于顯示運(yùn)行狀態(tài),第5、6引腳配置為IO口用于聯(lián)接USB的數(shù)據(jù)線,第7腳配置為外中斷引腳。為了滿足低速USB設(shè)備的1.5 M速度時(shí)序的讀寫要求,單片機(jī)需要達(dá)到20MIPS的指令執(zhí)行速度,故電路中將第2、3腳配置為晶振引腳并連接20 MHz的晶振。
圖1 軟件狗電路圖
根據(jù)USB的協(xié)議規(guī)范,USB主機(jī)的下游端口D+與D-上都分別連接一個(gè)15 K的下拉電阻到地,當(dāng)端口懸空 (即沒設(shè)備插入)時(shí),輸入端就被兩個(gè)下拉電阻拉回到低電平。而USB設(shè)備端在D+或者D-上接一個(gè)1.5 K的上拉電阻連到電源,1.5 K的上拉電阻是連接D+還是D-由USB設(shè)備的速度來決定。對(duì)于全速設(shè)備和高速設(shè)備的上拉電阻連接到D+上,而低速設(shè)備的上拉電阻則是連接到D-上的。當(dāng)設(shè)備插入U(xiǎn)SB主機(jī)的下游端口時(shí),接了上拉電阻的那條數(shù)據(jù)線的電壓由1.5 K的上拉電阻和15 K的下拉電阻分壓決定,產(chǎn)生高電平信號(hào),USB主控制器就能檢測(cè)到被拉高的數(shù)據(jù)線是D+還是D-來判斷插入的是什么速度類型的設(shè)備。因?yàn)楸痉桨杆O(shè)計(jì)的加密狗為低速USB設(shè)備,故USB接口的差分?jǐn)?shù)據(jù)線D-的上拉電阻R3為1.5 K。同時(shí)D-通過330 Ω的限流電阻R2聯(lián)接到單片機(jī)ATtiny85的PB0引腳,PB1引腳通過電阻R1聯(lián)接到D+和INT0,INT0為單片機(jī)的外中斷口,當(dāng)USB總線上有數(shù)據(jù)時(shí)采用中斷方式觸發(fā)。由于D-在總線處于恢復(fù)狀態(tài)和復(fù)位信號(hào)狀態(tài)時(shí)電平不會(huì)發(fā)生跳變,故而需用D+數(shù)據(jù)線連接至單片機(jī)的外部中斷0(INT0),當(dāng)有中斷發(fā)生時(shí),表示總線上有數(shù)據(jù)傳輸,此時(shí)再由軟件來判斷為何種數(shù)據(jù)傳輸。
用單片機(jī)IO口來模擬USB接口時(shí)序,即可完成USB接口芯片的功能,包括NRZI編解碼、同步模式的識(shí)別、并行/串行轉(zhuǎn)換、位填充/解除填充、CRC校驗(yàn)/產(chǎn)生、PID校驗(yàn)/產(chǎn)生、地址識(shí)別和握手評(píng)估與產(chǎn)生等功能[9]。其設(shè)計(jì)的核心是USB數(shù)據(jù)傳輸?shù)腘RZI編解碼,USB數(shù)據(jù)包的分析和描述符。
USB發(fā)送數(shù)據(jù)的編碼方式采用NRZI編碼:當(dāng)數(shù)據(jù)為0時(shí),電平翻轉(zhuǎn);當(dāng)數(shù)據(jù)為1時(shí),電平不翻轉(zhuǎn),為了防止出現(xiàn)長(zhǎng)時(shí)間電平不變化,所有在數(shù)據(jù)發(fā)送前進(jìn)行串行化后加入了位填充處理,即當(dāng)遇到連續(xù)6個(gè)數(shù)據(jù)1是時(shí),就強(qiáng)制插入一個(gè)數(shù)據(jù)0,經(jīng)過位填充后的數(shù)據(jù),進(jìn)行NRZI編碼后發(fā)送到USB差分?jǐn)?shù)據(jù)線上。USB接收數(shù)據(jù)的過程則是USB發(fā)送數(shù)據(jù)的相反過程:先進(jìn)行NRZI解碼,去掉位填充,最后是串行數(shù)據(jù)轉(zhuǎn)并行數(shù)據(jù)。因?yàn)閁SB接受者只能通過USB數(shù)據(jù)包來獲得同步時(shí)鐘,所以在每個(gè)USB數(shù)據(jù)包的最開始都有個(gè)同步域 (SYNC),這個(gè)域固定值為0000 0001,這個(gè)域通過NRZI編碼之后,就是一串方波,接受者可以通過SYNC域來同步之后的數(shù)據(jù)信號(hào)。由于通信過程對(duì)時(shí)序要求非常嚴(yán)格,所以本設(shè)計(jì)的軟件部分全部使用匯編語言編寫,同時(shí)在進(jìn)行讀寫操作時(shí)選擇合適的指令以滿足時(shí)序的要求。
USB總線上傳輸?shù)臄?shù)據(jù)是以包為基本單位的。一個(gè)包被分成不同的域,根據(jù)不同類型的包所包含的域是不一樣的。但是不同的包有共同的特點(diǎn),就是都是要以SYNC開始緊跟著一個(gè)包標(biāo)識(shí)符 (PID),最終以包結(jié)束符EOP來結(jié)束這個(gè)包。單片機(jī)在接收到EOP結(jié)束符后,就開始對(duì)USB數(shù)據(jù)包進(jìn)行分析確定包的類型并調(diào)用相應(yīng)的函數(shù)來處理。
標(biāo)準(zhǔn)的USB設(shè)備有5種USB描述符:設(shè)備描述符,配置描述符,字符串描述符,接口描述符和端點(diǎn)描述符[10]。一個(gè)USB設(shè)備只有一個(gè)設(shè)備描述符,設(shè)備描述符里面決定了該設(shè)備有多少種配置,每種配置有相對(duì)應(yīng)的配置描述符;同時(shí)在配置描述符中又定義了該配置里面有多少個(gè)接口,每個(gè)接口有相對(duì)應(yīng)的接口描述符;在接口描述符里面又定義了該接口有多少個(gè)端點(diǎn),每個(gè)端點(diǎn)有相對(duì)應(yīng)端點(diǎn)描述符;端點(diǎn)描述符定義了端點(diǎn)的大小和類型等等。在USB的協(xié)議規(guī)范中,沒有USB加密狗這樣的類型,所以在設(shè)備描述符中的類代碼為0XFF,即廠商自定義的設(shè)備??紤]到加密狗的實(shí)際需求,本設(shè)計(jì)只提供一個(gè)普通的數(shù)據(jù)端口,數(shù)據(jù)端口只支持中斷傳輸,支持包的長(zhǎng)度為8字節(jié)。
用軟件模擬USB時(shí)序,實(shí)現(xiàn)USB接口通信并成功枚舉后,給上層加密狗的功能程序提供的接口函數(shù)是ReadSoftdogData和WriteSoftdogData,通過函數(shù)ReadSoftdogData采用軟件中斷的方式讀出上位機(jī)軟件發(fā)來的64位數(shù),然后通過函數(shù)WriteSoftdogData把數(shù)據(jù)返回給上位機(jī)。
設(shè)計(jì)中考慮到設(shè)備的安全性及單片機(jī)的性能,采用DES加密算法。目前為止,除了用窮舉搜索法對(duì)DES算法進(jìn)行攻擊外,還沒有發(fā)現(xiàn)其他更有效的辦法,因此DES算法具有極高的安全性。DES算法使用64位的密鑰,其中只有56位有效,而56位長(zhǎng)的密鑰的窮舉空間為256[11-13]。DES算法的加密流程圖如圖2所示。DES解密過程與加密過程類似,文中將不做介紹。
圖2 DES算法的加密流程圖
圖3 軟件狗加密過程圖
本設(shè)計(jì)的加密狗加密具體過程如圖3所示,上位機(jī)產(chǎn)生一個(gè)隨機(jī)數(shù)D1,并將隨機(jī)數(shù)進(jìn)行加密處理成D2發(fā)送給USB加密狗,即實(shí)現(xiàn)傳輸?shù)募用堋<用芄肥盏綌?shù)據(jù)D2后根據(jù)約定的密鑰對(duì)數(shù)據(jù)進(jìn)行解密成D1。接著將數(shù)據(jù)進(jìn)行另一套加密變成數(shù)據(jù)成D3,然后進(jìn)行傳輸加密成D4,最后將D4返回給計(jì)算機(jī)。計(jì)算機(jī)得到數(shù)據(jù)D4后,進(jìn)行兩次解密得到數(shù)據(jù)D1,完成了加密狗的確認(rèn)功能。這樣兩級(jí)的加密方式,有效地防止了通過數(shù)據(jù)監(jiān)控軟件獲取密碼的行為。
本加密狗的功能是保護(hù)軟件版權(quán),當(dāng)用戶從軟件供應(yīng)商處購(gòu)買軟件時(shí),供應(yīng)商會(huì)把加密狗的相關(guān)信息寫入到加密狗中,如初始密碼、所支持的計(jì)算機(jī)數(shù)量、軟件可使用的次數(shù)等等。這些信息都可通過加密算法存儲(chǔ)在單片機(jī)片內(nèi)的EEPROM中。用戶在運(yùn)行軟件時(shí),加密狗會(huì)根據(jù)使用情況更新存儲(chǔ)在EEPROM中的信息。具體的功能流程如圖4所示:1)插入U(xiǎn)SB后完成加密狗設(shè)備的枚舉;2)枚舉成功后上位機(jī)軟件產(chǎn)生一組32位的隨機(jī)數(shù),并將這組隨機(jī)通過USB發(fā)給加密狗;3)加密狗接收到上位機(jī)發(fā)過來的32位隨機(jī)數(shù)后根據(jù)約定的加密算法,對(duì)這個(gè)隨機(jī)數(shù)進(jìn)行運(yùn)算,并將結(jié)果返回上位機(jī)軟件;4)上位機(jī)軟件接收到數(shù)據(jù)后,也運(yùn)行加密反運(yùn)行算法,看是否能返回原來的隨機(jī)數(shù),如果成功反回原來的隨機(jī)數(shù)則此加密狗是合法的,從而達(dá)到保護(hù)軟件版權(quán)的目的。
圖4 功能流程圖
主要使用USB協(xié)議分析軟件USBlyzer、DES加解密軟件IDES_Tool和筆者自行設(shè)計(jì)的一個(gè)應(yīng)用軟件來共同測(cè)試。USBlyzer是USB協(xié)議分析軟件,該軟件可實(shí)時(shí)監(jiān)測(cè)USB接口數(shù)據(jù),有抓包、解包和協(xié)議分析等功能,也可以來破解明文傳輸 (不加密)的USB加密狗的,同時(shí)通過這個(gè)軟件可以看到加密狗的類型和設(shè)備名稱。
圖5 測(cè)試截圖
在使用筆者設(shè)計(jì)的應(yīng)用軟件測(cè)試前必須檢測(cè)到機(jī)器已經(jīng)加載加密狗,因此進(jìn)行測(cè)試前首先打開USBlyzer軟件。打開USBlyzer軟件如圖5所示,在Davice Tree窗口中看到加密狗的類型和設(shè)備名稱。假定密鑰為0X8899AABBCCDDEEFF,這組數(shù)據(jù)是16進(jìn)制數(shù)密鑰,在設(shè)計(jì)加密狗時(shí)寫入加密狗的代碼中,檢測(cè)軟件看不到該組數(shù)據(jù)。筆者設(shè)計(jì)的應(yīng)用軟件產(chǎn)生的隨機(jī)數(shù)為0X5E87D9837ADF2C77,這組隨機(jī)數(shù)據(jù)是在USB接口中傳輸,一般情況下能被USB分析軟件中看到,本設(shè)計(jì)的加密狗不是將這組報(bào)隨機(jī)數(shù)據(jù)直接傳輸,而是加密為0X0000001887BECBB4進(jìn)行傳輸,因此未能在檢測(cè)軟件中看到該組數(shù)據(jù)。加密后的數(shù)據(jù)為0X0000001887BECBB4,通過USBlyzer軟件可以獲取到這組數(shù)據(jù),如圖5中URB Details窗口中能夠看到該組數(shù)據(jù)。如果該數(shù)據(jù)被他人非法獲取時(shí),使用與原密鑰 (0X8899AABBCCDDEEFF)只錯(cuò)一位的密鑰:0X0899AABBCCDDEEFF,那么非法獲取者根據(jù) DES算法解碼得到的數(shù)據(jù)是:0XEDC955911CD1A8CD,可見此數(shù)據(jù)跟原數(shù)據(jù)沒有任何相關(guān)性。即采用傳統(tǒng)的攔截USB數(shù)據(jù)進(jìn)行破解,或者攔截大量USB數(shù)據(jù)后進(jìn)行反推密鑰方式,都無法成功,證明了此設(shè)計(jì)加密狗的安全性能。
本設(shè)計(jì)基于單芯片為解決方案,從軟件著手簡(jiǎn)化設(shè)計(jì)。用軟件來實(shí)現(xiàn)硬件的功能,通過DES加密算法實(shí)現(xiàn)保密傳輸,達(dá)到降低成本,提高系統(tǒng)可靠性、安全性的要求,為軟件版權(quán)保護(hù)提供了一種理想的方式。因?yàn)閮?nèi)部有EEPROM,可以給軟件提供商甚至用戶進(jìn)行二次開發(fā)。
[1]徐增祥.USB軟件狗的設(shè)計(jì)及反破解技術(shù)[J].電子技術(shù)應(yīng)用,2002(7):11-14.
[2]李志偉.基于硬件特征信息嵌入認(rèn)證的軟件保護(hù)[J].計(jì)算機(jī)工程與設(shè)計(jì),2012,33(7):2550-2554.
[3]陳芳,李倫.基于USB軟件狗的反解密研究[J].微型機(jī)與應(yīng)用,2004(1):19-21.
[4]趙路華.基于USB Key的軟件保護(hù)體系研究[J].計(jì)算機(jī)安全,2013(8):18-20.
[5]吳德會(huì),王志毅.基于混沌保密的USB軟件加密狗及其反解密研究[J].微計(jì)算機(jī)信息,2005,21(8):15-17.
[6]胡軍,劉文江,胡懷中,等.基于PIC16C54單片機(jī)的智能軟件狗設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2003(1):18-20.
[7]王瑋.一種基于USB Key加解密技術(shù)的軟件保護(hù)方案研究[J].信息網(wǎng)絡(luò)安全,2012(5):52-58.
[8]于正林.AVR單片機(jī)原理及應(yīng)用[M].北京:國(guó)防工業(yè)出版社,2009.
[9]薛園園.USB應(yīng)用開發(fā)技術(shù)大全[M].北京:人民郵電出版社,2007.
[10]肖踞雄,宋中慶.USB技術(shù)及應(yīng)用設(shè)計(jì)[M].北京:清華大學(xué)出版社,2003.
[11](美)羅伯特.算法[M].4版.謝路云,譯.北京:人民郵電出版社,2012.
[12]于廣威,何文才.基于HMAC的加密狗設(shè)計(jì)[J].信息安全與通信保密,2011(11):68-69.
[13]歐陽雪,周寰,鄧錦洲,等.一種面向軟件生命周期的授權(quán)保護(hù)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與科學(xué),2013,35(4):59-64.