1. 程式人生 > >用C#開發加密狗程式

用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#開發加密程式

一些商務管理軟體,為了防止盜版,經常使用加密狗將軟體加密。下面的兩個例項將介紹如何將密碼寫入加密狗及利用加密狗來設計加密程式。 在使用加密狗時,需要向加密狗中寫入或讀取資料。例如,將密碼寫入或讀取加密狗,如何實現呢?執行本例,在文字框中設定密碼後,單擊【寫入】按鈕,即可

C++開發STM32程式

今天這篇文章有點複雜,大家要注意一點看啦! 我們知道KEIL是支援C++的,網上一搜索也能找到一些使用C++的方法,無非是在Keil裡的options->C/C++->Misc Controls裡新增—cpp,如果要支援c++11,還需要指定—cpp11。事實上

檢視任何檔案的二進位制碼--這有何難?C開發檢視HEX位元組碼的工具,兼論命令列程式開發方法

目的-用C開發檢視HEX位元組碼的工具 在windows下,要看一個文字檔案的內容,可用”記事本“即可,用type file.txt 也可在命令窗顯示檔案內容。但是– 如果要看一個二進位制檔案的內部位元組碼,用什麼工具? 你會說,有很多工具呢!例如HexView

Visual C++開發MySQL應用程式開發環境配置,Visual C++與MySQL

#include "mysql.h"mysql.h在你mysql的安裝目錄下的include裡面如:mysql/include把這個標頭檔案新增到你的目錄裡面,或者在VC(我用的是Visual c++6.0)的選單欄點選progect-->setting-->在出現的對話方塊裡面選擇c/c++屬性

C++如何調C#開發的dll

framework html 優勢 顛覆 應用程序 通過 對話框 nbt code 轉載  http://www.cnblogs.com/huangmianwu/p/6145044.html前言 C++編寫的程序為非托管代碼,C#編寫的程序為托管代碼。托管代碼雖然提供了其

C#開發基於自動化接口的OPC客戶端

pub alt span conn 自定義 ted mov errors 寫代碼 OPC全稱是Object Linking and Embedding(OLE) for Process Control,它的出現為基於Windows的應用程序和現場過程控制應用建立了橋梁。OP

java調c#開發的webservice

bool verbose int exceptio web rgs 目錄 odi 自帶 使用jdk自帶的wsimport工具生成代理類 c:\Program Files\Java\jdk1.8.0_121\bin>wsimport -keep -encoding

c編寫的一些程式

**1.列印100~200 之間的素數 ** 判斷一個數是否為一個素數,我呼叫<math.h>中的sqrt(x)的寫法,正是因為一個數的因數是成對出現的,所以開方後就只需要判斷它的前一半可以減少一些迴圈次數。 #include <stdio.h> #include

PC軟體開發技術之二:C#開發基於自動化介面的OPC客戶端

OPC全稱是Object Linking and Embedding(OLE) for Process Control,它的出現為基於Windows的應用程式和現場過程控制應用建立了橋樑。OPC作為一整套介面、屬性和方法的協議標準集,與具體的開發語言沒有關係。 1、OPC客戶端介面方式

.NET跨平臺實踐:C#開發Linux守護程序

Linux守護程序(Daemon)是Linux的後臺服務程序,它脫離了與控制終端的關聯,直接由Linux init程序管理其生命週期,即使你關閉了控制檯,daemon也能在後臺正常工作。 一句話,為Linux開發與控制檯無關的,需要在後臺長時間不間斷執行的“服務程式”,Daemon技術是非常重要的。 Da

.NET跨平臺實踐:再談C#開發Linux守護程序 — 完整篇

Linux守護程序是Linux的後臺服務程序,相當於Windows服務,對於為Linux開發服務程式的朋友來說,Linux守護程序相關技術是必不可少的,因為這個技術不僅僅是為了開發守護程序,還可以拓展到多程序,父子程序檔案描述符共享,父子程序通訊、控制等方面,是實現Linux大型服務的基礎技術之一。 去年我

C語言實現Ping程式功能(轉)

用C語言實現Ping程式功能 日期:2006-12-25 作者:樑俊輝 來自:IBM DW中國 大部分人用ping命令只是作為檢視另一個系統的網路連線是否正常的一種簡單方法。在這篇文章中,作者將介紹如何用C語言編寫一個模擬ping命令功能的程式。 ping命令是用來檢視網路

C#開發WinForm窗體程式時,如何禁止使用者改變程式窗體的大小?

      使用C#開發WinForm窗體程式時,禁止改變程式窗體的大小的方法:             在開發時,有時我們會設定窗體的背景圖,當我們改變窗體的大小時,窗口裡面不全是背景圖,     有部分是空白的,這就有點不美觀了, 要想窗體程式在執行時不被使用者改變視窗

利用C#開發web應用程式時,對登錄檔進行操作提示沒有許可權的解決辦法

因為公司專案需要對web程式新增一套限制客戶惡意傳播的方案。沒辦法,東西放在客戶的伺服器或者電腦裡面。鑑於本人菜鳥一個,也就能想到利用兩種方案,具體的實現的方式,將會在之後的博文中寫出。 我寫這篇文章

xamarin下c#開發安卓的listvew翻頁功能

listview的翻頁用到了幾個知識點,1資料的填充,2翻頁圖片的載入,3頁碼的計算,實際效果如下圖:axml檔案有兩個,一個是主介面Main.axml,另一個是顯示“載入中。。。。”這個layout1.axmlMain.axml程式碼如下:<?xml version=

lighttpd + CGI,c語言寫cgi程式

相信大家都想過用瀏覽器來執行c語言程式,比如點電路板上的燈、其他控制功能等。這裡我就說一說心得。 要使用瀏覽器就必須有伺服器,我這裡用了lighttpd。因為我看其他的都停止開發了,沒法用。 配置和測試可以參考這篇文章: http://blog.chinaunix.net/u

KVM之父的新作ScyllaDB:C++開發的Cassandra相容列資料庫,效能提升10倍

今年上半年雲端計算活動曾經邀請過KVM之父Avi Kivity,未果,原來他們在憋大招:用C++從頭開發了一個相容Cassandra的列式資料庫ScyllaDB,基於全新的Seastar伺服器端應用框架,他們自己的測試資料表明,效能相比Cassandra提升了十

QT中呼叫之前已c++寫好的程式

核心程式已經用c++寫好了,現在在用QT編一個使用者介面,想在這個介面中呼叫這個程式,並且把結果在介面中顯示出來。 程式是用c++寫的,最後出來一個debug資料夾,裡面有一個.exe檔案,這就是要呼叫的程式,是封裝好的。有個要注意的地方是,這個exe檔案 在執行的時候要從

教你C語言編寫"vb"程式

  相信不少人學過C語言,也學過VB。在不少人看來C語言和VB之間最大的區別就是:C程式是黑漆漆DOS視窗,而VB是標準的Windows窗體。其實不然,C語言也是可以寫出“vb”程式的。 請看程式碼: #include <windows.h> LRESULT CA

C#開發之控制檯程式使用log4net日誌元件

使用背景: 用C#寫一個TCP/IP server端的程式,需要將傳送和接收的報文以日誌的形式儲存,所以進行了如下配置; 1、這其中我所建立的工程是C#控制檯應用;   2、使用NuGet下載安裝log4net.dll; 3、新增新建項-應用程式配置檔