C# 验证Java卡签名

C# 验证Java卡签名,c#,javacard,signing,elliptic-curve,C#,Javacard,Signing,Elliptic Curve,我正在NXP J3D081卡上编写Java卡3.0.2应用程序。我使用ALG_ECDSA_SHA_256对签名进行签名和验证。我的测试应用程序已将密钥写入卡中。如果我对32字节的数据进行签名并将签名传递回卡,验证代码将成功验证签名。如果我在Bouncy Castle中使用私钥对32个字节进行签名,并将其传递给卡上的验证,它将成功验证签名。bouncy castle验证代码成功验证从bouncy castle签名例程创建的签名 但是如果我从Java卡中获取返回的签名并将其传递给C#bouncy c

我正在NXP J3D081卡上编写Java卡3.0.2应用程序。我使用ALG_ECDSA_SHA_256对签名进行签名和验证。我的测试应用程序已将密钥写入卡中。如果我对32字节的数据进行签名并将签名传递回卡,验证代码将成功验证签名。如果我在Bouncy Castle中使用私钥对32个字节进行签名,并将其传递给卡上的验证,它将成功验证签名。bouncy castle验证代码成功验证从bouncy castle签名例程创建的签名

但是如果我从Java卡中获取返回的签名并将其传递给C#bouncy castle代码,它将无法验证签名。我已经检查了所有的输入值,它们是正确的。我的代码在这里(注意,我将公钥作为64字节传递,并在它们前面加上0x04)

我应该注意的是,这些参数指定了p-256曲线,并成功地用于与卡的加密通信。已成功创建公钥


我现在的头发似乎比两天前少了。欢迎使用任何指针。

除了调试该程序所执行的步骤外,您还可以检查以下内容:-

  • 使用一些在线可用工具验证签名。不要忘记使用从javacard生成的相同曲线参数和公钥
  • 使用bouncy castle java库验证相同的情况。我在我的一个工具中执行了相同的步骤,并且匹配成功

  • 你能发布测试数据吗?你检查过要求的格式了吗?签名可以是普通(值r和s串联)或x692格式(额外的asn1标记序列和整数)。请看,您是否可以发布一个从Bouncy和卡中获得的十六进制签名示例?这可能与签名的格式有关,而不是与签名的值有关(DER编码与否,或者可能编码不正确)。
    public bool HashAndVerifyDSA(byte[] pb, byte[] inData, byte[] sig)
    {
        byte[] pub = new byte[65];
        pub[0] = 0x4;
        Array.Copy(pb, 0, pub, 1, 64);
        ECCurve curve = parameters.Curve;
        ECPoint q = curve.DecodePoint(pub);
        ICipherParameters Public = new ECPublicKeyParameters(algorithm, q, parameters);
        ISigner bSigner = SignerUtilities.GetSigner("SHA-256withECDSA");
    
        bSigner.Init(false, Public);
        bSigner.BlockUpdate(inData, 0, inData.Length);
        return (bSigner.VerifySignature(sig));
    }