用C#开发加密狗程序
一些商務管理軟件,為了防止盜版,經常使用加密狗將軟件加密。下面的兩個實例將介紹如何將密碼寫入加密狗及利用加密狗來設計加密程序。
在使用加密狗時,需要向加密狗中寫入或讀取數據。例如,將密碼寫入或讀取加密狗,如何實現呢?運行本例,在文本框中設置密碼后,單擊【寫入】按鈕,即可將設置的密碼寫入加密狗,成功寫入后,單擊【讀出】按鈕,即可將寫入的密碼讀出并顯示在文本框中。如圖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下將安裝目錄下的“\SafeNetChina\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 classDog
{
??? publicuint 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");
???????????????}
???????????}
???????}
總結
以上是生活随笔為你收集整理的用C#开发加密狗程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 升级至4K超高清12G-SDI接口时需要
- 下一篇: STM32WL55-NUCLEO开发(1