Files
ADP/加密狗/加密狗驱动类.cs
T

145 lines
5.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace 加密狗
{
public class 加密狗驱动类
{
public static void Uninitialization()
{
加密狗API类.VikeyUninitialization();
}
// 保留原有方法,但添加新方法
public static int 写入加密狗(ushort Index, string 管理密码, string 校验密码)
{
// 保持不变
uint 加密狗数量 = 0;
var re = 加密狗API类.VikeyFind(ref 加密狗数量);
if (re != 0) return -1;
加密狗API类.VikeyAdminLogin(Index, Encoding.Default.GetBytes(管理密码));
SHA256 sHA256 = SHA256.Create();
加密狗API类.VikeyGetHID(Index, out uint pid);
byte[] HID = BitConverter.GetBytes(pid);
var pswd = Encoding.UTF8.GetBytes(校验密码);
byte[] 校验数组 = HID.Concat(pswd).ToArray();
var 校验值 = sHA256.ComputeHash(校验数组);
加密狗API类.VikeyWriteData(Index, 0, 32, 校验值);
byte[] randomBytes = new byte[96];
Random random = new Random();
random.NextBytes(randomBytes);
加密狗API类.VikeyWriteData(Index, 32, 96, randomBytes);
return 0;
}
/// <summary>
/// 新方法:仅检查加密狗时间,不验证密码和数据
/// </summary>
public static int 寻找加密狗仅检查时间()
{
uint 加密狗数量 = 0;
var re = 加密狗API类.VikeyFind(ref 加密狗数量);
if (re != 0 || 加密狗数量 == 0) return -1;
// 直接返回第一个找到的加密狗
return 0;
}
/// <summary>
/// 原有方法:寻找加密狗并进行完整验证
/// </summary>
public static int 寻找加密狗(string 用户密码,string 校验密码)
{
uint 加密狗数量 = 0;
var re = 加密狗API类.VikeyFind(ref 加密狗数量);
if (re != 0) return -1;
int 找到的加密狗 = -1;
for (ushort i = 0; i < 加密狗数量; i++)
{
re = 加密狗API类.VikeyUserLogin(i, Encoding.Default.GetBytes(用户密码));
if (检查加密狗数据(i, 校验密码)) return i;
}
return (int)加密狗数量;
}
public static bool 检查加密狗数据(ushort Index, string 校验密码)
{
// 保持不变
SHA256 sHA256 = SHA256.Create();
加密狗API类.VikeyGetHID(Index, out uint pid);
byte[] HID = BitConverter.GetBytes(pid);
var pswd = Encoding.UTF8.GetBytes(校验密码);
byte[] 校验数组 = HID.Concat(pswd).ToArray();
var 校验值 = sHA256.ComputeHash(校验数组);
var buffer = new byte[32];
加密狗API类.VikeyReadData(Index, 0, 32, buffer);
return buffer.SequenceEqual(校验值);
}
public static TimeSpan 检查剩余时间(int 加密狗)
{
ushort 序号 = (ushort)加密狗;
try
{
// 读时间前必须先登录(用户权限即可)
uint re = 加密狗API类.VikeyUserLogin(序号, Encoding.Default.GetBytes("11111111"));
if (re != 0)
{
Console.WriteLine($"VikeyUserLogin 失败: 0x{re:X}");
return TimeSpan.Zero;
}
re = 加密狗API类.VikeyGetTime(序号, out 加密狗API类.SVikeyTime 现在时间);
if (re != 0)
{
Console.WriteLine($"VikeyGetTime 失败: 0x{re:X}");
return TimeSpan.Zero;
}
re = 加密狗API类.VikeyGetValidTime(序号, out 加密狗API类.SVikeyTime 到期时间);
if (re != 0)
{
Console.WriteLine($"VikeyGetValidTime 失败: 0x{re:X}");
return TimeSpan.Zero;
}
re = 加密狗API类.VikeyCheckValidTime(序号, out byte isValid);
Console.WriteLine($"VikeyCheckValidTime: ret=0x{re:X}, isValid={isValid}");
// cYear 是 byteViKey 用距 2000 年的偏移量
DateTime _现在时间 = new DateTime(现在时间.cYear + 2000, 现在时间.cMonth, 现在时间.cDay,
现在时间.cHour, 现在时间.cMinute, 现在时间.cSecond);
DateTime _到期时间 = new DateTime(到期时间.cYear + 2000, 到期时间.cMonth, 到期时间.cDay,
到期时间.cHour, 到期时间.cMinute, 到期时间.cSecond);
Console.WriteLine($"加密狗当前时间: {_现在时间:yyyy-MM-dd HH:mm:ss}");
Console.WriteLine($"加密狗到期时间: {_到期时间:yyyy-MM-dd HH:mm:ss}");
return _到期时间 - _现在时间;
}
catch (Exception ex)
{
Console.WriteLine($"检查剩余时间异常: {ex.Message}");
return TimeSpan.Zero;
}
}
public static uint 验证加密狗SN(Byte[] buffer)
{
return 加密狗API类.VikeySetUserSN(buffer);
}
public static uint 验证加密狗APIkey(ushort index, Byte[] buffer)
{
return 加密狗API类.VikeySetApiKey(index, buffer);
}
}
}