.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;
}
我尝试使用命名曲线 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;
}