You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:57:36