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