c# - 验证 Java Card 签名

标签 c# javacard signing elliptic-curve

我正在 NXP J3D081 卡上编写 Java Card 3.0.2 应用程序。我使用 ALG_ECDSA_SHA_256 对签名进行签名和验证。我的测试应用程序已将 key 写入卡中。如果我签署 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 曲线,并成功地用于与卡的加密通信。公钥创建成功。

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

最佳答案

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

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

关于c# - 验证 Java Card 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48525430/

相关文章:

java - 在 Java Card 上将 byte[] 转换为 short[] 的快速方法

powershell - 如何在 PowerShell 中使用 S/MIME 对消息进行签名和加密

c# - 当强命名程序集时: Which key to pick keypair or public key?

c# - C# 安装应用程序中的 Google OAuth 2.0 身份验证

c# - 运行计时器函数时,函数 'Function1' 的监听器无法启动

javacard - 能否跨安全域访问 Java Card 可共享接口(interface)?

java - 找不到taskdef类com.sun.javacard.ant.tasks.ConverterTask

c# - 如何获取在按钮按下事件期间创建的信息以显示在我的 html 页面上?

来自通用抽象类的 C# 线程静态字段

android - Xamarin,Android - 应用程序未安装签名 APK 错误