DESFire认证解密

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

我正在使用此代码:

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”

如果你的主密钥字节都是全零,那么这是不正确的:

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

这将使您在平台默认编码中获得文本编码forms的“0000000000000000” – 很可能是{ 0x30, 0x30, 0x30 ... }

获得一个充满零的数组很简单:

 byte[] masterKeyBytes = new byte[16]; 

IV同样适用(当然有适当的长度)。

那仍然没有给你你正在寻找的结果,不可否认……但它正在使用“全零”键/ IV。