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