应用程序密码生成和验证失败

时间:2018-01-22 08:33:15

标签: apdu emv mastercard

我正在开发万事达卡交易处理应用,但仍处于开发阶段。为了能够测试我的密码验证应用程序,我使用MChip对卡片进行了个性化,其中包含以下个人资料信息:

  • MChip Jcop
  • app version 1.0
  • 个人资料修订版1.0.11
  • 需要通用操作系统。

在阅读了Unable to Generate correct application CryptogramGenerating Cryptogram Manually这些问题的贡献后,我尝试检查我的卡的密码版本号,但我的个性化数据中没有标记0x9F10,并且没有我可以在个性化之前添加此标记。我在Thales HSM上尝试了各种密码生成组合,但非返回的值与卡返回的值相同。

在开发阶段可以访问开发密钥,我已经检查过以确保密钥是好的,为密码生成传递相同的数据,在这个阶段我完全不知道该怎么做。我将非常感谢我能在这个问题上得到任何帮助。感谢

foreach (var tagLen in EMVTag.ParseDOL(crmDolstr))
    {                                    
        requestData.Append(EMVData[tagLen.Split(',')[0]]);
        dolData.AppendFormat("{0}|{1},", tagLen.Split(',')[0], 
            EMVData[tagLen.Split(',')[0]]);
    }
string commandStr = string.Format("80 AE 8000 {0} {1} 00", 
    GetHexLen(requestData.ToString()), requestData.ToString());
byte[] hexData = Helpers.HexStringToBytes(commandStr);
apdu = new APDUCommand(hexData);

public APDUCommand(byte[] apdu)
    {
        if (apdu.Length < 5)
            throw new Exception("Wrong APDU length.");

        this.cla = apdu[OFFSET_CLA];
        this.ins = apdu[OFFSET_INS];
        this.p1 = apdu[OFFSET_P1];
        this.p2 = apdu[OFFSET_P2];
        this.lc = apdu[OFFSET_LC];
        if (this.lc == apdu.Length - 5)
            this.le = (byte) 0;
        else if (this.lc == apdu.Length - 5 - 1)
            this.le = apdu[apdu.Length - 1];
        else
            throw new Exception("Wrong LC value.");
        this.data = new byte[this.lc];
        System.Array.Copy(apdu, OFFSET_CDATA, this.data, 0, 
            this.data.Length);
}

1 个答案:

答案 0 :(得分:1)

您使用的数据(来自CDOL)不足以生成密码。密码通常包括AIP,ATC和CVR。 请查看IAD的密码生成响应,因为它通常还包含在密码生成过程中使用的动态生成的CVR。