【问题标题】:change GP-Key on JavaCard更改 JavaCard 上的 GP-Key
【发布时间】:2016-04-15 18:43:42
【问题描述】:

我想冻结我的卡 为进一步发展。 有谁知道该怎么做 用 GPSShell 吗? 我找到了这个命令:

open_sc -security 3 -keyind 0 -keyver 0 -key "currentKey" -keyDerivation visa2 // Open secure channel
put_sc_key -keyver 0 -newkeyver 0 -mac_key "newKey" -enc_key "newKey" -kek_key "newKey"-current_kek "currentKey"

但出现此错误:

put_secure_channel_keys() returns 0x80206A80 (6A80: Wrong data / Incorrect values in command data.)

我也试过了:

put_sc_key -keyver 1 -newkeyver 1 -key "newKey" -keyDerivation visa2

但出现此错误:

put_secure_channel_keys() returns 0x80206A88 (6A88: Referenced data not found.)

【问题讨论】:

    标签: javacard globalplatform


    【解决方案1】:

    大约两年前,我用 GPShell 和 Gemalto 卡处理了同样的问题(不太确定我是否得到 0x6A80,但可能是的)——如果我没记错的话,GPShell 对新密钥使用了错误的多样化数据和(更糟糕的是)使用-keyDerivation 选项的put_sc_key 命令的KEK 错误。

    也许这已在上游修复 - 您可能需要考虑尝试最新的 svn 版本(更新:I was told that the problem is fixed now)。

    那次我对 svn 修订版 419 使用了以下丑陋的修改:

    --- globalplatform/src/globalplatform.c (revision 419)
    +++ globalplatform/src/globalplatform.c (working copy)
    @@ -61,6 +61,10 @@
     #ifndef MAX_PATH
     #define MAX_PATH 257
     #endif
    +
    +static BYTE savedKEK[16];
    +
    +
    
     static BYTE C_MACDerivationConstant[2] = {0x01, 0x01}; //!< Constant for C-MAC session key calculation.
     static BYTE ENCDerivationConstant[2] = {0x01, 0x82};//!< Constant for encryption session key calculation.
    @@ -3309,6 +3313,15 @@
            OPGP_LOG_START(_T("VISA2_derive_keys"));
    
            OPGP_LOG_HEX(_T("VISA2_derive_keys: Base Key Diversification Data: "), baseKeyDiversificationData, 10);
    +       static BYTE savedBaseKeyDiversificationData[10];
    +       if(memcmp(baseKeyDiversificationData, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 10)==0) {
    +           // In trouble -> patch
    +           memcpy(baseKeyDiversificationData, savedBaseKeyDiversificationData, 10);
    +       } else {
    +           memcpy(savedBaseKeyDiversificationData, baseKeyDiversificationData, 10);
    +       }
    +
    +       OPGP_LOG_HEX(_T("VISA2_derive_keys: Base Key Diversification Data2: "), baseKeyDiversificationData, 10);
    
            /* Key Diversification data VISA 2
            KDCAUTH/ENC xxh xxh || IC serial number || F0h 01h ||xxh xxh || IC serial number
    @@ -3971,6 +3984,9 @@
    
            OPGP_LOG_MSG(_T("mutual_authentication: S-MAC Session Key: "), secInfo->C_MACSessionKey, 16);
    
    +       if (secInfo->secureChannelProtocol == GP211_SCP01) {
    +               memcpy(savedKEK, secInfo->dataEncryptionSessionKey, 16);
    +       }
     #ifdef OPGP_DEBUG
            if (secInfo->secureChannelProtocol == GP211_SCP01) {
                    OPGP_LOG_HEX(_T("mutual_authentication: Data Encryption Key: "), secInfo->dataEncryptionSessionKey, 16);
    @@ -4513,6 +4529,12 @@
            OPGP_ERROR_STATUS status;
            GP211_SECURITY_INFO gp211secInfo;
            mapOP201ToGP211SecurityInfo(*secInfo, &gp211secInfo);
    +
    +       if(memcmp(KEK, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 10)==0) {
    +           // In trouble -> patch
    +           memcpy(KEK, savedKEK, 16);
    +       }
    +
            memcpy(gp211secInfo.dataEncryptionSessionKey, KEK, 16);
            status = put_secure_channel_keys(cardContext, cardInfo, &gp211secInfo, keySetVersion, newKeySetVersion,
                    NULL, new_encKey, new_macKey, new_KEK);
    

    这个脚本对我有用:

    mode_201
    ....skipped...
    open_sc -security 3 -keyind 0 -keyver 0 -key <motherKey> -keyDerivation visa2
    put_sc_key -scp 1 -keyver 1 -newkeyver 1 -key <newMotherKey> -keyDerivation visa2 -current_kek 00000000000000000000000000000000
    

    如果我没记错的话,补丁会执行以下操作:

    • 在第一次身份验证期间保存密钥多样化数据(即open_sc),然后在为put_sc_key 多样化新密钥时使用它们。

    • 在第一次身份验证期间保存派生的 KEK,然后将其用作 KEK 用于新的密钥值加密(这通过使用 0000....0000 KEK 触发)。


    您可以考虑使用其他工具(GlobalPlatformPro?),但我不确定它是否支持 PUT KEY 的密钥多样化(从未尝试过)。

    祝你好运!


    EDIT>关于阻止我的卡以供进一步开发部分

    此方法(可能)更改 ISD 密钥,在大多数情况下(即没有其他 SD 时)保护对卡管理的访问

    • 我敢打赌,您的卡最初有一个众所周知的 javacard 默认密钥 - 通过将这些默认密钥更改为其他一些 strong 值,您可以防止攻击者知道这些默认密钥从验证到您的卡的密钥(强调强意味着您应该避免使用像 0102030405.. 这样的密钥)

    • 更改密钥实际上并不会阻止实体知道新密钥管理卡片内容——使用密钥您可以随意管理卡片。这个想法是您是唯一可以访问密钥的人

    • 更改 (I)SD 密钥会更改 GPSystem.getSecureChannel() 使用的密钥(如果您的小程序使用它)

    在保留加载的小程序功能的同时阻止卡进行进一步管理的唯一方法(我知道)是通过大约 10 次不成功的身份验证来阻止 (I)SD 访问——因为大多数卡确实阻止访问在这种情况下(您的里程可能会有所不同)。我不推荐这种方式。

    【讨论】:

    • 为了进一步开发,他想封杀卡,那么,他为什么不简单地更改认证密钥呢?
    • @Abraham 我了解 OP 尝试使用 GPShell 更改身份验证密钥,但没有成功。我敢打赌,使用的 KEK/DEK 是错误的(因为 GPShell 错误)并且 KCV 不匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    相关资源
    最近更新 更多