我正在NXP J3D081卡上编写Java Card 3.0.2应用程序。我同时使用ALG_ECDSA_SHA_256签名和验证签名。 key 已由我的测试应用程序写入卡中。如果我对32个字节的数据进行签名并将签名传递回卡,则验证代码将成功验证签名。如果我使用私钥在Bouncy CaSTLe中签署了32个字节,然后传递给卡上的“验证”,则它将成功验证签名。充气城堡验证代码成功验证了从充气城堡签名例程创建的签名。

但是,如果我从Java卡中获取了返回的签名,并将其传递给C#充气城堡代码,它将无法验证签名。我已经检查了所有输入值,它们是正确的。我的代码在这里(请注意,我将公共(public) key 作为64个字节传递,并以0x04开头)

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));
}

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

我的头发现在似乎比两天前少了。任何指针都将受到欢迎。

最佳答案

除了执行调试操作外,还可以检查以下内容:-

  • 使用一些在线可用工具来验证签名。不要忘记使用从javacard生成的相同曲线参数和公钥。
  • 使用充气城堡Java库验证相同。我在其中一种工具中执行了相同的步骤,并且已成功匹配。
  • 10-04 15:19
    查看更多