- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有人知道如何解密从卡发送的第一条消息?我的意思是在身份验证成功之后,然后你发送一个命令(例如 0x51 (GetRealTagUID)。它返回 00+random32bits(总是不同的)。我尝试用以下方法解密它:
private byte[] decrypt(byte[] raw, byte[] encrypted, byte[] iv)
throws Exception {
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParameterSpec);
byte[] decrypted = cipher.doFinal(encrypted);
return decrypted;
}
并用 decrypt(sessionKey, response, iv) 调用它
IV = 全零(16 字节)
响应 = 0x51 命令后的 32 个随机位(只是删除了两个零)
有人告诉我,IV 在第一个发送命令 (0x51) 后发生变化。如何生成正确的 IV 来解密该响应?我认为全零是错误的,因为解密的消息总是不同的,并且对于同一张卡应该总是相同的。
-编辑-
应用您的(Michael Roland)指令后,解密的响应仍然只是随机位。这是我的代码(我想我做错了什么):
byte[] x = encrypt(sessionKey, iv, iv);
byte[] rx = rotateBitsLeft(x);
if ((rx[15] & 0x01) == 0x01)
rx[15] = (byte) (rx[15] ^ 0x87);
if ((rx[15] & 0x01) == 0x00)
rx[15] = (byte) (rx[15] ^ 0x01);
byte[] crc_k1 = rx;
byte[] rrx = rotateBitsLeft(rx);
if ((rrx[15] & 0x01) == 0x01)
rrx[15] = (byte) (rrx[15] ^ 0x87);
if ((rrx[15] & 0x01) == 0x00)
rrx[15] = (byte) (rrx[15] ^ 0x01);
byte[] crc_k2 = rrx;
byte[] command = { (byte) 0x51, (byte) 0x80, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00 };
for (int i = 0; i < 16; i++){
command[i] = (byte) (command[i] ^ crc_k2[i]);
}
byte[] iv2 = encrypt(sessionKey, command, iv);
byte[] RealUID = decrypt(sessionKey, ReadDataParsed, iv2);
Log.e("RealUID", ByteArrayToHexString(RealUID));
-EDIT3-
仍然总是返回不同的值。我认为问题可能出在这里:
byte[] iv2 = encrypt(sessionKey, command, iv);
创建用于解密响应的新 IV 时使用什么 IV?那里全是零。
最佳答案
身份验证后,IV 重置为全零。当您使用 AES 身份验证时,您必须为每个后续命令计算 CMAC(即使 CMAC 实际上并未附加到该命令)。因此,您的命令的 CMAC 计算将导致正确的 IV 初始化以解码响应。 IE。命令的 CMAC 等于解密响应的 IV。同样,对于所有进一步的命令,IV 是来自先前加密/CMAC 的最后一个密码 block 。
更新:
如何计算CMAC pad异或值
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
)。 -> x[0..15]
x[0..15]
向左一点。 -> rx[0..15]
rx[15]
中的位 0)是一个:异或 rx[15]
与 0x86
.rx[0..15]
作为crc_k1[0..15]
.rx[0..15]
向左一点。 -> rrx[0..15]
rrx[15]
中的位 0)是一个:异或 rrx[15]
与 0x86
.rrx[0..15]
作为crc_k2[0..15]
.如何计算CMAC
0x80 0x00 0x00 ...
填充命令到密码的 block 大小(AES 为 16 字节)。如果命令长度匹配 block 大小的倍数,则不添加填充。0x51
),它看起来像:0x51 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
crc_k2[0..15]
异或填充命令的最后 16 个字节.crc_k1[0..15]
异或.enc(IV xor datablock)
,前一个 block 的密文是新 IV)结果。更新 2:
如何将位 vector 向左旋转一位
public void rotateLeft(byte[] data) {
byte t = (byte)((data[0] >>> 7) & 0x001);
for (int i = 0; i < (data.length - 1); ++i) {
data[i] = (byte)(((data[i] << 1) & 0x0FE) | ((data[i + 1] >>> 7) & 0x001));
}
data[data.length - 1] = (byte)(((data[data.length - 1] << 1) & 0x0FE) | t);
}
关于java - 如何解密从 Mifare Desfire EV1 发送的第一条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20503060/
在多个 Android 设备上,Mifare DESFire 通信被路由到 HCE 而不是脱离主机 (UICC)。 通过基于 OMAPI 与脱离主机安全元素的通信,我已经学会了如何将 AID 添加到
我需要使用 WinSCard 读取 MiFare 卡的序列号。我能够从 MiFare 卡读取 7B UID。 The confusion is that i dont know if the UID
如何从使用 MIFARE 应用程序目录结构格式化的 MIFARE Classic 卡进行身份验证和读取数据?我正在使用 Android。 最佳答案 请参阅 NXP 关于 MIFARE Applicat
除了 NXP 网站上显示的关于 mifare plus 和 mifare desfire 的内容外,还要考虑以下因素: 安全 阅读速度 如果贴上铁氧体层可以贴在手机上,哪个更好? 如果我们将来要进入支
是否有可靠的方法来确定 RFID 卡是 Mifare Ultralight 还是 Mifare Ultralight C? 到目前为止,我发现的唯一方法是利用这两张卡的大小差异,发出超出较小卡边界的读
我正在 android 中使用 nfc,我想知道发现的标签是 Mifare Classic 还是 Mifare Ultralight 还是其他任何标签。请告诉我该怎么做? 最佳答案 尝试 String
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我正在尝试将 PN532 配置为 Mifare 仿真模式。我使用“ACR122U”读卡器进行 Mifare 仿真,使用“OMNIKEY CardMan 5x21-CL”作为读卡器。我成功地将 ACR1
假设我想对 Mifare Classic 进行身份验证。 我如何知道要发送到卡的确切类型的 APDU? 例子。 这段代码: bcla = 0xFF; bins = 0x86; bp1 = 0x0;
[ 请在您的答案中仅考虑 1k 经典卡。 ] 我希望获得一些 RFID 领域的行业知识。具体来说,使用 MIFARE MAD(Mifare 应用程序目录)。我通过查看位于此处的 NXP 发布的 MIF
我知道这篇文章:- Locking mechanism of Mifare Classic 1K 但是,确实不清楚 - 如何在此字符串中计算像 FF 07 80 FF 这样的值: D3 F7 D3 F
[ 请在您的答案中仅考虑 1k 经典卡。 ] 我希望获得一些 RFID 领域的行业知识。具体来说,使用 MIFARE MAD(Mifare 应用程序目录)。我通过查看位于此处的 NXP 发布的 MIF
基于 this article ,我正在尝试模拟 mifare 卡在 android 上管理 APDU。根据 APDU 接收,我的应用程序应该回答正确的 APDU,从而模拟 mifare 行为。 使用
好的,我已经开发了一个与 Mifare Classic 智能卡(非接触式)通信的应用程序。 该应用程序将用于成员(member)身份识别。 目前的方法是将一个 16 字节的值写入卡的 block 4。
有没有办法将 DESFire 卡重置为原始状态?是否有格式化和删除所有内容的命令? 我读到 DeleteApplication apdu 命令删除了应用程序及其文件,但空间仍然不可用。 谢谢。 最佳答
这个问题已经有答案了: Reading Mifare Classic returns strange characters (2 个回答) 已关闭 4 年前。 当我从一个 block 读取 Mifar
我编写了一个简单的应用程序 (C#),以便通过我的智能卡读卡器在我的 Mifare 卡上执行一些 I/O 操作(显然,我使用了一些 Win API 包装)。 我得到的关于 mifare 的唯一信息是“
我使用以下命令来执行我的 Mifare Classic 1K 卡的转储: mfoc -O my_dump.mdf 然后我使用以下命令将转储写入空白卡: nfc-mfclassic w A my_dum
我有一个 MIFARE 1K 标签。某些块可以使用身份验证 key A 写入/读取,而其他块可以使用身份验证 key B 写入。 为什么?例如,如何使用键 A 更改要写入/读取的所有块? 比如我可以用
上周我一直在尝试使用具有默认 key (00000000h) 的 MIFARE DESFire EV1 卡进行身份验证,但无济于事。我关注了this blog对信的指示。我实现了Send mode C
我是一名优秀的程序员,十分优秀!