【发布时间】: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