飛天誠信ROCKEY-ARM(標準鎖)軟件加密狗使用記錄

一、加密狗原理簡介

  加密狗是爲軟件開發商提供的一種智能型的軟件保護工具,它包含一個安裝在計算機並行口或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()),否則終止程序,並給出相應提示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章