2

我想阻止我的卡以进行进一步的开发。有谁知道如何用 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.)
4

1 回答 1

0

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

也许这已在上游修复 - 您可能要考虑尝试最新的 svn 版本(更新:有人告诉我问题现在已修复)。

那时我对 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....0000KEK 触发)。


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

祝你好运!


编辑>关于阻止我的卡以进行进一步开发部分

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

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

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

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

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

于 2015-12-08T23:54:10.307 回答