PHP解密NTAG 424 DNA NFC标签:CMAC校验失败及冗余数据疑问
NTAG 424 DNA NFC标签解密与CMAC校验问题
背景信息
我正在用PHP处理NTAG 424 DNA NFC标签的解密,使用的IV和密钥如下:
$IV = str_repeat("\x00", 16); $key = str_repeat("\xBE\xEF", 8);
扫描标签得到的URL格式为/B4D9B7869E3258C8508FB96D6663AA3D/79598DFC270671BD,其中前半段B4D9B7869E3258C8508FB96D6663AA3D是加密消息,后半段79598DFC270671BD是CMAC值。
问题1:CMAC校验结果不符
我用CMAC库生成校验值,代码如下:
$crypt = new \CryptLib\MAC\Implementation\CMAC(); $cmacKey = pack("H*", bin2hex($key)); $cmacMsg = pack("H*", $msg); $cmac = $crypt->generate($cmacMsg, $cmacKey, 8); $cmac = bin2hex($cmac);
但生成的CMAC值为78ff8705b76734f3,和预期的79598DFC270671BD不一致,请问问题出在哪?如何得到正确的CMAC值?
问题2:解密后的填充部分验证
我用以下代码解密消息,提取PICC数据标签、UID和计数器:
$ciphertext = openssl_decrypt(hex2bin($msg), 'aes-128-cbc', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $IV); if ($ciphertext === false) { echo "OpenSSL error: " . openssl_error_string(); } else { $PICCDataTag = bin2hex(substr($ciphertext, 0, 1)); $UID = bin2hex(substr($ciphertext, 1, 7)); $SDMReadCtr = bin2hex(substr($ciphertext, 8, 3)); $counter = 0; for ($i = 0; $i < strlen($SDMReadCtr); $i += 2) { $counter += hexdec(substr($SDMReadCtr, $i, 2)); } }
使用的密文十六进制为c7048b25aac41390010000ab8f0d7316,这段代码能得到正确结果,但解密后的$ciphertext包含未使用的部分ab8f0d7316。根据AN12196文档4.4.3.2表中的步骤8,我认为这是随机填充,这个判断是否正确?
内容的提问来源于stack exchange,提问作者Corey Freeman
相关产品推荐
相关产品推荐

