密码写入与读出加密狗
实例说明
在使用加密狗时,需要向加密狗中写入或读取数据。例如,将密码写入或读取加密狗,如何实现呢?运行本例,在文本框中设置密码后,单击【写入】按钮,即可将设置的密码写入加密狗,成功写入后,单击【读出】按钮,即可将写入的密码读出并显示在文本框中。如图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所示。
技术要点
本例的关键是从加密狗中读取数据,可以使用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");
}
}
}
举一反三
根据本实例,读者可以实现以下功能。
利用加密狗设计加密软件。
使用加密狗控制用户使用权限。