今天看了一下項目中涉及到的知識點,察覺到該項目中裡邊有許多知識以前從未接觸過,順便將其整理 下來.
加密狗
主要是用來加密個人重要的數據.我們對其的操作主要就是讀寫加密狗裡邊的信息.
介紹一下賽孚耐信息技術有限公司的加密狗產品,該產品提供了.NET中非托管的類庫,來完成加密狗 的數據讀寫功能。
● DogWrite 函數(寫如加密狗)
[DllImport("Win32dll.dll", CharSet = CharSet.Ansi)]
public static unsafe extern uint DogWrite(uint idogBytes, uint idogAddr, byte* pdogData);
將PdogData指向的數據塊寫入加密狗中,從idogAddr處開始,長度共長idogBytes.
參數說明如下。
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。
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\”文件夾中。
也不知道其他公司產品的加密狗的原理是不是也是這樣的,不過我感覺加密狗的基本原理都是這樣的, 公司提供加密狗的API接口.只不過不同的公司所提供的API接口不一樣罷了.
實例:
C#:
using System.Runtime.InteropServices ;
加密狗類:
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); //將數據寫入加密狗
}
}
}
向加密狗裡邊寫入數據:Dog d=new Dog(10);d.DogAddr=0;for(int i=0;i<d.DogData.length;i++)d.DogData[i]=i;d.WriteDog();
讀取加密狗裡邊的數據:Dog d=new Dog(10);byte[] b;d.ReadDog();b=new byte [d.DogData.length];
for (int i=0;i<d.DogData.lengh;i++)b[i]=d.DogData[i];
extern:表明我們用到的該方法是在外部聲明的,即該方法是在win32dll.dll程序集裡邊;
unsafe:表明該加密狗類是不安全的.