一些商務管理軟體,為了防止盜版,經常使用加密狗將軟體加密。下面的兩個執行個體將介紹如何將密碼寫入加密狗及利用加密狗來設計加密程式。
在使用加密狗時,需要向加密狗中寫入或讀取資料。例如,將密碼寫入或讀取加密狗,如何?呢?運行本例,在文字框中設定密碼後,單擊【寫入】按鈕,即可將設定的密碼寫入加密狗,成功寫入後,單擊【讀出】按鈕,即可將寫入的密碼讀出並顯示在文字框中。13.4所示。
在購買加密狗時,廠家通常會附帶有開發手冊和一張光碟片。開發手冊中介紹了加密狗的使用方法和開發資料。本例使用賽孚耐資訊技術有限公司的加密狗產品,該產品提供了.NET中非託管的類庫,來完成加密狗的資料讀寫功能。下面介紹有關加密狗的類庫中的讀寫函數。
● DogWrite 函數
該函數將pdogData指向的資料寫入加密狗中,從DogAddr地址開始寫入,到DogBytes地址停止。
函式宣告如下:
[DllImport("Win32dll.dll", CharSet = CharSet.Ansi)]
public static unsafe extern uint DogWrite(uint idogBytes, uint idogAddr, byte* pdogData);
參數說明如下。
l idogAddr:對軟體狗讀寫操作時使用者區中的首地址。取值範圍為0~99。
l IdogBytes:對軟體狗讀寫操作時的位元組長度。讀寫時取值範圍為1~100,並且與idogAddr之和不能超過100。
l pdogData:指標型變數。指向讀寫操作或變換的資料緩衝區。
l 傳回值:0表示操作成功,其他值是錯誤碼。
● DogRead函數
該函數從加密狗中的idogAddr開始的儲存區讀出資料,存入pdogData指定的緩衝區,讀出位元組數為idogBytes。切記,緩衝區大小要足夠長。
函式宣告如下:
[DllImport("Win32dll.dll", CharSet = CharSet.Ansi)]
public static unsafe extern uint DogRead(uint idogBytes, uint idogAddr, byte* pdogData);
參數說明如下。
l idogAddr:對軟體狗讀寫操作時使用者區中的首地址。取值範圍為0~99。
l idogBytes:對軟體狗讀寫操作時的位元組長度。讀寫時取值範圍為1~100,並且與idogAddr之和不能超過100。
l pdogData:指標型變數。指向讀寫操作或變換的資料緩衝區。
l 傳回值:0表示操作成功,其他值是錯誤碼。
注意以下幾點。
在使用這個函數之前,必須將隨加密狗附帶的安裝程式安裝完整,並將安裝目錄下的Win32dll.dll檔案複製到系統目錄下。例如:
在Windows 2003下將安裝目錄下的“\SafeNet China\SoftDog SDK V3.1\Win32\Win32dll\HighDll\ Win32dll.dll”檔案複製到“C:\WINDOWS\system32\”檔案夾中。
實現過程
(1)建立一個項目,命名為Ex13_03,預設表單為Form1。
(2)在Form1表單中,主要添加兩個Button控制項,用於執行向加密狗資料的寫入與讀出資料,添加兩個TextBox控制項,分別用於填寫向加密狗中寫入的資料和顯示讀取加密狗中的資料。
(3)主要程式碼。
設定加密狗類,並且完善加密狗的讀寫功能,代碼如下:
[StructLayout(LayoutKind.Sequential)]
//這個類用於讀寫加密狗
public unsafe class Dog
{
public uint DogBytes, DogAddr; //設定加密狗位元組長度和起始地址
public byte[] DogData; //設定資料的長度
public uint Retcode;
[DllImport("Win32dll.dll", CharSet = CharSet.Ansi)]
public static unsafe extern uint DogRead(uint idogBytes, uint idogAddr, byte* pdogData);
[DllImport("Win32dll.dll", CharSet = CharSet.Ansi)]
public static unsafe extern uint DogWrite(uint idogBytes, uint idogAddr, byte* pdogData);
public unsafe Dog(ushort num)
{
DogBytes = num;
DogData = new byte[DogBytes]; //設定資料的長度
}
public unsafe void ReadDog()
{
fixed (byte* pDogData = &DogData[0])
{
Retcode = DogRead(DogBytes, DogAddr, pDogData); //將資料讀出加密狗
}
}
public unsafe void WriteDog()
{
fixed (byte* pDogData = &DogData[0])
{
Retcode = DogWrite(DogBytes, DogAddr, pDogData); //將資料寫入加密狗
}
}
}
調用加密狗類,進行加密狗的讀寫功能,代碼如下:
private void button1_Click_1(object sender, EventArgs e)
{
Dog dog = new Dog(100);
dog.DogAddr = 0;
dog.DogBytes = 10;
string str = textBox1.Text;
for (int i = 0; i < str.Length; i++)
{
dog.DogData[i] = (byte)str[i];
}
dog.WriteDog();
MessageBox.Show("密碼已成功寫入加密狗!", "成功提示!", MessageBoxButtons.OK, MessageBoxIcon.Information);
textBox1.ReadOnly = true;
button1.Enabled = false;
button2.Enabled = true;
}
private void button2_Click_1(object sender, EventArgs e)
{
Dog dog = new Dog(100);
dog.DogAddr = 0;
dog.DogBytes = 10;
dog.ReadDog();
if (dog.Retcode == 0) //開始讀加密狗資料
{
char[] chTemp = new char[textBox1.Text.Length];
for (int i = 0; i < textBox1.Text.Length; i++)
{
chTemp[i] = (char)dog.DogData[i];
}
String str = new String(chTemp);
textBox2.Text = str;
}
else
{
textBox2.Text = "2:" + dog.Retcode;
}
textBox1.ReadOnly = false;
button2.Enabled = false;
button1.Enabled = true;
}
注意:本程式所使用的代碼為不安全的程式碼,正常編譯是無法通過的,那麼需要設定開發環境允許運行不安全的程式碼,設定步驟為:在功能表列中選擇“項目”/“屬性”/“產生”子功能表,在“產生”選項卡中選中“允許不安全的程式碼”選項即可。
用加密狗進行身分識別驗證
在程式開發過程中,對於一些機密的資料,開發人員需要將其有效保護起來。例如,對於使用者的密碼,如果從資料庫中驗證使用者密碼,很容易被非法人員發現甚至破解。本例實現了利用加密狗進行身分識別驗證。執行個體運行結果13.5所示本例的關鍵是從加密狗中讀取資料,可以使用ReadDog函數實現。有關該函數的介紹請參考執行個體“密碼寫入與讀出加密狗”中的“技術要點”部分。
實現過程
(1)建立一個項目,命名為Ex13_04,預設表單為Form1。
(2)在Form1表單中,主要添加兩個Button控制項,用於資料驗證和退出程式,添加兩個TextBox控制項,分別用於輸入使用者名稱稱和密碼。
(3)主要程式碼。
private void button1_Click(object sender, EventArgs e)
{
Dog dog = new Dog(100);
dog.DogAddr = 0;
dog.DogBytes = 6;
dog.ReadDog();
if (dog.Retcode == 0)
{
char[] chTemp = new char[6];
for (int i = 0; i < 6; i++)
{
chTemp[i] = (char)dog.DogData[i];
}
String str = new String(chTemp);
if (textBox2.Text==str)
{
MessageBox.Show("OK");
}
else
{
MessageBox.Show("error");
}
}
}