我成功使用 DES 进行身份验证并设法更改卡上的密钥。详情如下:
Old Key: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
New Key: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
使用 0x0A 成功执行身份验证并更改密钥后,我现在在尝试将读卡器的旋转随机数与卡身份验证后的解密响应进行匹配时遇到问题。
这是数据流:
Request Data: {length = 7, bytes = 0x901a0000010000}
Response Data: {length = 10, bytes = 0xace4f80c25bd82d891af}
Response: AC E4 F8 0C 25 BD 82 D8 91 AF
Extracted Response: AC E4 F8 0C 25 BD 82 D8
Card Nonce (rndB): 5C AC 17 98 90 01 E5 12
Rotated Nonce (rndBr): AC 17 98 90 01 E5 12 5C
我的加密步骤的明文和密文值:
PlainText: FF 88 3B C1 EF 06 38 97 AC 17 98 90 01 E5 12 5C
CipherText: 64 B3 6E 44 C3 0E E7 79 98 AE 2F 3F A4 5F D8 D7 D5 3F FB D6 46 D1 0A BB
这是我下一步要发送的内容:
Request Data: {length = 22, bytes = 0x90af00001064b36e44c30ee77998ae2f3fa45fd8d700}
Response Data: {length = 10, bytes = 0xce9c95f4960ff4969100}
Response: CE 9C 95 F4 96 0F F4 96 91 00
我正在使用的随机数值:
Reader Nonce from card (rndA2): 84 F4 6D E2 F5 1F E5 97
Original Nonce A (rndA): FF 88 3B C1 EF 06 38 97
此错误仅是由于使用 DES 密钥 造成的。
注意:我知道内部使用的不是 DES,而是三重 DES,但问题与此无关。
DES 密钥长 8 字节,因此完整密钥为 64 位(8 字节 * 每个 8 位),但由于非常古老的原因,并未将完整密钥材料用于加密操作。每个字节中的最高位用作奇偶校验位,因此完整的密钥材料只有 64 - 8 = 56 位长。当搜索“DES 安全性”时,您会发现很多关于这些 56 位(或三重 DES 模式下的 112 位/168 位)的文章。
使用默认密钥(0x00 00 00 00 ...)时,您不会注意到这一事实,因为当基位为“0b”时,奇偶校验位也为“0b”,但在使用自定义密钥时,它们确实很重要.
这是“原始”(未修改)和“真实”(修改)键的示例:
Original DES key: 0xd10023456789abcd
Modified DES key: 0xd00022446688aacc
由于您没有针对您的问题标记任何框架(例如 Java),因此我无法提供任何用于删除奇偶校验位的代码。
解决方案:从密钥的所有字节中删除最高位(位7)并使用该密钥进行DES加密和解密操作。
顺便说一句:DES 加密模式下的 DESFire 标签使用 8 个奇偶校验位 = 1 个字节来实现“密钥版本”。
在 AES 加密模式下使用 DESFire 标签时,这不适用 - AES 密钥与所有 8 位(总共 16 个字节)一起用于加密操作。