【问题标题】:.NET Core - How to verfiy a ECDSA signature with named curve.NET Core - 如何使用命名曲线验证 ECDSA 签名
【发布时间】:2020-10-15 07:52:51
【问题描述】:

我尝试使用命名曲线secP256k1 和字节数组中的公钥来验证签名。我不知道如何将公钥添加到我的 ECDsaCng 对象。数据的哈希是 SHA256 哈希。

static byte[] publicKey = new byte[] {
    0x04, 0xD3, ..., 0x20
};

public static bool VerifySignature(byte[] hash, byte[] signature)
{
    using (ECDsaCng dsa = new ECDsaCng(ECCurve.CreateFromFriendlyName("secP256k1")))
    {
        // How to add the public key?

        bool result = dsa.VerifyHash(hash, signature);

        return result;
    }
}

我尝试使用ImportSubjectPublicKeyInfo,但出现异常“ASN1 损坏的数据”

public static bool VerifySignature(byte[] hash, byte[] signature)
{
    using (ECDsaCng dsa = new ECDsaCng(ECCurve.CreateFromFriendlyName("secP256k1")))
    {
        int bytesRead;

        dsa.ImportSubjectPublicKeyInfo(publicKey, out bytesRead);

        bool result = dsa.VerifyHash(hash, signature);

        return result;
    }
}

我希望任何人有解决问题的想法或可以告诉我不同​​的方式。

【问题讨论】:

  • 密钥格式决定了如何将密钥传递给ECDsaCngImportSubjectPublicKeyInfo() 适用于采用 DER 编码的 SPKI(或 X.509)格式的公钥。你的密钥是什么格式的?如果它是 raw 键,您可以创建一个 ECPoint 并使用此 ECParameters 可以直接传递给 ECDsaCng.Create()
  • @Topaco:这对我有帮助。非常感谢

标签: c# .net-core ecdsa


【解决方案1】:

我的解决方案如下所示:

public static bool VerifySignature(byte[] hash, byte[] signature)
{
    var dsa = ECDsa.Create(new ECParameters
    {
        Curve = ECCurve.CreateFromFriendlyName("secP256k1"),
        Q =
        {
            X = publicKey.Take(32).ToArray(),
            Y = publicKey.Skip(32).ToArray()
        }
    });

    bool result = dsa.VerifyHash(hash, signature);

    return result;
}

【讨论】:

    【解决方案2】:

    ECDsaCng 的示例中,他们有接收者/您的验证

    public class Bob
    {
        public byte[] key;
    
        public void Receive(byte[] data, byte[] signature)
        {
            using (ECDsaCng ecsdKey = new ECDsaCng(CngKey.Import(key, CngKeyBlobFormat.EccPublicBlob)))
            {
                if (ecsdKey.VerifyData(data, signature))
                    Console.WriteLine("Data is good");
                else
                    Console.WriteLine("Data is bad");
            }
        }
    } 
    

    我的假设是您的“dsa”可以通过其他重载来实例化

    CngKey.Import(publicKey, CngKeyBlobFormat.EccPublicBlob)
    

    而不是创建一条新曲线。

    【讨论】:

    • 我知道这个例子,但我不知道如何在那个上下文中使用命名曲线
    • 如果可以使用CngKeyBlobFormat.EccFullPublicBlob,则曲线参数包含在关键信息中。
    • 嗯好的。但是如何使用我现有的公钥和命名曲线创建 EccFullPublicBlob 格式的密钥?曲线可能不那么常见。
    • 您不需要制作新的公钥,因为您要验证数字签名是否适合当前公钥和提供的数据哈希。
    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2018-01-17
    相关资源
    最近更新 更多