Вы утверждаете, что содержимое base64, входящее в key1
, предназначено для brainpoolP256r1.
При декодировании значения мы видим, что это полезная нагрузка в 65 байтов, начинающаяся с 04
, которая выглядит как несжатая точкакодирование для кривой с 256-битным простым числом.Пока все хорошо.
Вы даже правильно использовали BCRYPT_ECDH_PUBLIC_GENERIC_MAGIC, но вы не можете импортировать «универсальный именованный ключевой блоб», не указав свойство импорта, которое сообщает ему, какая кривая.
Самый простой способ загрузить ключ из этой точки - это
byte[] keyX = new byte[key1.Length / 2];
byte[] keyY = new byte[keyX.Length];
Buffer.BlockCopy(key1, 1, keyX, 0, keyX.Length);
Buffer.BlockCopy(key1, 1 + keyX.Length, keyY, 0, keyY.Length);
ECParameters parameters = new ECParameters
{
Curve = ECCurve.NamedCurves.brainpoolP256r1,
Q =
{
X = keyX,
Y = keyY,
},
};
byte[] derivedKey;
using (ECDiffieHellman bob = ECDiffieHellman.Create(parameters))
using (ECDiffieHellmanPublicKey bobPublic = bob.PublicKey)
{
derivedKey = alice.DeriveKeyFromHash(bobPublic, HashAlgorithmName.SHA256);
}
. Я пошел дальше и расширил метод DeriveKeyMaterial
до значения, которое он по умолчанию означает с помощью ECDiffieHellmanCng, поскольку другие типы ECDH этого не делают.поддерживать этот метод (из-за его низкой специфичности поведения).