首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"Visa2“密钥多样化在Gemalto卡和GPP工具中是如何工作的?

"Visa2“密钥多样化在Gemalto卡和GPP工具中是如何工作的?
EN

Stack Overflow用户
提问于 2016-06-19 12:05:34
回答 2查看 1.9K关注 0票数 1

我有一堆Gemalto卡,如下所示,我可以使用GlobalPlatformPro进行相互身份验证。

代码语言:javascript
复制
C:\globalPlatformPro> gp -visa2 -key 47454d5850524553534f53414d504c45 -list -debug -verbose -info

Reader: ACS ACR1281 1S Dual Reader ICC 0
ATR: 3B7D96000080318065B0831111E583009000

A>> 00A40400 00
A<< 6F198408A000000018434D00A50D9F6E061291921101009F6501FF 9000

***** Card info:
A>> 80CA9F7F 00
A<< 9F7F2A4090612812919211010041849D08192420C3033241840333418403344184000003250000000000000000 9000

***** KEY INFO
A>> 80CA00E0 00
A<< E012C00401FF8010C00402FF8010C00403FF8010 9000
VER:255 ID:1 TYPE:DES3 LEN:16
VER:255 ID:2 TYPE:DES3 LEN:16
VER:255 ID:3 TYPE:DES3 LEN:16
Key version suggests factory keys

A>> 80500000 08 2CA286A611F6CAFD 00
A<< 4D0041849D08192420C3FF0131D644E9913234DDE1F0A6A462C71805 9000
A>> 84820100 10 CC2D0CC35F6BD64F816A774D3ADB18F2
A<< 9000

//Useless lines for censored!

C:\globalPlatformPro>

由于没有公开的签证文档,我查看了GlobalPlatformPro源代码,以了解visa2的关键多样化是如何发生的,我在这里发现了以下方法:

代码语言:javascript
复制
public static GPKeySet diversify(GPKeySet keys, byte[] diversification_data, Diversification mode, int scp) throws GPException {
    try {
        GPKeySet result = new GPKeySet();
        Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");
        for (KeyType v : KeyType.values()) {
            if (v == KeyType.RMAC)
                continue;
            byte [] kv = null;
            // shift around and fill initialize update data as required.
            if (mode == Diversification.VISA2) {
                kv = fillVisa(diversification_data, v);
            } else if (mode == Diversification.EMV) {
                kv = fillEmv(diversification_data, v);
            }

            // Encrypt with current master key
            cipher.init(Cipher.ENCRYPT_MODE, keys.getKey(v).getKey(Type.DES3));

            byte [] keybytes = cipher.doFinal(kv);
            // Replace the key, possibly changing type. G&D SCE 6.0 uses EMV 3DES and resulting keys
            // must be interpreted as AES-128
            GPKey nk = new GPKey(keybytes, scp == 3 ? Type.AES : Type.DES3);
            result.setKey(v, nk);
        }
        return result;
    } catch (BadPaddingException |InvalidKeyException | IllegalBlockSizeException e) {
        throw new GPException("Diversification failed.", e);
    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
        throw new RuntimeException("Diversification failed.", e);
    }
}

public static byte[] fillVisa(byte[] init_update_response, KeyType key) {
    byte[] data = new byte[16];
    System.arraycopy(init_update_response, 0, data, 0, 2);
    System.arraycopy(init_update_response, 4, data, 2, 4);
    data[6] = (byte) 0xF0;
    data[7] = key.getValue();
    System.arraycopy(init_update_response, 0, data, 8, 2);
    System.arraycopy(init_update_response, 4, data, 10, 4);
    data[14] = (byte) 0x0F;
    data[15] = key.getValue();
    return data;
}

因此,我试图重复上面的通信主机密码生成。我有:

主键= 47454d5850524553534f53414d504c45

基于GlobalPlatform v2.3卡规范

Host_Challenge = 2CA286A611F6CAFD

初始更新响应:4D0041849D08192420C3 FF01 31D644E9913234DD E1F0A6A462C71805

  • 关键多样化数据= 4D0041849D08192420C3
  • Key = FF01:因此使用SCP01
  • 卡挑战= 31D644E9913234DD
  • 卡片密码= E1F0A6A462C71805

因此,基于上面的GPP源代码:

  • Diversification_Data = 4D00 9D081924 F001 4D00 9D081924 0F01

然后静态ENC键是:

代码语言:javascript
复制
Static_ENC = Encrypt(MasterKey, Diversification_Data )

所以,使用这个在线工具,我有:

它的意思是:

84f2a84ecdade8cacc9e7e07faebe4e6 Static_ENC_KEY =

为了计算ENC会话密钥,我再次使用了GlobalPlatform规范:

所以我有:

  • Derivation_Data = 913234DD 2CA286A6 31D644E9 11F6CAFD

因此,ENC_Session_Key是:

b1ed5ea3f69978274d2ffe0de467ec1c ENC_Session_Key =

最后,通过将8字节卡挑战和8字节主机质询连接在一起,生成16字节块并将该16字节数组与80 00 00 00 00 00 00 00连接起来,从而实现主机密码的生成和验证。然后用CBC模式下的ENC会话密钥与零ICV进行签名:

Data2Encrypt = 31D644E9913234DD 2CA286A611F6CAFD 8000000000000000

我有:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-19 12:05:34

好吧,我尝试了两次以上步骤,每次,最后我都遇到了一个错误的host_cryptogram值!但是,当我重复这些步骤并在我的问题中逐行写下这些步骤时,我终于注意到,我的最终结果与我问题的第一个GPP结果相等!所以我不想删除我的问题,我宁愿把它留给未来的观众。

因此得出结论:

拥有智能卡中的密钥多样化方案,在GlobalPlatform卡规范中提到的计算卡密码和MAC值的步骤中增加一个步骤。这个步骤是计算静态键。

用于静态密钥计算的Diversification_Data是(来源):

初始更新响应数据的前两个字节是相同的xxh xxh,其中的字节4:8是IC Serial Number

使用三DES算法加密多样化数据,在ECB模式下使用主密钥加密,返回静态密钥。

票数 2
EN

Stack Overflow用户

发布于 2021-04-26 08:29:39

要检查卡密码,您必须连接主机质询的8字节和卡挑战的8字节和"8000000000000000“。在生成字符串之后,使用CBC模式下的ENC会话密钥与零ICV进行签名。

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

https://stackoverflow.com/questions/37907039

复制
相关文章

相似问题

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