由於固化在片外EPROM 裡的單片機程序容易複製,所以,如不在技術上採取保護措施,則程序中所採用的處理方法易被他人分析仿製。對單片機程序進行加密是一種有效的保護措施,也是一項實用的技術。雖然本身帶有EPROM 的單片機可做到程序保密,但由於價格和存儲容量方面的原因,用戶仍常常採用外接EPROM 的單片機來開發產品。
本文以MCS - 51 單片機為例介紹一種對片外E2PROM 裡的程序進行軟體加密和硬體解密的方法。這種方法不增加用戶應用程式開銷。
1 基本原理
我們知道,異或運算有這樣的特點: A Ý B Ý B =A ,亦即當用變量B 對變量A 作偶數次異或運算後,其結果恢復為變量A。例如A = 32H , B = 5EH ,則AÝ B 的結果為6CH ,該結果再與變量B 作異或運算,即6CH Ý 5EH 就得到變量A 的值32H。因此,我們可以利用這一特點給單片機程序加密和解密。
51 系列單片機在對外部程序存儲器ROM 和外部數據存儲器RAM 操作時採用兩套不同的指令,在對RAM 操作時用MOVX指令,並產生相應的讀(RD) 和寫(WR) 信號,而當對外部ROM 進行讀操作時不用RD信號,而是有一條專給外部ROM 使用的「讀」數控制信號(PSEN) 線。亦即外部RAM 和ROM 的控制信號是嚴格分開的。這就為利用異或運算給外部ROM裡的程序進行加密後固化、解密後執行提供了條件。
這種方法的思路是:首先對欲固化到外部ROM裡的目的代碼(原代碼) 進行第一次異或運算(加密) ,再把加密後的代碼固化到ROM 裡,程序運行時由硬體對從ROM 讀出的加密代碼進行第二次異或運算(解密) 變為原代碼後送到數據總線。這樣,外部ROM
裡固化的是加密代碼,即便該代碼被複製也反彙編不出原程序。另外該程序的執行還需相應的解密電路支持。
圖1 是可以在實際中應用的單片機解密電路。當CPU 對片外EPROM(U04) 進行「讀」操作時,控制信號PSEN為低電平,這時U04 送出八位加密代碼(RD0~RD7) 並和「密鑰」經由U05 、U06 組成的異或運算電路作第二次異或運算(解密) 得到原代碼,該代碼經三
態緩衝器(U07) 由PSEN信號控制送入數據總線。由於電路中已將單片機的EA腳接地,故片外EPROM 的最低地址為0 。另外,與RD0~RD7 一起參與異或運算的另一個數據(「密鑰」) 取自當前待解密代碼在外部EPROM所在存儲單元的低八位地址,並從高位到低位按A0 A2 A4 A6 A1 A3 A5 A7 的順序組合成新的數據。例如,原地址分別為35H 和36H ,組合後的地址則分別為E2H 和6AH。採用這樣的方法確定「密鑰」,一是可使一頁中的代碼中「密鑰」不重複,二是由於同頁中的代碼字節的「密鑰」都不同,故很難找到加密規律,可增加破譯難度。
2 操作過程
現以SICE 通用單片機仿真器為例說明製作加密程序並固化到片外EPROM 裡的操作過程。設程序一是一個待固化到片外EPROM 裡執行的用戶應用程式。為簡便起見,它對外部RAM 的前256 個單元賦於相應的低地址後轉入死循環。因為仿真器的出借RAM 為從8000H 開始的24K空間,故應根據程序大小用偽指令把最低地址定位在8000H~DFFFH的24K空間裡(如程序一中的ORG 8000H) ,否則,無法直接對該程序的目的碼進行第一次異或運算。
程序二是對程序一的目的代碼(存放於仿真RAM的8000H~804AH 中共4BH 個字節) 進行第一次異或加密運算的。要加密的總代碼字節數由程序一經彙編後得知。該程序中「密鑰」的計算應與硬體電路中送到解密電路的低八位地址線的連接關係相一致。
未完,請點擊左下角「閱讀原文」繼續閱讀
【分享】如果有所收穫,歡迎隨手「點擊右上角」把「精彩文章」分享到朋友圈或者朋友,讓大家一起感受成長的快樂~~
關注電工學習網官方微信公眾號,第一時間獲取最新的經驗及基礎知識文章,請點擊標題下「電工電氣學習」或直接添加帳號:「dian_gon」關注。