问题描述
我尝试验证带有命名曲线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)
与创建新曲线相反。