/// <summary> /// 设置某个扇区的密钥,如果此扇区已经被加密,返回false /// </summary> /// <param name="cardID">卡片的卡号(为null或空时不检查卡号是否一致)</param> /// <param name="section">扇区(0~15)</param> /// <param name="originalKey">旧密钥(6字节)</param> /// <param name="key">新密钥(6字节)</param> /// <param name="successBuz">成功是否发出提示音</param> /// <param name="failBuz">失败是否发出提示音</param> /// <returns></returns> public CardOperationResultCode SetSectionKey(string cardID, int section, byte[] originalKey, byte[] key, bool successBuz, bool failBuz) { try { CardOperationResultCode result = CardOperationResultCode.Success; int ret = 1; ACTIVEPARAA pAInfo = new ACTIVEPARAA(); if (MUR200Init() > 0) { ret = MUR200Open(0); } else if (result == CardOperationResultCode.Success) { result = CardOperationResultCode.InitFail; } if (ret == 0) { ret = MFActivate(0, 0x52, ref pAInfo); } else if (result == CardOperationResultCode.Success) { result = CardOperationResultCode.OpenFail; } if (ret == 0) { //cardID不为空时,需要检查卡号是否一致,不一致时,返回写卡失败 if (!string.IsNullOrEmpty(cardID) && cardID != GetUID(pAInfo.UID, pAInfo.UIDLen)) { ret = 1; } } else if (result == CardOperationResultCode.Success) { result = CardOperationResultCode.NoCard; } if (ret == 0) { result = _InitKey(section, originalKey, key); } else if (result == CardOperationResultCode.Success) { result = CardOperationResultCode.CardIDError; } if (ret == 0 && successBuz) { _SucessBuz(); } else if (ret != 0 && failBuz) { _FailBuz(); } MUR200Exit(); return(result); } catch (Exception ex) { ExceptionPolicy.HandleException(ex); } return(CardOperationResultCode.Fail); }
/// <summary> /// 读卡片的ID号及数据 /// </summary> /// <returns></returns> public ReadCardResult ReadCard() { ReadCardResult result = new ReadCardResult(); try { string value = string.Empty; ACTIVEPARAA pAInfo = new ACTIVEPARAA(); if (MUR200Init() > 0) { if (MUR200Open(0) == 0) { if (MFActivate(0, 0x52, ref pAInfo) == 0) { if (!InvalidReading) { InvalidReading = true; value = GetUID(pAInfo.UID, pAInfo.UIDLen); //读取扇区2数据,读取成功将数据返回,失败不作处理 if (MFAuth(KEY_TYPE_A | KEY_SOURCE_EXT, (2 * 4 + 3), RalidKey) == 0) { byte[] sectiondata = new byte[16 * 3]; if (MFRead((2 * 4 + 0), 3, sectiondata) == 0) { result.ParkingDate = new byte[16 * 3]; Array.Copy(sectiondata, result.ParkingDate, 16 * 3); } } _SucessBuz(); } MFHalt(); } else { InvalidReading = false; } MUR200Exit(); } } if (!string.IsNullOrEmpty(value)) { result.CardID = value.ToString(); } } catch (Exception ex) { ExceptionPolicy.HandleException(ex); } return(result); }
private static extern byte MFActivate(byte ucMode, byte ucReqCode, ref ACTIVEPARAA pAInfo);
/// <summary> /// 把数据写入卡片的某个扇区的某些块中 /// </summary> /// <param name="cardID">需写入卡片的卡号(为null或空时不检查卡号)</param> /// <param name="section">扇区(0~15)</param> /// <param name="block">起始块号(0~3)</param> /// <param name="ucExt">写入块数(1~3)</param> /// <param name="pBuf">写入数据</param> /// <param name="key">密钥</param> /// <param name="successBuz">成功是否发出提示音</param> /// <param name="failBuz">失败是否发出提示音</param> /// <param name="initKey">密钥验证失败后,是否初始化扇出密钥</param> /// <returns></returns> public CardOperationResultCode WriteSection(string cardID, int section, int block, byte ucExt, byte[] pBuf, byte[] key, bool successBuz, bool failBuz, bool initKey) { try { CardOperationResultCode result = CardOperationResultCode.Success; int ret = 1; ACTIVEPARAA pAInfo = new ACTIVEPARAA(); if (MUR200Init() > 0) { ret = MUR200Open(0); } else if (result == CardOperationResultCode.Success) { result = CardOperationResultCode.InitFail; } if (ret == 0) { ret = MFActivate(0, 0x52, ref pAInfo); } else if (result == CardOperationResultCode.Success) { result = CardOperationResultCode.OpenFail; } if (ret == 0) { //cardID不为空时,需要检查卡号是否一致,不一致时,返回写卡失败 if (!string.IsNullOrEmpty(cardID) && cardID != GetUID(pAInfo.UID, pAInfo.UIDLen)) { ret = 1; } } else if (result == CardOperationResultCode.Success) { result = CardOperationResultCode.NoCard; } if (ret == 0) { ret = MFAuth(KEY_TYPE_A | KEY_SOURCE_EXT, (byte)(section * 4 + 3), key); } else if (result == CardOperationResultCode.Success) { result = CardOperationResultCode.CardIDError; } //密钥验证失败后,如果需要初始化密钥 if (initKey && ret != 0 && result == CardOperationResultCode.Success) { MFActivate(0, 0x52, ref pAInfo); result = _InitKey(section, DefaultKey, key); if (result == CardOperationResultCode.Success) { ret = MFAuth(KEY_TYPE_A | KEY_SOURCE_EXT, (byte)(section * 4 + 3), key);//再次验证密钥 } } if (ret == 0) { ret = MFWrite((byte)(section * 4 + block), ucExt, pBuf); if (ret != 0) { result = CardOperationResultCode.Fail; } } else if (result == CardOperationResultCode.Success) { result = CardOperationResultCode.AuthFail; } if (ret == 0 && successBuz) { _SucessBuz(); } else if (ret != 0 && failBuz) { _FailBuz(); } MUR200Exit(); return(result); } catch (Exception ex) { ExceptionPolicy.HandleException(ex); } return(CardOperationResultCode.Fail); }
/// <summary> /// 从卡片中读卡扇区某些块中的数据,失败返回空 /// </summary> /// <param name="cardID">卡片的卡号(为null或空时不检查卡号是否一致)</param> /// <param name="section">扇区(0~15)</param> /// <param name="block">起始块号(0~3)</param> /// <param name="count">读取块数(1~3)</param> /// <param name="key">密钥</param> /// <param name="successBuz">成功是否发出提示音</param> /// <param name="failBuz">失败是否发出提示音</param> /// <param name="initKey">密钥验证失败后,是否初始化扇出密钥</param> /// <returns></returns> public ReadCardResult ReadSection(string cardID, int section, int block, byte count, byte[] key, bool successBuz, bool failBuz, bool initKey) { ReadCardResult result = new ReadCardResult(); try { int ret = 1; byte[] readbytes = null; ACTIVEPARAA pAInfo = new ACTIVEPARAA(); if (MUR200Init() > 0) { ret = MUR200Open(0); } else if (result.ResultCode == CardOperationResultCode.Success) { result.ResultCode = CardOperationResultCode.InitFail; } if (ret == 0) { ret = MFActivate(0, 0x52, ref pAInfo); } else if (result.ResultCode == CardOperationResultCode.Success) { result.ResultCode = CardOperationResultCode.OpenFail; } if (ret == 0) { result.CardID = GetUID(pAInfo.UID, pAInfo.UIDLen); //cardID不为空时,需要检查卡号是否一致,不一致时,返回写卡失败 if (!string.IsNullOrEmpty(cardID) && cardID != result.CardID) { ret = 1; } } else if (result.ResultCode == CardOperationResultCode.Success) { result.ResultCode = CardOperationResultCode.NoCard; } if (ret == 0) { ret = MFAuth(KEY_TYPE_A | KEY_SOURCE_EXT, (byte)(section * 4 + 3), key); } else if (result.ResultCode == CardOperationResultCode.Success) { result.ResultCode = CardOperationResultCode.CardIDError; } //密钥验证失败后,如果需要初始化密钥 if (initKey && ret != 0 && result.ResultCode == CardOperationResultCode.Success) { MFActivate(0, 0x52, ref pAInfo); result.ResultCode = _InitKey(section, DefaultKey, key); if (result.ResultCode == CardOperationResultCode.Success) { ret = MFAuth(KEY_TYPE_A | KEY_SOURCE_EXT, (byte)(section * 4 + 3), key);//再次验证密钥 } } if (ret == 0) { readbytes = new byte[16 * count]; ret = MFRead((byte)(section * 4 + block), count, readbytes); if (ret == 0) { result[section] = readbytes; result.ResultCode = CardOperationResultCode.Success; } else { result.ResultCode = CardOperationResultCode.Fail; } } else if (result.ResultCode == CardOperationResultCode.Success) { result.ResultCode = CardOperationResultCode.AuthFail; } if (ret == 0 && successBuz) { _SucessBuz(); } else if (ret != 0 && failBuz) { _FailBuz(); } MUR200Exit(); } catch (Exception ex) { ExceptionPolicy.HandleException(ex); } return(result); }