加密狗

13.2  加 密 狗

一些商務管理軟件,爲了防止盜版,經常使用加密狗將軟件加密。下面的兩個實例將介紹如何將密碼寫入加密狗及利用加密狗來設計加密程序。

實例420 密碼寫入與讀出加密狗

實例說明

在使用加密狗時,需要向加密狗中寫入或讀取數據。例如,將密碼寫入或讀取加密狗,如何實現呢?運行本例,在文本框中設置密碼後,單擊【寫入】按鈕,即可將設置的密碼寫入加密狗,成功寫入後,單擊【讀出】按鈕,即可將寫入的密碼讀出並顯示在文本框中。如圖13.4所示。

文本框: 圖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;

        }

 注意:本程序所使用的代碼爲不安全代碼,正常編譯是無法通過的,那麼需要設置開發環境允許運行不安全代碼,設置步驟爲:在菜單欄中選擇“項目”/“屬性”/“生成”子菜單,在“生成”選項卡中選中“允許不安全代碼”選項即可。

舉一反三

根據本實例,讀者可以開發以下程序。

*  利用加密狗加密自己的軟件。

*  利用加密狗設計控制計算機使用的程序。

實例421 使用加密狗進行身份驗證

實例說明

在程序開發過程中,對於一些機密的數據,開發人員需要將其有效的保護起來。例如,對於用戶的密碼,如果從數據庫中驗證用戶密碼,很容易被非法人員發現甚至破解。本例實現了利用加密狗進行身份驗證。實例運行結果如圖13.5所示。

文本框: 圖13.5  使用加密狗進行身份驗證技術要點

本例的關鍵是從加密狗中讀取數據,可以使用ReadDog函數實現。有關該函數的介紹請參考實例“密碼寫入與讀出加密狗”中的“技術要點”部分。

實現過程

(1)新建一個項目,命名爲Ex13_03,默認窗體爲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");

                }

            }

        }

舉一反三

根據本實例,讀者可以實現以下功能。

*  利用加密狗設計加密軟件。

*  使用加密狗控制用戶使用權限。

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