/// <summary> /// 打开并以用户权限进入加密狗 /// </summary> /// <param name="errMsg"></param> public static bool OpenDog(out string errMsg) { errMsg = string.Empty; int index = 1;//默认仅打开第一个加密狗 byte[] bytPID = new byte[8]; bytPID = System.Text.Encoding.ASCII.GetBytes(Properties.Resources.PID); uint result = ET99_API.et_OpenToken(ref ET99_API.dogHandle, bytPID, index); if (result == ET99_API.ET_SUCCESS)//打开成功 { byte[] bytPIN = new byte[16]; bytPIN = System.Text.Encoding.ASCII.GetBytes(Properties.Resources.UserPIN); result = ET99_API.et_Verify(ET99_API.dogHandle, ET99_API.ET_VERIFY_USERPIN, bytPIN); if (result == ET99_API.ET_SUCCESS) { return(true); } else { errMsg = string.Format("加密狗认证失败,请检查!\r\n错误:{0}", ET99_API.ShowResultText(result)); return(false); } } else { errMsg = string.Format("打开加密狗失败,请检查!\r\n错误:{0}", ET99_API.ShowResultText(result)); return(false); } }
/// <summary> /// 临时获得管理员权限,写入数据到加密狗,然后返回到用户权限 /// </summary> /// <param name="origin">欲写入的原始字串</param> /// <param name="offset">偏移字节地址</param> public static void TempAdminWriteDog(string origin, int offset) { //因为此函数的调用前提是通过校验了的狗,省略相关校验,加速 //获取SOPIN string sopin = Helper.ReadOffsetDataAndDecrypt(0, 32); //提升管理员权限 byte[] bytPIN = new byte[16]; bytPIN = System.Text.Encoding.ASCII.GetBytes(sopin); ET99_API.et_Verify(ET99_API.dogHandle, ET99_API.ET_VERIFY_SOPIN, bytPIN); //写入 int intRandom = new Random().Next(1, 9); //随即取1~8 string key16 = Helper.HMAC_MD5_dog(intRandom, "武汉创方科技"); string encryptString = Helper.RC2Encrypt(origin, key16); //密文 byte[] zyn = System.Text.Encoding.Default.GetBytes(encryptString); ET99_API.et_Write(ET99_API.dogHandle, (ushort)offset, zyn.Length, zyn); //重新进入用户权限 bytPIN = System.Text.Encoding.ASCII.GetBytes(Properties.Resources.UserPIN); ET99_API.et_Verify(ET99_API.dogHandle, ET99_API.ET_VERIFY_USERPIN, bytPIN); }