首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用ICV加密计算SCP02 (安全信道协议02)中的单DES +最终三重DES (Retail- MAC)?

如何用ICV加密计算SCP02 (安全信道协议02)中的单DES +最终三重DES (Retail- MAC)?
EN

Stack Overflow用户
提问于 2019-03-15 09:30:56
回答 2查看 1.7K关注 0票数 1

我见过很多人在C-MAC代(零售MAC)上寻求帮助.这个问题也包含了答案。这会让你有足够的时间。我已经用真卡测试了这个功能,它运行得很好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-15 09:30:56

注:

  1. 如果愿意的话,可以提高功能的效率。
  2. 如果你发现任何改进,请建议。
  3. 在开始使用SCP 02进行Ext_Atuh通信之前,请检查SCP i值。
    1. 此函数支持下一个命令的ICV加密。

公共静态byte[] generateCmac(字节[]apdu,byte[]sMacSessionKey,byte[]icv)抛出异常{

代码语言:javascript
复制
    if(sMacSessionKey.length == 16) {
    byte []temp  = sMacSessionKey.clone();
    sMacSessionKey = new byte[24];
    System.arraycopy(temp,0,sMacSessionKey,0,temp.length);
    System.arraycopy(temp,0,sMacSessionKey,16,8);
    }

    byte []cMac = new byte[8];
    byte []padding = {(byte)0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};
    int paddingRequired  = 8 - (apdu.length) %8;
    byte[] data = new byte[apdu.length + paddingRequired];
    System.arraycopy(apdu, 0, data, 0, apdu.length);
    System.arraycopy(padding, 0, data, apdu.length,paddingRequired);

            Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding");

            Cipher singleDesCipher = Cipher.getInstance("DES/CBC/NoPadding",
                "SunJCE");
            SecretKeySpec desSingleKey = new SecretKeySpec(sMacSessionKey, 0, 8,
                "DES");
            SecretKey secretKey = new SecretKeySpec(sMacSessionKey, "DESede");
            // Calculate the first n - 1 block. For this case, n = 1
            IvParameterSpec ivSpec = new IvParameterSpec(icv);
            singleDesCipher.init(Cipher.ENCRYPT_MODE, desSingleKey, ivSpec);
            // byte ivForLastBlock[] = singleDesCipher.doFinal(data, 0, 8);

            int blocks = data.length / 8;

            for (int i = 0; i < blocks - 1; i++) {
                singleDesCipher.init(Cipher.ENCRYPT_MODE, desSingleKey, ivSpec);
                byte[] block = singleDesCipher.doFinal(data, i * 8, 8);
                ivSpec = new IvParameterSpec(block);
            }

            int offset = (blocks - 1) * 8;

            cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
            cMac = cipher.doFinal(data, offset, 8);

            ivSpec = new IvParameterSpec(new byte[8]);

            singleDesCipher.init(Cipher.ENCRYPT_MODE, desSingleKey, ivSpec);
            icvNextCommand = singleDesCipher.doFinal(cMac);
            System.out.println("icvNextCommand"+Utility.bytesToHex(icvNextCommand, icvNextCommand.length));

            return cMac;

    }
票数 1
EN

Stack Overflow用户

发布于 2019-04-14 23:15:49

一种更简单的方法是使用Signature.ALG_DES_MAC8_ISO9797_1_M2_ALG3 (如果卡支持的话)来计算SCP02中C的零售MAC值。

注意:CMAC是一个消息身份验证代码,根本不在SCP02中使用。

PC端的EDIT>考虑来自弹跳城堡ISO9797Alg3Mac

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55179415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档