【问题标题】:Verify Java Card signature验证 Java Card 签名
【发布时间】:2018-07-09 13:48:21
【问题描述】:

我正在 NXP J3D081 卡上编写 Java Card 3.0.2 应用程序。我使用 ALG_ECDSA_SHA_256 来签名和验证签名。我的测试应用程序已将密钥写入卡中。如果我签署 32 个字节的数据并将签名传回卡,则验证码成功验证了签名。如果我使用私钥在 Bouncy Castle 中签名 32 个字节并传递给卡上的验证,它会成功验证签名。充气城堡验证码成功验证了从充气城堡签名例程创建的签名。

但是,如果我从 Java Card 中获取返回的签名并将其传递给 C# bouncy castle 代码,则它无法验证签名。我检查了所有输入值,它们是正确的。我的代码在这里(注意我将公钥作为 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 曲线,并成功用于与卡的加密通信。公钥创建成功。

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

【问题讨论】:

  • 你能发布测试数据吗?你检查了所需的格式吗?签名可以是普通的(值 r 和 s 连接)或 x692 格式(附加 asn1 标签序列和整数)
  • 您能否发布一个从 Bouncy 和卡片获得的十六进制签名示例?这可能与签名的格式而不是签名的值有关(DER 编码与否,或者可能编码不正确)。

标签: c# javacard signing elliptic-curve


【解决方案1】:

除了您为调试事物而执行的步骤外,您还可以检查以下内容:-

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2018-09-18
    相关资源
    最近更新 更多