DESFire认证解密

时间:2012-07-08 19:22:44

标签: java mifare encryption

我目前正在使用DESFire EV1非接触式卡。 我正在尝试使用masterkey解密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"

1 个答案:

答案 0 :(得分:2)

如果您的主密钥 bytes 是全零的,那么这是不正确的:

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

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

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

byte[] masterKeyBytes = new byte[16];

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

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