大约两年前,我用 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
如果我没记错的话,补丁会执行以下操作:
您可以考虑使用另一种工具(GlobalPlatformPro?),但我不确定它是否支持 PUT KEY 的密钥多样化(从未尝试过)。
祝你好运!
编辑>关于阻止我的卡以进行进一步开发部分
此方法(可能)更改 ISD 密钥,在大多数情况下(即当没有其他 SD 时)保护对卡管理的访问
我敢打赌,你的卡最初有一个众所周知的 javacard 默认密钥——通过将这些默认密钥更改为其他一些强值,你可以防止攻击者知道这些默认密钥对你的卡进行身份验证(强调强意味着你应该避免使用像0102030405..
)这样的键
更改密钥实际上并不会阻止知道新密钥的实体管理卡片内容——使用密钥您可以随意管理卡片。这个想法是您是唯一可以访问密钥的人
GPSystem.getSecureChannel()
如果您的小程序使用它,更改 (I)SD 密钥会更改所使用的密钥
在保留加载的小程序功能的同时阻止卡进行进一步管理的唯一方法(我知道)是通过大约 10 次未成功尝试身份验证来阻止 (I)SD 访问——因为大多数卡确实阻止访问 ( I)SD 在这种情况下(您的里程可能会有所不同)。我不会推荐这种方式。