一些商务管理软件,为了防止盗版,经常使用加密狗将软件加密。下面的两个实例将介绍如何将密码写入加密狗及利用加密狗来设计加密程序。
在使用加密狗时,需要向加密狗中写入或读取数据。例如,将密码写入或读取加密狗,如何实现呢?运行本例,在文本框中设置密码后,单击【写入】按钮,即可将设置的密码写入加密狗,成功写入后,单击【读出】按钮,即可将写入的密码读出并显示在文本框中。如图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");
}
}
}