java - DESFire认证解密

标签 java mifare encryption

我目前正在使用 DESFire EV1 非接触式卡。 我正在尝试用主 key 解密 DES/CBC 加密的 random_b:“00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00”。

我正在使用此代码:

byte[] encipheredCodeRandomB = { (byte)0xEA ,(byte)0x18 ,(byte)0xDE ,(byte)0xFF
     ,(byte)0x52 ,(byte)0x0E,(byte)0xCD, (byte) 90};
byte[] masterKeyBytes = "0000000000000000".getBytes();
byte[] ivBytes = "00000000".getBytes();

DESKeySpec desKeySpec = new DESKeySpec(masterKeyBytes);  
SecretKeyFactory desKeyFact = SecretKeyFactory.getInstance("DES");
SecretKey s = desKeyFact.generateSecret(desKeySpec);
aliceCipher = Cipher.getInstance("DES/CBC/NoPadding");
aliceCipher.init(Cipher.DECRYPT_MODE, s, new IvParameterSpec(ivBytes));

byte[] decipheredCodeRandomB = aliceCipher.doFinal(encipheredCodeRandomB);

但是这段代码无法正确破译。我得到这个无效结果:“4B 9D 5A 91 AE 93 F8 ED”正确的结果是:“A4 2F 3E 84 2C 5A 29 68”

最佳答案

如果您的主 key 字节全部为零,那么这是不正确的:

byte[] masterKeyBytes = "0000000000000000".getBytes();

这将为您提供平台默认编码中的文本编码形式“0000000000000000” - 最有可能的 { 0x30, 0x30, 0x30 ... }

获取一个全是零的数组很简单:

byte[] masterKeyBytes = new byte[16];

IV 也是如此(当然有适当的长度)。

诚然,这仍然没有给你想要的结果......但它使用了“全零”键/IV。

关于java - DESFire认证解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11385963/

相关文章:

java - 菜单项未显示在工具栏 SDK 29 中

java - Infinispan 远程延迟锁定

performance - NFC APDU READ 命令性能调整

access-control - 如何将 APDU 发送到 Mifare Classic 1k 卡?

php - 共享和存储 AES 加密/解密的 IV

java - 解密位图的像素

javascript - Node.JS 中的 3des 加密返回无效的 IV 长度

java - 何时在 Java 中使用 Map 而不是 List?

java - 如何从 Java 中的列表集中删除重复项

android - 用安卓解锁mifare标签