编程语言
首页 > 编程语言> > c# – 验证Java Card签名

c# – 验证Java Card签名

作者:互联网

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

但是,如果我从Java卡中取回返回的签名并将其传递给C#bouncy城​​堡代码,则FAILS将验证签名.我检查了所有输入值,它们是正确的.我的代码在这里(注意我将公钥作为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生成的相同曲线参数和公钥.
>使用bouncy castle java library验证相同.我在其中一个工具中执行了相同的步骤,并且成功匹配.

标签:c,signing,javacard,elliptic-curve
来源: https://codeday.me/bug/20190710/1426157.html