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;
        }
    }
}

标签: none

评论已关闭