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

.NET Core - How to verfiy a ECDSA signature with named curve

我尝试使用命名曲线 secP256k1 和字节数组中的 public 密钥来验证签名。我不知道如何将 public 键添加到我的 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;
    }
}

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

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)

与创建新曲线相反。

我的解决方案如下所示:

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