145 lines
5.6 KiB
C#
145 lines
5.6 KiB
C#
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 是 byte,ViKey 用距 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);
|
||
}
|
||
}
|
||
} |