关于rfid Desfire芯片的更改秘钥问题

a136limin520 2016-10-12 10:06:38
最近在研究desfire的卡片,用的是WINSCARD.dll 库,不需要了解初始化和防冲突、连接卡片啥的,直接发送命令数据就好。
现在在我修改秘钥的时候出现了一个问题:
下面是我的执行细节:

>0A 00
<AF 63 C5 4D CF 6F 3A 6F C9
>AF 49 1E 89 0D E9 AC E9 32 9C 5C 6D 55 D9 FA 36 D7
<00 B7 D1 DA 7C E0 DD 98 6B
这样我验证Master Key成功,并得到sessionKey = 00 01 02 03 f6 b0 33 39 (我的RndA = 00 01 02 03 04 05 06 07)。

接下来我执行 ChangeKeySettings ,将keysetting 修改为0f。我获得0f 的CRC校验值为 09 a9所以要发送的数据为 0f 09 a9 00 00 00 00 00
DES解密之后的数据为 cb 64 3f d0 30 e6 87 da

>54 CB 64 3F D0 30 E6 87 DA
<00
成功,说明我的DES和CRC16的算法没有问题

接下来我执行changekey命令,我要修改key 00(Masker Key) ,而且我验证过了key 00,所以根据desfire的协议我只需要将16Byte New Key + 2Byte CRC + 6Byte 0x00 加密后发送即可。我的New Key = 11 22 33 44 55 66 77 88 11 22 33 44 55 66 77 88,CRC = BF 02,所以我要发送的数据为 11 22 33 44 55 66 77 88 11 22 33 44 55 66 77 88 BF 02 00 00 00 00 00 00,解密操作后的数据为 ce 27 61 0e 8c 09 01 39 df 05 52 4a d9 6f 76 b1 9a 18 52 e9 12 68 12 e3

>c4 00 ce 27 61 0e 8c 09 01 39 df 05 52 4a d9 6f 76 b1 9a 18 52 e9 12 68 12 e3
<1E

返回错误为 INTEGRITY_ERROR CRC or MAC does not match data | Padding bytes not valid

现在我并不知道到底错在哪里了。。。CRC 和DES的代码下面贴出,希望各位大大 帮帮忙!
...全文
3745 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zilanchenxin 2021-07-20
  • 打赏
  • 举报
回复

楼主怎么解决的,数据对不对

专业路人甲 2017-10-25
  • 打赏
  • 举报
回复
漏了说,这个crc版本是crc16-ccitt x16+x12+x5+1 8408
专业路人甲 2017-10-25
  • 打赏
  • 举报
回复
我自己换算了一下的,试过没问题

WORD crc16_ccitt_table[] = 
{
	0X0000, 0x1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF, 
	0X8C48, 0X9DC1, 0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7,
	0X1081, 0X0108, 0X3393, 0X221A, 0X56A5, 0X472C, 0X75B7, 0X643E, 
	0X9CC9, 0X8D40, 0XBFDB, 0XAE52, 0XDAED, 0XCB64, 0XF9FF, 0XE876,
	0X2102, 0X308B, 0X0210, 0X1399, 0X6726, 0X76AF, 0X4434, 0X55BD, 
	0XAD4A, 0XBCC3, 0X8E58, 0X9FD1, 0XEB6E, 0XFAE7, 0XC87C, 0XD9F5,
	0X3183, 0X200A, 0X1291, 0X0318, 0X77A7, 0X662E, 0X54B5, 0X453C, 
	0XBDCB, 0XAC42, 0X9ED9, 0X8F50, 0XFBEF, 0XEA66, 0XD8FD, 0XC974,
	0X4204, 0X538D, 0X6116, 0X709F, 0X0420, 0X15A9, 0X2732, 0X36BB, 
	0XCE4C, 0XDFC5, 0XED5E, 0XFCD7, 0X8868, 0X99E1, 0XAB7A, 0XBAF3,
	0X5285, 0X430C, 0X7197, 0X601E, 0X14A1, 0X0528, 0X37B3, 0X263A, 
	0XDECD, 0XCF44, 0XFDDF, 0XEC56, 0X98E9, 0X8960, 0XBBFB, 0XAA72,
	0X6306, 0X728F, 0X4014, 0X519D, 0X2522, 0X34AB, 0X0630, 0X17B9, 
	0XEF4E, 0XFEC7, 0XCC5C, 0XDDD5, 0XA96A, 0XB8E3, 0X8A78, 0X9BF1,
	0X7387, 0X620E, 0X5095, 0X411C, 0X35A3, 0X242A, 0X16B1, 0X0738, 
	0XFFCF, 0XEE46, 0XDCDD, 0XCD54, 0XB9EB, 0XA862, 0X9AF9, 0X8B70,
	0X8408, 0X9581, 0XA71A, 0XB693, 0XC22C, 0XD3A5, 0XE13E, 0XF0B7, 
	0X0840, 0X19C9, 0X2B52, 0X3ADB, 0X4E64, 0X5FED, 0X6D76, 0X7CFF,
	0X9489, 0X8500, 0XB79B, 0XA612, 0XD2AD, 0XC324, 0XF1BF, 0XE036, 
	0X18C1, 0X0948, 0X3BD3, 0X2A5A, 0X5EE5, 0X4F6C, 0X7DF7, 0X6C7E,
	0XA50A, 0XB483, 0X8618, 0X9791, 0XE32E, 0XF2A7, 0XC03C, 0XD1B5, 
	0X2942, 0X38CB, 0X0A50, 0X1BD9, 0X6F66, 0X7EEF, 0X4C74, 0X5DFD,
	0XB58B, 0XA402, 0X9699, 0X8710, 0XF3AF, 0XE226, 0XD0BD, 0XC134, 
	0X39C3, 0X284A, 0X1AD1, 0X0B58, 0X7FE7, 0X6E6E, 0X5CF5, 0X4D7C,
	0XC60C, 0XD785, 0XE51E, 0XF497, 0X8028, 0X91A1, 0XA33A, 0XB2B3, 
	0X4A44, 0X5BCD, 0X6956, 0X78DF, 0X0C60, 0X1DE9, 0X2F72, 0X3EFB,
	0XD68D, 0XC704, 0XF59F, 0XE416, 0X90A9, 0X8120, 0XB3BB, 0XA232, 
	0X5AC5, 0X4B4C, 0X79D7, 0X685E, 0X1CE1, 0X0D68, 0X3FF3, 0X2E7A,
	0XE70E, 0XF687, 0XC41C, 0XD595, 0XA12A, 0XB0A3, 0X8238, 0X93B1, 
	0X6B46, 0X7ACF, 0X4854, 0X59DD, 0X2D62, 0X3CEB, 0X0E70, 0X1FF9,
	0xf78f, 0XE606, 0XD49D, 0XC514, 0XB1AB, 0XA022, 0X92B9, 0X8330, 
	0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78
};

// For DESFire EV1 PresetVal was 0x6363
DWORD _AF_API crc16_ccitt_t(
	_Inout_ WORD Output[],
	_In_bytecount_(InputLen) CONST PVOID Input,
	_In_ DWORD InputLen,
	_In_ WORD PresetVal
	)
{
	DWORD crc = PresetVal;
	PBYTE pMsg = (PBYTE)Input;

	while (-1 >-- InputLen){
		crc = (crc >> 8) ^ crc16_ccitt_table[(pMsg++[0] ^ crc)&0xFF];
	}

	Output[0] = (WORD)(crc);
	return sizeof(WORD);
}
wk59121 2017-09-12
  • 打赏
  • 举报
回复
根据协议,楼主的方式没问题。 估计验证方式不是使用的0A
xqhrs232 2017-04-17
  • 打赏
  • 举报
回复
SCardEstablishContext function----https://msdn.microsoft.com/en-us/library/windows/desktop/aa379479%28v=vs.85%29.aspx?tid=vanSCARDESTABLISHCONTEXT MS还真提供有这样的一个操作读卡器的库!!!
Mila_Liu 2017-03-15
  • 打赏
  • 举报
回复
楼主,你上面的方法是修改key0E的吧,key00应该如下方法: 2. C4+keyno.+dk(ckeyXORnkey+CRC1+CRC2+00000000) 计算过程:AUTH的skey=,当前密钥ckey和新密钥nkeyXOR得到ckeyXORnkey,同时取其CRC16值CRC1,算新密钥nkey的CRC16值CRC2,用过程密钥skey对“ckeyXORnkey+CRC1+CRC2+00000000”进行CRC解密得到dk(ckeyXORnkey+CRC1+CRC2+00000000)。
chunchui1987 2017-03-02
  • 打赏
  • 举报
回复
请问这个问题是怎么解决的?
zhengyanbo88 2016-11-17
  • 打赏
  • 举报
回复
请问楼主你的问题解决了吗?
zhengyanbo88 2016-11-17
  • 打赏
  • 举报
回复
0f 的CRC校验值不是为:EF F1吗?
a136limin520 2016-10-14
  • 打赏
  • 举报
回复
引用 5 楼 xqhrs232 的回复:
WINSCARD.dll 库是那里来的?
难道不是Windows里的? 或者是我装读卡器驱动的时候带的? 我是看读卡器sdk里的源码,照着用的
a136limin520 2016-10-14
  • 打赏
  • 举报
回复
引用 3 楼 of123 的回复:
是否还要重新获取过程密钥。有些协议是要求一次一密的。
我获取sessionkey 之后直接执行的这个命令,这个命令发送的数据默认就是加密过的,不需要MAC
of123 2016-10-14
  • 打赏
  • 举报
回复
引用 6 楼 a136limin520 的回复:
[quote=引用 3 楼 of123 的回复:] 是否还要重新获取过程密钥。有些协议是要求一次一密的。
我获取sessionkey 之后直接执行的这个命令,这个命令发送的数据默认就是加密过的,不需要MAC[/quote]这个还是要看规范或协议。加密只能保证消息的私密性,不能保证其完整性。MAC 是用来保证完整性的。而错误提示,恰恰是完整错误。
of123 2016-10-13
  • 打赏
  • 举报
回复
另外,如果此交易要求 MAC,还要在命令后附加 MAC 码。
of123 2016-10-13
  • 打赏
  • 举报
回复
是否还要重新获取过程密钥。有些协议是要求一次一密的。
zilanchenxin 2021-07-23
  • 举报
回复
@of123 有没有相关修改密钥的详细流程?
xqhrs232 2016-10-13
  • 打赏
  • 举报
回复
WINSCARD.dll 库是那里来的?
a136limin520 2016-10-12
  • 打赏
  • 举报
回复
没有人吗....还是我需要发到别的版块? 这里也没有rfid/NFC相关的版块啊...
a136limin520 2016-10-12
  • 打赏
  • 举报
回复
下面是我CRC16的代码: 查表法有个大表,代码不多 uint16 CACOS6GetCardInfoDlg::GetCrc16(const char * buf, int len) { uint16 crc16tab[256] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 }; uint16 bt; uint16 wCrc = 0x6363; uint16 j = 0; uint16 t8 = 0; uint16 t9 = 0; uint16 tA = 0; //int Len = Data.length; uint16 maskB = 0x00FF; uint16 maskW = 0xFFFF; do { bt = buf[j++] & maskB; bt = (bt ^ (wCrc & 0x00FF)) & maskB; bt = (bt ^ (bt << 4)) & maskB; t8 = (bt << 8) & maskW; t9 = (bt << 3) & maskW; tA = (bt >> 4) & maskW; wCrc = (wCrc >> 8) ^ (t8^t9^tA) & maskW; } while (j < len); byte bb[2]; bb[0] = (byte)(wCrc & maskB); bb[1] = (byte)((wCrc >> 8) & maskB); CString ss; ss.Format("%d:%02x %02x",len, bb[0], bb[1]); AfxMessageBox(ss); return wCrc; }

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧