using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Helper
{
public class ViKeyAPI
{
public const string DefaultUserPassword = "11111111";
public const string DefaultAdminPassword = "00000000";
// 错误代码
public const long VIKEY_SUCCESS = 0x00000000; //成功
public const long VIKEY_ERROR_NO_VIKEY = 0x80000001; //没有找到ViKey加密锁
public const long VIKEY_ERROR_INVALID_PASSWORD = 0x80000002; //密码错误
public const long VIKEY_ERROR_NEED_FIND = 0x80000003; //请先查找加密锁
public const long VIKEY_ERROR_INVALID_INDEX = 0x80000004; //无效的句柄
public const long VIKEY_ERROR_INVALID_VALUE = 0x80000005; //数值错误
public const long VIKEY_ERROR_INVALID_KEY = 0x80000006; //秘钥无效
public const long VIKEY_ERROR_GET_VALUE = 0x80000007; //读取信息错误
public const long VIKEY_ERROR_SET_VALUE = 0x80000008; //设置信息错误
public const long VIKEY_ERROR_NO_CHANCE = 0x80000009; //没有机会
public const long VIKEY_ERROR_NO_TAUTHORITY = 0x8000000A; //权限不足
public const long VIKEY_ERROR_INVALID_ADDR_OR_SIZE = 0x8000000B; //地址或长度错误
public const long VIKEY_ERROR_RANDOM = 0x8000000C; //获取随机数错误
public const long VIKEY_ERROR_SEED = 0x8000000D; //获取种子错误
public const long VIKEY_ERROR_CONNECTION = 0x8000000E; //通信错误
public const long VIKEY_ERROR_CALCULATE = 0x8000000F; //算法或计算错误
public const long VIKEY_ERROR_MODULE = 0x80000010; //计数器错误
public const long VIKEY_ERROR_GENERATE_NEW_PASSWORD = 0x80000011; //产生密码错误
public const long VIKEY_ERROR_ENCRYPT_FAILED = 0x80000012; //加密数据错误
public const long VIKEY_ERROR_DECRYPT_FAILED = 0x80000013; //解密数据错误
public const long VIKEY_ERROR_ALREADY_LOCKED = 0x80000014; //ViKey加密锁已经被锁定
public const long VIKEY_ERROR_UNKNOWN_COMMAND = 0x80000015; //无效的命令
public const long VIKEY_ERROR_UNKNOWN_ERROR = 0xFFFFFFFF; //未知错误
//ViKey加密狗类型 VikeyGetType返回值代表的类型
public const uint ViKeyAPP = 0; //实用型加密狗ViKeyAPP
public const uint ViKeySTD = 1; //标准型加密狗ViKeySTD
public const uint ViKeyNET = 2; //网络型加密狗ViKeyNET
public const uint ViKeyPRO = 3; //专业型加密狗ViKeyPRO
public const uint ViKeyWEB = 4; //身份认证型加密狗ViKeyWEB
public const uint ViKeyTIME = 5; //时间型加密狗ViKeyTIME
#region 翻译
/// <summary>
/// 返回加密狗类型
/// </summary>
/// <param name="res"></param>
/// <returns></returns>
public static string GetTypeName(uint res)
{
if (res == ViKeyAPP)
return "ViKeyApp";
else if (res == ViKeySTD)
return "ViKeySTD";
else if (res == ViKeyNET)
return "ViKeyNET";
else if (res == ViKeyPRO)
return "ViKeyPRO";
else if (res == ViKeyWEB)
return "VikeyWEB";
else if (res == ViKeyTIME)
return "VikeyTIME";
else
return "未知";
}
/// <summary>
/// 获取错误信息
/// </summary>
/// <param name="res"></param>
/// <returns></returns>
public static string GetErrorMsg(uint res)
{
if (res == VIKEY_SUCCESS)
return "成功!";
else if (res == VIKEY_ERROR_NO_VIKEY)
return "没有找到ViKey加密锁";
else if (res == VIKEY_ERROR_INVALID_PASSWORD)
return "密码错误";
else if (res == VIKEY_ERROR_NEED_FIND)
return "请先查找加密锁";
else if (res == VIKEY_ERROR_INVALID_INDEX)
return "无效的句柄";
else if (res == VIKEY_ERROR_INVALID_VALUE)
return "数值错误";
else if (res == VIKEY_ERROR_INVALID_KEY)
return "秘钥无效";
else if (res == VIKEY_ERROR_GET_VALUE)
return "读取信息错误";
else if (res == VIKEY_ERROR_SET_VALUE)
return "设置信息错误";
else if (res == VIKEY_ERROR_NO_CHANCE)
return "没有机会";
else if (res == VIKEY_ERROR_NO_TAUTHORITY)
return "权限不足";
else if (res == VIKEY_ERROR_INVALID_ADDR_OR_SIZE)
return "地址或长度错误";
else if (res == VIKEY_ERROR_RANDOM)
return "获取随机数错误";
else if (res == VIKEY_ERROR_SEED)
return "获取种子错误";
else if (res == VIKEY_ERROR_CONNECTION)
return "通信错误";
else if (res == VIKEY_ERROR_CALCULATE)
return "算法或计算错误";
else if (res == VIKEY_ERROR_MODULE)
return "计数器错误";
else if (res == VIKEY_ERROR_GENERATE_NEW_PASSWORD)
return "产生密码错误";
else if (res == VIKEY_ERROR_ENCRYPT_FAILED)
return "加密数据错误";
else if (res == VIKEY_ERROR_DECRYPT_FAILED)
return "解密数据错误";
else if (res == VIKEY_ERROR_ALREADY_LOCKED)
return "加密锁已经被锁定";
else if (res == VIKEY_ERROR_UNKNOWN_COMMAND)
return "无效的命令";
else if (res == VIKEY_ERROR_UNKNOWN_ERROR)
return "未知错误";
else
return "未知!";
}
#endregion
#region 查找加密狗
// 函数引用声明
/// <summary>
/// 查找系统中的ViKey加密狗
/// 【注意】:程序访问ViKey加密狗前,必须先调用此函数,调用一次就可以。
/// </summary>
/// <param name="pdwCount">如果查找到系统中存在加密狗,返回查找到加密狗的个数</param>
/// <returns>0:表示系统中存在ViKey加密狗 非0:表示系统中没有找到ViKey加密狗</returns>
[DllImport("ViKey")]
public static extern uint VikeyFind(ref uint pdwCount);
#endregion
#region 登录注销加密狗
/// <summary>
/// 用户登陆加密狗,登陆成功后,加密狗的当前权限为用户权限。可以调用VikeyGetLevel获取加密狗的当前权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 比如,一共插了2个加密狗,Index=0表示操作第一个加密狗,Index=1表示操作第二个加密狗 </param>
/// <param name="pUserPassword">【返回】加密狗的用户密码, 8个字母或数字</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义 </returns>
[DllImport("ViKey")]
public static extern uint VikeyUserLogin(ushort Index, Byte[] pUserPassword);
/// <summary>
/// 管理员登陆加密狗,登陆成功后,加密狗的当前权限为管理员权限。可以调用VikeyGetLevel获取加密狗的当前权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 比如,一共插了2个加密狗,Index=0表示操作第一个加密狗,Index=1表示操作第二个加密狗</param>
/// <param name="pAdminPassword">【返回】加密狗的管理员密码, 8个字母或数字</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义 </returns>
[DllImport("ViKey")]
public static extern uint VikeyAdminLogin(ushort Index, Byte[] pAdminPassword);
/// <summary>
/// 登出(关闭)加密狗,调用该函数过后,加密狗的当前权限将变为匿名权限。
/// 当程序不需要对加密狗进行操作时候,调用此函数关闭加密狗,以免其他误操作或者恶意程序对加密狗内部信息进行窃取。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 比如,一共插了2个加密狗,Index=0表示操作第一个加密狗,Index=1表示操作第二个加密狗</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyLogoff(ushort Index);
#endregion
#region 读写加密狗的基本信息
/// <summary>
/// 获取ViKey加密狗的硬件ID
/// 长度为4个字节
/// 一个DWORD
/// 该硬件ID为ViKey加密狗的唯一标识,类似于人的身份证号码.
/// 全球唯一,每个加密狗的都有一个全球唯一的硬件ID.
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 比如,一共插了2个加密狗,Index=0表示操作第一个加密狗,Index=1表示操作第二个加密狗 </param>
/// <param name="pdwHID">【返回】返回ViKey加密狗的硬件ID</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyGetHID(ushort Index, ref uint pdwHID);
/// <summary>
/// 获取ViKey加密狗的类型。ViKey系列加密狗有很多种类型,可以调用此函数获取当前加密狗的类型。
/// 0 - ViKeyAPP 实用狗
/// 1 - ViKeySTD 标准狗
/// 2 - ViKeyNET 网络狗
/// 3 - ViKeyPRO 专业狗
/// 4 - ViKeyWEB 身份认证狗
/// 5 - ViKeyTIME 时间狗
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 比如,一共插了2个加密狗,Index=0表示操作第一个加密狗,Index=1表示操作第二个加密狗 </param>
/// <param name="pType">【返回】返回加密狗的产品类型 </param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义 </returns>
[DllImport("ViKey")]
public static extern uint VikeyGetType(ushort Index, ref uint pType);
/// <summary>
/// 获取ViKey加密狗的当前权限,ViKey加密狗有三级权限,匿名权限、用户权限、管理员权限
/// 用户登陆(VikeyUserLogin)成功后加密狗的权限自动变为用户权限。
/// 管理员登陆(VikeyAdminLogin)成功后加密狗的权限自动变为管理员权限。
/// 每种权限可以对加密狗的操作均有限制,比如说用户权限,只能对数据区进行读取,不可写入,管理员权限对所有数据均有读写权限。
/// 0 - 匿名权限
/// 1 - 用户权限
/// 2 - 管理员权限
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 比如,一共插了2个加密狗,Index=0表示操作第一个加密狗,Index=1表示操作第二个加密狗 </param>
/// <param name="pLevel">【返回】返回雄狮加密狗的当前权限</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyGetLevel(ushort Index, ref Byte pLevel);
/// <summary>
/// 设置ViKey加密狗的设备名称,长度为16个字符或8个汉字,字母或数字
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 比如,一共插了2个加密狗,Index=0表示操作第一个加密狗,Index=1表示操作第二个加密狗</param>
/// <param name="szName">【返回】ViKey加密狗的设备名称</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeySetPtroductName(ushort Index, Byte[] szName);
/// <summary>
/// 获取ViKey加密狗的设备名称,长度为16个字符或8个汉字,字母或数字
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 比如,一共插了2个加密狗,Index=0表示操作第一个加密狗,Index=1表示操作第二个加密狗</param>
/// <param name="szName">【返回】ViKey加密狗的设备名称</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyGetPtroductName(ushort Index, Byte[] szName);
/// <summary>
/// 设置加密狗的用户密码错误尝试次数,例如设置用户密码错误尝试次数为5,当执行用户登陆时候,如果连续
/// 输入5次错误的密码,加密狗将被锁定,以后将不能登陆。该机制类似于银行卡密码,连续输入3次错误密码,银行卡将被
/// 锁定。有效防止暴力破解、穷举密码的方式破解密码。
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 比如,一共插了2个加密狗,Index=0表示操作第一个加密狗,Index=1表示操作第二个加密狗</param>
/// <param name="cAttempt">【输入】错误密码尝试次数 0:不做限制 非0:限制为指定次数 </param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeySetUserPassWordAttempt(ushort Index, Byte cAttempt);
/// <summary>
/// 设置加密狗的管理员密码错误尝试次数,例如设置管理员密码错误尝试次数为5,当执行管理员登陆时候,如果连续
/// 输入5次错误的密码,加密狗将被锁定,以后将不能登陆。该机制类似于银行卡密码,连续输入3次错误密码,银行卡将被
/// 锁定。有效防止暴力破解、穷举密码的方式破解密码。
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 比如,一共插了2个加密狗,Index=0表示操作第一个加密狗,Index=1表示操作第二个加密狗</param>
/// <param name="cAttempt">【输入】错误密码尝试次数 0:不做限制 非0:限制为指定次数 </param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeySetAdminPassWordAttempt(ushort Index, Byte cAttempt);
/// <summary>
/// 获取加密狗的用户密码错误尝试次数,例如设置用户密码错误尝试次数为5,当执行用户登陆时候,如果连续
/// 输入5次错误的密码,加密狗将被锁定,不能登陆。该机制类似于银行卡密码,连续输入3次错误密码,银行卡将被
/// 锁定。有效防止暴力破解。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="pcCurrentAttempt">【返回】当前剩余的密码尝试次数</param>
/// <param name="pcMaxAttempt">【返回】最大密码尝试次数,该次数为通过VikeySetUserPassWordAttempt设置的次数</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyGetUserPassWordAttempt(ushort Index, Byte pcCurrentAttempt, Byte pcMaxAttempt);
/// <summary>
/// 获取加密狗的管理员密码错误尝试次数,例如设置管理员密码错误尝试次数为5,当执行管理员登陆时候,如果连续
/// 输入5次错误的密码,加密狗将被锁定,不能登陆。该机制类似于银行卡密码,连续输入3次错误密码,银行卡将被
/// 锁定。有效防止暴力破解。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="pcCurrentAttempt">【返回】当前剩余的密码尝试次数</param>
/// <param name="pcMaxAttempt">【返回】最大密码尝试次数,该次数为通过VikeySetAdminPassWordAttempt设置的次数</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyGetAdminPassWordAttempt(ushort Index, Byte pcCurrentAttempt, Byte pcMaxAttempt);
#endregion
#region 重置加密狗密码
/// <summary>
/// 修改ViKey加密狗的用户密码和管理员
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限,才能修改成功。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="pNewUserPassword">【输入】加密狗新的用户密码</param>
/// <param name="pNewAdminPassword">【输入】加密狗新的管理员密码</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyResetPassword(ushort Index, Byte[] pNewUserPassword, Byte[] pNewAdminPassword);
#endregion
#region 获取随机数
/// <summary>
/// 获取4个随机数,在程序中程序员可能需要到随机数,可以调用加密狗的该函数获取加密狗中的随机数,更为安全。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="pReturn1">【返回】获取随机数1(0~65535)</param>
/// <param name="pReturn2">【返回】获取随机数2(0~65535)</param>
/// <param name="pReturn3">【返回】获取随机数3(0~65535)</param>
/// <param name="pReturn4">【返回】获取随机数4(0~65535)</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint ViKeyRandom(ushort Index, ref ushort pReturn1, ref ushort pReturn2, ref ushort pReturn3, ref ushort pReturn4);
#endregion
#region 数据读写
/// <summary>
/// 设置加密狗的软件ID
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="SoftIDString">【输入】加密狗的软件ID标识, 8个字母或数字</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeySetSoftIDString(ushort Index, Byte[] SoftIDString);
/// <summary>
/// 获取加密狗的软件ID
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="SoftIDString">【返回】加密狗的软件ID标识, 8个字母或数字</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyGetSoftIDString(ushort Index, Byte[] SoftIDString);
/// <summary>
/// 读取加密狗的数据,加密狗有数据存储区,可供读写
/// 【注意】:此函数需要用户权限,也就是说调用该函数前必须保证加密狗当前权限要大于用户权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 </param>
/// <param name="pStartAddress">【输入】读取数据的起始地址</param>
/// <param name="pBufferLength">【输入】读取数据的长度</param>
/// <param name="pBuffer">【返回】读取到的数据</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyReadData(ushort Index, ushort pStartAddress, ushort pBufferLength, Byte[] pBuffer);
/// <summary>
/// 写入数据到加密狗,加密狗有数据存储区,可供读写
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 </param>
/// <param name="pStartAddress">【输入】写入数据的起始地址</param>
/// <param name="pBufferLength">【输入】写入数据的长度</param>
/// <param name="pBuffer">【返回】写入数据的指针</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyWriteData(ushort Index, ushort pStartAddress, ushort pBufferLength, Byte[] pBuffer);
#endregion
#region 计数器模块
/// <summary>
/// 将指定计数器中的数值减一
/// ViKey加密狗为程序员提供一组计数器,该计数器只能递减,也就是递减计数器,可以设置初始值,调用该函数来实现减一。
/// 【注意】:此函数需要用户权限,也就是说调用该函数前必须保证加密狗当前权限为用户权限,方可调用成功。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="ModelueIndex">【输入】计数器的序号</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint ViKeyDecraseModule(ushort Index, ushort ModelueIndex);
/// <summary>
/// 获取加密狗中计数器的值
/// ViKey加密狗为程序员提供一组计数器,该计数器只能递减,也就是递减计数器,可以设置初始值,调用该函数来获取计数器中的数值。
/// 【注意】:此函数需要用户权限,也就是说调用该函数前必须保证加密狗当前权限为用户权限,方可调用成功。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 </param>
/// <param name="wModuleIndex">【输入】计数器的序号</param>
/// <param name="pwValue">【返回】计数器中的值</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint ViKeyGetModule(ushort Index, ushort wModuleIndex, ushort pwValue);
/// <summary>
/// 设置递减计数器的初始值和模式
/// ViKey加密狗为程序员提供一组计数器,该计数器只能递减,也就是递减计数器,调用该函数来设置计数值的初始状态。
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="ModelueIndex">【输入】计数器的序号</param>
/// <param name="pValue">【输入】计数器的值</param>
/// <param name="pDecrease">【输入】计数器的模式 1:允许递减 0:不允许递减</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint ViKeySetModule(ushort Index, ushort ModelueIndex, ushort pValue, ushort pDecrease);
/// <summary>
/// 检查计数器的数值是否为零 模式是否允许可以递减
/// ViKey加密狗为程序员提供一组计数器,该计数器只能递减,也就是递减计数器,调用该函数来检查计数器中的数值是否为0。
/// 【注意】:此函数需要用户权限,也就是说调用该函数前必须保证加密狗当前权限为用户权限,方可调用成功。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="ModelueIndex">【输入】计数器的序号</param>
/// <param name="pIsZero">【输入】是否为零</param>
/// <param name="pCanDecrase">【输入】是否允许递减</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint ViKeyCheckModule(ushort Index, ushort ModelueIndex, ref ushort pIsZero, ref ushort pCanDecrase);
#endregion
#region 加解密算法
/// <summary>
/// 设置DES算法用到的秘钥Key,Des加解密算法是一种国际标准的加解密算法,安全性高,破解难度大.
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="pMD5key">【输入】秘钥地址,秘钥长度固定为8个字节</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyDesSetKey(ushort Index, Byte[] pMD5key);
/// <summary>
/// DES加密数据,加密长度必须为8的倍数
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 </param>
/// <param name="length">【输入】要加密的数据长度,明文当长度必须为8的倍数</param>
/// <param name="pText">【输入】明文地址</param>
/// <param name="pResult">【返回】加密返回密文地址</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyDesEncrypt(ushort Index, ushort length, Byte[] pText, Byte[] pResult);
/// <summary>
/// DES解密数据,解密长度必须为8的倍数
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 </param>
/// <param name="length">【输入】要解密的数据长度,明文当长度必须为8的倍数</param>
/// <param name="pText">【输入】密文地址</param>
/// <param name="pResult">【返回】解密返回明文地址</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyDesDecrypt(ushort Index, ushort length, Byte[] pText, Byte[] pResult);
/// <summary>
/// 设置3DES算法用到的秘钥Key,3Des加解密算法是一种国际标准的加解密算法,安全性高,破解难度大.
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="pMD5key">【输入】秘钥地址</param>
/// <param name="keyType">【输入】0表示密钥长度为16字节 1表示密钥长度为24字节</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint Vikey3DesSetKey(ushort Index, Byte[] pMD5key, ushort keyType);
/// <summary>
/// 3DES加密数据,向量为0,ECB模式 ,加密长度必须为8的倍数
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="length">【输入】要加密的数据长度,明文当长度必须为8的倍数</param>
/// <param name="pText">【输入】明文地址</param>
/// <param name="pResult">【返回】加密返回密文地址</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint Vikey3DesEncrypt(ushort Index, ushort length, Byte[] pText, Byte[] pResult);
/// <summary>
/// 3DES解密数据,向量为0,ECB模式 ,解密长度必须为8的倍数
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 </param>
/// <param name="length">【输入】要解密的数据长度,明文当长度必须为8的倍数</param>
/// <param name="pText">【输入】密文地址</param>
/// <param name="pResult">【返回】解密返回明文地址</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint Vikey3DesDecrypt(ushort Index, ushort length, Byte[] pText, Byte[] pResult);
#endregion
#region 哈希认证算法
/// <summary>
/// 进行MD5哈希运算
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="length">【输入】数据长度</param>
/// <param name="pText">【输入】数据内容</param>
/// <param name="pResult">【返回】哈希运算结果</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyMD5(ushort Index, ushort length, Byte[] pText, Byte[] pResult);
/// <summary>
/// 设置MD5算法秘钥
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="pMD5key">【输入】秘钥内容</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeySetMD5Key(ushort Index, Byte[] pMD5key);
/// <summary>
/// 进行HMAC_MD5哈希运算
/// 【注意】:此函数需要用户权限,也就是说调用该函数前必须保证加密狗当前权限为用户权限,方可调用成功。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号 </param>
/// <param name="length">【输入】输入内容长度</param>
/// <param name="pText">【输入】输入内容</param>
/// <param name="pResult">【返回】计算结果</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyHmacMD5(ushort Index, ushort length, Byte[] pText, Byte[] pResult);
/// <summary>
/// 进行SHA1哈希运算
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="length">【输入】数据长度</param>
/// <param name="pText">【输入】数据内容</param>
/// <param name="pResult">【返回】哈希运算结果</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeySHA1(ushort Index, ushort length, Byte[] pText, Byte[] pResult);
/// <summary>
/// 设置SHA1算法秘钥
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="pSHA1key">【输入】秘钥内容</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeySetSHA1Key(ushort Index, Byte[] pSHA1key);
/// <summary>
/// 进行HMAC_SHA1哈希运算
/// 【注意】:此函数需要用户权限,也就是说调用该函数前必须保证加密狗当前权限为用户权限,方可调用成功。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="length">【输入】输入内容长度</param>
/// <param name="pText">【输入】输入内容</param>
/// <param name="pResult">【返回】计算结果</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyHmacSHA1(ushort Index, ushort length, Byte[] pText, Byte[] pResult);
#endregion
#region 时钟功能
/// <summary>
/// ViKeyTime时钟型加密狗,内部有独立的电子时钟,可以简单的理解为内部有个和人们带的电子表一样,可以实时获取当前
/// 日期、时间,但是这个日期、时间无法被篡改。该函数就是获取加密狗内部时钟的时间。
/// typedef struct _VIKEY_TIME
///{
/// BYTE cYear;
/// BYTE cMonth;
/// BYTE cDay;
/// BYTE cHour;
/// BYTE cMinute;
/// BYTE cSecond;
///} SVikeyTime, *PVIKEYTIME;
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="pTime">【返回】当前日期、时间,6个字节内容分别是年月日时分秒</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyGetTime(ushort Index, Byte[] pTime);
#endregion
#region 网络功能
/// <summary>
/// 设置网络狗允许连接的最大客户端数,该函数只针对ViKeyNET网络狗有效
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="dwCount">【输入】网络狗允许连接的最大客户端数</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeySetMaxClientCount(ushort Index, ushort dwCount);
/// <summary>
/// 获取网络狗允许连接的最大客户端数,该函数只针对ViKeyNET网络狗有效
/// 【注意】:此函数需要用户权限,也就是说调用该函数前必须保证加密狗当前权限为用户权限,方可调用成功。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="pdwCount">【返回】网络狗允许连接的最大客户端数</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyGetMaxClientCount(ushort Index, ushort pdwCount);
#endregion
#region 自动打开网页
/// <summary>
/// 在网页应用中,安装加密狗控件后,通过此接口设置自动打开网页的网址
/// 【注意】:此函数需要管理员权限,也就是说调用该函数前必须保证加密狗当前权限为管理员权限。
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="pUrl">【输入】自动打开网页的网址,以零结尾的字符串</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeySetAutoRunUrl(ushort Index, Byte[] pUrl);
/// <summary>
/// 通过此接口获取自动打开网页的网址
/// </summary>
/// <param name="Index">【输入】指定加密狗的序号</param>
/// <param name="pUrl">【返回】自动打开网页的网址</param>
/// <returns>0:表示函数执行成功 非0:则表示函数失败,错误原因可以参见错误码含义</returns>
[DllImport("ViKey")]
public static extern uint VikeyGetAutoRunUrl(ushort Index, Byte[] pUrl);
#endregion
[DllImport("ViKey")]
public static extern uint VikeySeed(ushort Index, ref uint pSeed, ref ushort pReturn1, ref ushort pReturn2, ref ushort pReturn3, ref ushort pReturn4);
public static byte[] intToBytes(int value)
{
byte[] src = new byte[4];
src[0] = (byte)((value >> 24) & 0xFF);
src[1] = (byte)((value >> 16) & 0xFF);
src[2] = (byte)((value >> 8) & 0xFF);
src[3] = (byte)(value & 0xFF);
return src;
}
public static int bytesToInt(byte[] src, int offset)
{
int value;
value = (int)(((src[offset] & 0xFF) << 24)
| ((src[offset + 1] & 0xFF) << 16)
| ((src[offset + 2] & 0xFF) << 8)
| (src[offset + 3] & 0xFF));
return value;
}
}
}
评论已关闭