#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(ECCurve.CreateFromFriendlyName("secP256k1")))
{
// How to add the public key?
bool result = dsa.VerifyHash(hash, signature);
return resu<
}
}
Я пытался использовать 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 resu<
}
}
Я надеюсь, что у кого-нибудь есть идея решить проблему или показать мне другой способ.
Комментарии:
1. Формат ключа определяет, как передается ключ
ECDsaCng
.ImportSubjectPublicKeyInfo()
применяется к открытому ключу в формате SPKI (или X.509), который закодирован DER. Какой формат имеет ваш ключ? Если это необработанный ключ, вы можете создатьECPoint
и с этимECParameters
, который может быть передан напрямуюECDsaCng.Create()
.2. @Topaco: Это помогло мне. Большое спасибо
Ответ №1:
Мое решение выглядит так:
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 resu<
}
Ответ №2:
В примерах на 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)
в отличие от создания новой кривой.
Комментарии:
1. Я знаю пример, но я понятия не имею, как использовать именованную кривую в этом контексте
2. Если вы можете использовать
CngKeyBlobFormat.EccFullPublicBlob
, то параметры кривой включаются в ключевую информацию.3. Хм, хорошо. Но как я могу создать ключ в
EccFullPublicBlob
формате an с моим существующим открытым ключом и именованной кривой? Кривая, вероятно, не так распространена.4. Вам не нужно создавать новый открытый ключ, поскольку вы хотите убедиться, что цифровая подпись соответствует текущему открытому ключу и предоставленному хэшу данных.