//设置8个MD5校验密匙 public bool SetMd5Key(out string msg) { msg = string.Empty; if (ET99_API.dogHandle == System.IntPtr.Zero) { msg = "请先打开设备!"; return(false); } string strMd5Key = Properties.Resources.HMAC_MD5;//需要写入的KEY byte[] bytShortKey = System.Text.Encoding.ASCII.GetBytes(strMd5Key); for (int keyid = 1; keyid <= 8; keyid++)//循环写入Md5Key { byte[] randombuffer = new byte[51]; byte keylen = byte.Parse(strMd5Key.Length.ToString()); byte randomlen = 51; byte[] sbMd5Key = new byte[32]; byte[] sbdigest = new byte[16]; //第一个参数是随机数,在设置密钥时没有作用 //第二个参数是随机数长度,在设置密钥时没有作用 //第三个参数是分配给客户的密钥 //第四个参数是分配给客户的密钥的长度 //第五个参数是返回的32字节的密钥,用于存到锁内 //第六个参数在设置密钥时没有作用 uint result = ET99_API.MD5_HMAC(randombuffer, randomlen, bytShortKey, keylen, sbMd5Key, sbdigest); result = ET99_API.et_SetKey(ET99_API.dogHandle, keyid, sbMd5Key); if (result == ET99_API.ET_SUCCESS) { msg = "设置8个MD5校验密匙成功!"; } else { msg = string.Format("设置第{0}个MD5校验密匙失败!错误:{1}", keyid, ET99_API.ShowResultText(result)); return(false); } } return(true); }
/// <summary> /// 软件计算HMAC_MD5 /// 加密狗中可存储8个32字节HMAC_MD5密钥(每一个密钥都是由1个16字节密钥种子重复一次而成,这里存储的是8个16字节‘密钥种子’) /// </summary> /// <param name="MD5KeyIndexInDog">密钥index[范围1~8,对应加密狗中密钥存储范围1~8]</param> /// <param name="origin">原始字串</param> /// <returns>加密后字串</returns> public string HMAC_MD5_soft(int MD5KeyIndexInDog, string origin) { string strMD5Key = Properties.Resources.HMAC_MD5; byte[] bytRandomCode = new byte[origin.Length]; //第一个参数是随机数 bytRandomCode = System.Text.Encoding.ASCII.GetBytes(origin); byte randomlen = byte.Parse(origin.Length.ToString()); //第二个参数是随机数长度 byte[] bytShortKey = new byte[strMD5Key.Length]; //第三个参数是分配给客户的密钥 bytShortKey = System.Text.Encoding.ASCII.GetBytes(strMD5Key); byte keylen = byte.Parse(strMD5Key.Length.ToString()); //第四个参数是分配给客户的密钥的长度 byte[] sbMd5Key = new byte[32]; //第五个参数没有作用 byte[] sbdigest = new byte[16]; //第六个参数为软件计算的结果 //第一个参数是随机数 //第二个参数是随机数长度 //第三个参数是分配给客户的密钥 //第四个参数是分配给客户的密钥的长度 //第五个参数没有作用 //第六个参数为软件计算的结果 uint result = ET99_API.MD5_HMAC(bytRandomCode, randomlen, bytShortKey, keylen, sbMd5Key, sbdigest); if (result == ET99_API.ET_SUCCESS) { //string strSoftDigest = string.Empty; //for (int i = 0; i < 16; i++) // strSoftDigest += string.Format("{0:X2}", sbdigest[i]); //return strSoftDigest; return(System.Text.Encoding.Default.GetString(sbdigest)); } else//失败 { return("软件计算失败"); } }