【发布时间】:2020-10-15 07:52:51
【问题描述】:
我尝试使用命名曲线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;
}
}
我希望任何人有解决问题的想法或可以告诉我不同的方式。
【问题讨论】:
-
密钥格式决定了如何将密钥传递给
ECDsaCng。ImportSubjectPublicKeyInfo()适用于采用 DER 编码的 SPKI(或 X.509)格式的公钥。你的密钥是什么格式的?如果它是 raw 键,您可以创建一个ECPoint并使用此ECParameters可以直接传递给ECDsaCng.Create()。 -
@Topaco:这对我有帮助。非常感谢