C# .NET Core-如何使用命名曲线验证ECDSA签名

C# .NET Core-如何使用命名曲线验证ECDSA签名,c#,.net-core,ecdsa,C#,.net Core,Ecdsa,我尝试使用命名曲线secP256k1和字节数组中的公钥验证签名。我不知道如何将公钥添加到我的ECDsaCng对象中。数据的散列是SHA256散列 static byte[] publicKey = new byte[] { 0x04, 0xD3, ..., 0x20 }; public static bool VerifySignature(byte[] hash, byte[] signature) { using (ECDsaCng dsa = new ECDsaCng(E

我尝试使用命名曲线
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 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)

与创建新曲线相反。

我的解决方案如下所示:

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;
}

我知道这个例子,但我不知道如何在该上下文中使用命名曲线如果可以使用
CngKeyBlobFormat.EccFullPublicBlob
,那么曲线参数包含在关键信息中。嗯,好的。但是如何使用现有公钥和命名曲线创建
EccFullPublicBlob
-格式的密钥?曲线可能不太常见。您不需要创建新的公钥,因为您希望验证数字签名是否适合当前公钥和提供的数据哈希。密钥格式决定如何将密钥传递到
ECDsaCng
ImportSubjectPublicKeyInfo()
适用于DER编码的SPKI(或X.509)格式的公钥。你的钥匙是什么格式的?如果它是一个原始密钥,您可以创建一个
ECPoint
,并使用此
ECParameters
,它可以直接传递到
ECDsaCng.create()
@Topaco:这对我很有帮助。谢谢
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;
}