更改DESFire主密钥时出现0x1E错误(INTEGRITY_ERROR),我有什么错误?该如何解决?

Setare Ab

整个更新1:再次看到问题。

我最近正与工作DESFire卡。我现在决定改变defult主密钥PICC

(我已经可以使用主密钥成功验证所有8个字节的0x00)

1- Defultmaster key是0byte的8。它是00 00 00 00 00 00 00 00

master key我选择的2-New是16 byte

它是:

byte[] newPICCKey= new byte[]{(byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44,       
                                 (byte)0x55, (byte)0x66, (byte)0x77 ,(byte)0x88, 
                                 (byte)0x12, (byte)0x23, (byte)0x34 ,(byte)0x45 ,
                                 (byte)0x56, (byte)0x67, (byte)0x78 ,(byte)0x89};

3-我用旧的主密钥进行了身份验证(仍然不变,仍然是8字节的零。)。随机数是:

随机A = 8字节数字

随机B = 8字节数字

4-每次使用随机A和随机B创建会话密钥:会话密钥=随机A的前4个字节+随机B的前4个字节

//fill sessionKey with RandomA and RandomB
                for(int i=0; i<4; i++)
                    sessionKey[i] = randomA[i];
                for(int i=4; i<8; i++)

                    sessionKey[i] = randomB[i-4];

5-我用波纹管方法为新的主密钥创建CRC16。结果是:D8 EC(新的PICC主密钥可以是16个字节?还是必须是8个字节?顺便说一下,我为新的主密钥选择了16个字节的值)

 public class CRC16 
{
public static short Crc16(byte[] buffer, short offset, short len) 
    {
short crcTmp = 0x6363;
        for (int i = 0; i < len; ++i) 
        {
            short temp = (short)(buffer[offset + i] ^ crcTmp); 
            temp = (short)((temp ^ (temp << 4)) & 0xff); 
            crcTmp = (short)(((crcTmp >> 8) & 0xff) ^ (temp << 8) ^ (temp << 3) ^ (temp >> 4));
        }
        return crcTmp;
    }

}

6-我用CRC和填充(解密)创建ew PICC密钥

byte[] newPICCKey_deciphered = new byte[]{(byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44, 
                        (byte)0x55, (byte)0x66, (byte)0x77 ,(byte)0x88, 
                        (byte)0x12, (byte)0x23, (byte)0x34 ,(byte)0x45 ,
                        (byte)0x56, (byte)0x67, (byte)0x78 ,(byte)0x89,
                        (byte)0x00 , (byte)0x00,
                        (byte)0x00 ,(byte)0x00 ,(byte)0x00 ,
                        (byte)0x00 ,(byte)0x00 ,(byte)0x00 };
                txtNewPICCKeyDeciphered.setText(Utils.bytesToHex(newPICCKey_deciphered));

7-我计算crc16并将其添加到新密钥中:

short res = CRC16_3.Crc16(newPICCKey, (short)0, (short)16); 
                newPICCKey_deciphered[16] = (byte) (res & 0xFF); 
                newPICCKey_deciphered[17] = (byte) ((res >> 8) & 0xFF);

8-我通过波纹管方法在上述新主密钥上加密,并得到了24字节加密:

 byte[] iv1=new byte[]{(byte)0x00 , (byte)0x00 , (byte)0x00 , (byte)0x00 ,
                        (byte)0x00 , (byte)0x00 , (byte)0x00 , (byte)0x00 };
                byte[] newPICCKeyEnciphered = new byte[24];
                //..............................
                byte[] block1 = new byte[]{(byte)0x11, (byte)0x22, (byte)0x33, (byte)0x44, 
                        (byte)0x55, (byte)0x66, (byte)0x77 ,(byte)0x88};
                byte[] block2 = new byte[]{
                (byte)0x11, (byte)0x22, (byte)0x33 ,(byte)0x44 ,
                (byte)0x55, (byte)0x66, (byte)0x77 ,(byte)0x88};
                byte[] block3 = new byte[]{(byte)0x00 , (byte)0x00,
                        (byte)0x00 ,(byte)0x00 ,(byte)0x00 ,
                        (byte)0x00 ,(byte)0x00 ,(byte)0x00};
                block3[0] = newPICCKey_deciphered[16];
                block3[1] = newPICCKey_deciphered[17];

   try
                {
                    Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
                SecretKeyFactory desKeyFact = SecretKeyFactory.getInstance("DES");
                DESKeySpec desKeySpec = new DESKeySpec(sessionKey);  
                SecretKey s = desKeyFact.generateSecret(desKeySpec);
                cipher.init(Cipher.DECRYPT_MODE, s);

                byte[] r1 = new byte[8];
                r1 =Utils.doXorTwoByteArray(block1, iv1);

                byte[] r2 = new byte[8];
                r2 = cipher.doFinal(r1, 0, 8);
                //...............
                byte[] r3 = new byte[8];
                r3 =Utils.doXorTwoByteArray(block2, r2);

                byte[] r4 = new byte[8];
                r4 =cipher.doFinal(r3, 0, 8);
                //................
                byte[] r5 = new byte[8];
                r5 =Utils.doXorTwoByteArray(block3, r4);

                byte[] r6 = new byte[8];
                r6 =cipher.doFinal(r5, 0, 8);
                for(int i=0; i<8;i++)
                    newPICCKeyEnciphered[i] = r2[i];
                for(int i=8; i<16;i++)
                    newPICCKeyEnciphered[i] = r4[i-8];
                for(int i=16; i<24;i++)
                    newPICCKeyEnciphered[i] = r6[i-16];
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }

这是用于加密的DES类:

public class DES {
    public static byte[] doDecryptData(byte[] OriginalData,byte[]key , int sizeKey , byte[] iv , int sizeIV)
    {
    byte[] masterKeyBytes =new byte[sizeKey];
    masterKeyBytes = key;
        byte[] ivBytes = new byte[sizeIV];
     ivBytes = iv;
        byte[] encipheredData=new byte[sizeIV];

        try{

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

            encipheredData= aliceCipher.doFinal(OriginalData);
            return encipheredData;
        }
        catch(Exception e)
            {
                Log.e("error", "111"+e.toString());
            }
        return null;
    }

9-最后我填充参数字节数组,并将其与指令(c4)一起发送到

byte[] cmd = new byte[]{(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 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 
                         ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 
                         ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 ,(byte)0x00 };
                //fill cmd
                for(int i=1 ;i<cmd.length ; i++)
                    cmd[i] = newPICCKeyEnciphered[i -1];

try {
responseChangeKey = isodep.transceive(Utils.wrapMessage((byte)0xC4, cmd));
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

这是实用程序类:

public class Utils {    
    public static byte[] wrapMessage (byte command, byte[] parameters) throws Exception {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();

        stream.write((byte) 0x90);
        stream.write(command);
        stream.write((byte) 0x00);
        stream.write((byte) 0x00);
        if (parameters != null) {
            stream.write((byte) parameters.length);
            stream.write(parameters);
        }
        stream.write((byte) 0x00);

        byte[] b = stream.toByteArray();
        return b;
    }
}

我在最后一步(发送用于将主密钥更改为该卡的apdu)收到异常0x1E错误,这意味着完整性错误:CRC或MAC与数据不匹配填充字节无效。如何正确执行密钥更改?对我来说这是必要的。谢谢。

伏塔
  1. DESFire卡使用与您的稍有不同的CRC16。CRC16的初始值为0xFFFF,但DESFire期望0x6363这可能会导致完整性错误。
  2. 我看不到使用您的newPICCKey_deciphered阵列解密的DEC / CBC加密加密时,您确实必须使用DECRYPTION MODE而不是ENCRYPTION MODE(尽管看起来很奇怪)。这意味着:

aliceCipher.init(Cipher.DECRYPT_MODE, s, new IvParameterSpec(ivBytes));

并且由于事实,解密的CBC模式不同于CBC加密模式,因此您必须实现自己的CBC模式,并且aliceCipher仅对具有正确IV的块始终使用Always。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我该如何解决“表'dbo.Foo'已经存在”。表不存在时出现错误?

来自分类Dev

如何更改DESfire卡的主密钥?什么是解密密钥?

来自分类Dev

为什么将图片居中时出现1px舍入错误,以及如何解决?

来自分类Dev

mongodb错误。我该如何解决mongoDB中的错误?

来自分类Dev

出现错误未找到模块:错误:Webpack构建时无法解析'../components/***',我该如何解决此问题?

来自分类Dev

我该如何解决错误“线程'主'在'没有当前反应堆'中惊慌'”的错误?

来自分类Dev

为什么此代码有“内联文件中的EOF”错误,我该如何解决?

来自分类Dev

代码不断出现错误“命令帮助已经是现有命令或别名”,为什么会这样,我该如何解决?

来自分类Dev

我该如何解决此错误:错误:没有光纤就不能等待吗?

来自分类Dev

我该如何解决错误:预期出现缩进块

来自分类Dev

为什么我在初始化字母时遇到错误,该如何解决?

来自分类Dev

尝试安装Windows 7时出现“找不到操作系统”错误,我该如何解决?

来自分类Dev

为什么vi明显损坏(viminfo错误E576),我该如何解决?

来自分类Dev

我的pygame游戏由于出现错误而无法启动,我该如何解决?

来自分类Dev

我该如何解决此逻辑错误?代码有什么错误?

来自分类Dev

如何更改DESfire卡的主密钥?什么是解密密钥?

来自分类Dev

更改DESFire主密钥时出现0x1E错误(INTEGRITY_ERROR),我有什么错误?该如何解决?

来自分类Dev

什么是挂起异常NullPointerException(帖子中出现完整错误),我该如何解决

来自分类Dev

DESFire卡上的信用额度文件时出现0x9E参数错误

来自分类Dev

启动Ubuntu时出现错误消息“信号超出范围92KHz-58Hz”。有什么问题,我该如何解决?

来自分类Dev

使用fgetc()时出现细分错误。我该如何解决?

来自分类Dev

我该如何解决细分错误?

来自分类Dev

为什么会出现此错误,我该如何解决?迅速

来自分类Dev

错误:尝试获取ROS Kinetic时条目1格式错误。我该如何解决?

来自分类Dev

我该如何解决该错误?[覆盖/ libgstreamer]

来自分类Dev

在 for 循环中运行 scanf 时出现逻辑错误,我该如何解决?

来自分类Dev

如何解决我尝试创建此过程时出现的错误“ERROR 102 sql state 420000”

来自分类Dev

Nginx 错误:“主脚本未知”,我该如何解决?谢谢

来自分类Dev

我的 WordPress 插件出现错误 Revolution Slider,我该如何解决?

Related 相关文章

  1. 1

    我该如何解决“表'dbo.Foo'已经存在”。表不存在时出现错误?

  2. 2

    如何更改DESfire卡的主密钥?什么是解密密钥?

  3. 3

    为什么将图片居中时出现1px舍入错误,以及如何解决?

  4. 4

    mongodb错误。我该如何解决mongoDB中的错误?

  5. 5

    出现错误未找到模块:错误:Webpack构建时无法解析'../components/***',我该如何解决此问题?

  6. 6

    我该如何解决错误“线程'主'在'没有当前反应堆'中惊慌'”的错误?

  7. 7

    为什么此代码有“内联文件中的EOF”错误,我该如何解决?

  8. 8

    代码不断出现错误“命令帮助已经是现有命令或别名”,为什么会这样,我该如何解决?

  9. 9

    我该如何解决此错误:错误:没有光纤就不能等待吗?

  10. 10

    我该如何解决错误:预期出现缩进块

  11. 11

    为什么我在初始化字母时遇到错误,该如何解决?

  12. 12

    尝试安装Windows 7时出现“找不到操作系统”错误,我该如何解决?

  13. 13

    为什么vi明显损坏(viminfo错误E576),我该如何解决?

  14. 14

    我的pygame游戏由于出现错误而无法启动,我该如何解决?

  15. 15

    我该如何解决此逻辑错误?代码有什么错误?

  16. 16

    如何更改DESfire卡的主密钥?什么是解密密钥?

  17. 17

    更改DESFire主密钥时出现0x1E错误(INTEGRITY_ERROR),我有什么错误?该如何解决?

  18. 18

    什么是挂起异常NullPointerException(帖子中出现完整错误),我该如何解决

  19. 19

    DESFire卡上的信用额度文件时出现0x9E参数错误

  20. 20

    启动Ubuntu时出现错误消息“信号超出范围92KHz-58Hz”。有什么问题,我该如何解决?

  21. 21

    使用fgetc()时出现细分错误。我该如何解决?

  22. 22

    我该如何解决细分错误?

  23. 23

    为什么会出现此错误,我该如何解决?迅速

  24. 24

    错误:尝试获取ROS Kinetic时条目1格式错误。我该如何解决?

  25. 25

    我该如何解决该错误?[覆盖/ libgstreamer]

  26. 26

    在 for 循环中运行 scanf 时出现逻辑错误,我该如何解决?

  27. 27

    如何解决我尝试创建此过程时出现的错误“ERROR 102 sql state 420000”

  28. 28

    Nginx 错误:“主脚本未知”,我该如何解决?谢谢

  29. 29

    我的 WordPress 插件出现错误 Revolution Slider,我该如何解决?

热门标签

归档