一、加密狗原理簡介
加密狗是爲軟件開發商提供的一種智能型的軟件保護工具,它包含一個安裝在計算機並行口或USB口上的硬件,及一套適用於各種語言的接口軟件和工具軟件。加密狗基於硬件保護技術,其目的是通過對軟件與數據的保護防止知識產權被非法使用。
加密狗是外形酷似U盤的一種硬件設備,正名加密鎖,後來發展成如今的一個軟件保護的通俗行業名詞,加密狗是一種插在計算機並行口上的軟硬件結合的加密產品(新型加密狗也有USB口的)。一般都有幾十或幾百字節的非易失性存儲空間可供讀寫,現在較新的狗內部還包含了單片機。軟件開發者可以通過接口函數和軟件狗進行數據交換(即對軟件狗進行讀寫),來檢查軟件狗是否插在接口上;或者直接用軟件狗附帶的工具加密自己的EXE文件(俗稱"包殼")。這樣,軟件開發者可以在軟件中設置多處軟件鎖,利用軟件狗做爲鑰匙來打開這些鎖;如果沒插軟件狗或軟件狗不對應,軟件將不能正常執行。
加密狗是通過在軟件執行過程中和加密狗交換數據來實現加密的。加密狗內置單片機電路(也稱CPU),使得加密狗具有判斷、分析的處理能力,增強了主動的反解密能力。這種加密產品稱它爲“智能型”加密狗。加密狗內置的單片機裏包含有專用於加密的算法軟件,該軟件被寫入單片機後,就不能再被讀出。這樣,就保證了加密狗硬件不能被複制。同時,加密算法是不可預知、不可逆的。加密算法可以把一個數字或字符變換成一個整數,如DogConvert(1)=12345、DogConvert(A)=43565。
(以上內容來源於網絡)
二、第一次使用ROCKEY-ARM
一定要先認真閱讀《ROCKEY-ARM產品介紹》和《ROCKEY-ARM用戶工具使用手冊》。
- 打開RyRAMNavigation.exe
界面中有三個標籤頁:“ROCKEY-ARM 標準鎖”、“ROCKEY-ARM 時鐘鎖”和“ROCKEY-ARM U 盤鎖”,根據使用的鎖選擇相應的標籤頁,點擊“更多瞭解······”。
選擇“用戶工具”標籤頁,裏面介紹了集中常用工具的功能,初次使用點擊“集成編輯工具”打開即可。
此時是一把空鎖,所有信息都是出廠時的默認值,直接點擊“登錄”即可。
- 初始化鎖
初始化鎖的目的是把空鎖變成唯一化的子鎖。關於空鎖、子鎖、母鎖之間的關係:
空鎖 | 飛天出廠的鎖,所有信息都是缺省值,特徵是產品ID爲FFFFFFFF |
子鎖 | 開發商通過種子碼唯一化後的鎖,特徵是產品ID不再是FFFFFFFF |
母鎖 | 在子鎖的基礎上寫入了母鎖數據,方便開發商的安全生產,特徵是硬件信息中的母鎖標誌位爲1 |
以開發商(管理員)權限使用缺省信息登錄後,在“基本功能”標籤頁生成隨機數作爲種子碼,點擊“導出”,保存爲一個bin文件。
點擊進入“密碼安全”標籤頁,導入剛纔保存的種子碼文件(bin文件),點擊“生成”完成鎖的初始化。
務必牢記產品ID和管理員密碼,妥善保管好種子碼!如果嫌生成的密碼不好記,重新登錄後可以返回當前頁修改密碼,注意密碼必須是16位。
三、軟件加密
加密狗初始化以後就可以進行基本的軟件加密操作了。ROCKEY-ARM給我們提供了三種加密文件:數據文件、密鑰文件和可執行文件,用來對軟件進行加密。
數據文件 | 數據文件可以和上層軟件進行關聯,即用API進行訪問,數據文件也可以被鎖內的可執行文件讀寫 |
密鑰文件 | 理解密鑰文件,可以參考這兩篇文章:
公鑰,私鑰和數字簽名這樣最好理解 一妻多夫制的鑰匙 |
可執行文件 | 所謂可執行文件,就是由鎖內的處理器芯片進行運算的程序文件。用戶可以將程序中的核心代碼編寫成ARM可執行程序下載到鎖內,在程序運行過程中,調用提供的API接口,爲可執行文件傳入運行參數,通過可執行文件在加密鎖內部運行後,將結果返回給外部的用用程序,是被保護的軟件與鎖進行交互,從而達到軟件保護的目的。 |
下圖是各種文件在ROCKEY-ARM中的訪問權限表:
接下來,我們使用數據文件+密鑰文件的方式來對軟件進行加密,基本的思路是:先生成一對密鑰,然後產生一組隨機數作爲原始數據,再用公鑰對隨機數進行加密,最後將加密的數據文件保存到鎖內;程序通過API先讀取鎖內加密後的數據文件,然後用鎖內的私鑰進行解密,如果解密後的數據與原始數據完全相同,則獲得軟件使用權限。以上所有文件的操作權限只歸開發商所有,原始數據也可以寫到鎖內。基本操作步驟如下:
- 生成密鑰對
首先進入“文件管理”菜單頁,選擇文件類型爲“RSA私鑰文件”(選擇ECCSM2私鑰文件亦可),點擊創建,彈出如下窗口:
填入文件ID(注意:文件ID必須是0000~FFFF之間的數,且所有文件類型的文件ID不能使用0000,3F00和FFFF),點擊“創建”即可。然後選中剛剛生成的私鑰文件,再設置好公鑰和私鑰的保存路徑,點擊“產生”,即可保存一對密鑰文件。
- 產生隨機數並加密
產生隨機數的方法與上面初始化鎖時的操作相同,然後進入“加密解密”菜單頁,導入保存的隨機數,選擇“RSA公鑰加密”,如下圖所示:
點擊“執行”,在彈出的窗口中選擇剛纔保存的公鑰文件打開,即可產生輸出結果,最後將結果導出保存即可。
- 寫入加密數據文件
回到“文件管理”頁,選擇“數據文件”,點擊“創建”,彈出如下窗口:
首先設置文件的讀寫權限爲“管理員”,輸入文件ID,然後去掉“空文件”處的√,點擊“導入”,打開剛纔公鑰加密後的數據文件,點擊“創建”即可,如下圖所示:
這樣,文件類型爲“數據文件”的文件列表中就會有一個ID爲“1111”的文件,而且我們還可以對這個文件進行刪除和讀寫操作。
現在,加密鎖內已經有了我們的私鑰文件和用公鑰加密過的數據文件,接下來只需要在我們自己的程序中利用API進行相應的驗證操作就可以了。
bool Dongle()
{
DWORD dwRet = 0;
int nCount = 0;
char AdminPin[] = "FFFFFFFFFFFFFFFF";//默認開發商PIN碼,使用時請修改爲你自己的PIN碼
int nRemainCount = 0;
DONGLE_HANDLE hDongle = NULL;
WORD wPriID = 0x1111;
WORD wFileID = 0x1111;
BYTE buffer[128];
BYTE tmpbuf[128];
int nInDataLen = 0;
int nOutDataLen = 0;
//枚舉鎖
dwRet = Dongle_Enum(NULL, &nCount);
if (dwRet != DONGLE_SUCCESS)return false;
//打開鎖
dwRet = Dongle_Open(&hDongle, 0);
if (dwRet != DONGLE_SUCCESS)return false;
//驗證開發商PIN碼
dwRet = Dongle_VerifyPIN(hDongle, FLAG_ADMINPIN, AdminPin, &nRemainCount);
if (dwRet != DONGLE_SUCCESS)return false;
//從加密鎖中讀取公鑰加密後的數據
dwRet = Dongle_ReadFile(hDongle, wFileID, 0, tmpbuf, 128);
if (dwRet != DONGLE_SUCCESS)return false;
//RSA私鑰解密
nInDataLen = 128;
nOutDataLen = (128 - 11);
dwRet = Dongle_RsaPri(hDongle, wPriID, FLAG_DECODE, tmpbuf, nInDataLen, tmpbuf, &nOutDataLen);
if (dwRet != DONGLE_SUCCESS)return false;
//關閉加密鎖
dwRet = Dongle_Close(hDongle);
if (dwRet != DONGLE_SUCCESS)return false;
//比較解密後的數據與原始數據是否一致
//這裏buffer裏的原始數據我用的是128位標準填充
for (int i = 0; i < 128; i++) buffer[i] = i;
if (memcmp(tmpbuf, buffer, 117) == 0)
return true;
else
return false;
}
在main()函數中判斷if(Dongle())
,否則終止程序,並給出相應提示。