.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(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. Вам не нужно создавать новый открытый ключ, поскольку вы хотите убедиться, что цифровая подпись соответствует текущему открытому ключу и предоставленному хэшу данных.