如何解决.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)
与创建新曲线相反。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。