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

我希望任何人都有解决问题的想法,或者可以向我展示不同的方式。

解决方法

我的解决方案如下:

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

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)

与创建新曲线相反。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...