Я должен заключить соглашение Диффи-Хеллмана с третьей стороной, которая сообщает открытые ключи в формате .NET ECDiffieHellmanCng XmlString.Я не могу изменить их код.То, что они отправляют, выглядит следующим образом:
<ECDHKeyValue xmlns="http://www.w3.org/2001/04/xmldsig-more#">
<DomainParameters>
<NamedCurve URN="urn:oid:1.3.132.0.35" />
</DomainParameters>
<PublicKey>
<X Value="11" xsi:type="PrimeFieldElemType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
<Y Value="17" xsi:type="PrimeFieldElemType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</PublicKey>
</ECDHKeyValue>
Они генерируют это, используя типичный код .NET Framework, подобный следующему:
using (ECDiffieHellmanCng dhKey = new ECDiffieHellmanCng())
{
dhKey.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
dhKey.HashAlgorithm = CngAlgorithm.Sha256;
Console.WriteLine(dhKey.PublicKey.ToXmlString());
}
Они ожидают получить мой открытый ключ в том же формате.Они используют мой открытый ключ следующим образом:
ECDiffieHellmanCngPublicKey pbkey = ECDiffieHellmanCngPublicKey.FromXmlString(xmlHere);
Я работаю в .NET core 2.1.К сожалению, классы ECDiffieHellmanCng и тому подобное в настоящее время не реализованы в ядре .NET.Я подумал, что мог бы использовать пакет BouncyCastle для .NET Core для этого: https://www.nuget.org/packages/BouncyCastle.NetCore/ Я бы предположил, что они оба реализуют один и тот же стандарт, и они будут совместимы.
Я знаю, как полностью выполнить соглашениеоднако с помощью надувного замка мне не ясно, как это сделать, начиная со значений X и Y в xml, которые выводятся из .NET ECDiffieHellmanCng, и как убедиться, что я использую совместимые параметры.Мне также не ясно, как я получаю значения X и Y из открытого ключа надувного замка, который я генерирую, чтобы отправить их обратно.Не помогает то, что оживленный замок для .net api не совсем совпадает с java api, а документация ограничена.
Обновление 1: после прочтения некоторых комментариев ниже, действительно кажется, что ECDiffieHellmanCngчастично реализовано в .NET Core.Большая часть логики работает, но не работают только ToXmlString и FromXmlString.Это нормально, я могу обойти это.Однако сейчас я сталкиваюсь с другой проблемой.Кривая, используемая другой стороной, представляет собой oid: 1.3.132.0.35.Однако, когда я пытаюсь использовать это в ядре .NET, даже с базовым примером, подобным этому:
using (ECDiffieHellman dhBob = ECDiffieHellman.Create(ECCurve.CreateFromValue("1.3.132.0.35")))
{
using (ECDiffieHellman dhAlice = ECDiffieHellman.Create(ECCurve.CreateFromValue("1.3.132.0.35")))
{
byte[] b = dhAlice.DeriveKeyMaterial(dhBob.PublicKey);
byte[] b2 = dhBob.DeriveKeyMaterial(dhAlice.PublicKey);
Console.WriteLine(b.SequenceEqual(b2));
}
}
Тогда я получаю эту ошибку:
Unhandled Exception: System.PlatformNotSupportedException: The specified curve 'ECDSA_P521' or its parameters are not valid for this platform. ---> Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: The parameter is incorrect
at System.Security.Cryptography.CngKeyLite.SetProperty(SafeNCryptHandle ncryptHandle, String propertyName, Byte[] value)
at System.Security.Cryptography.CngKeyLite.SetCurveName(SafeNCryptHandle keyHandle, String curveName)
at System.Security.Cryptography.CngKeyLite.GenerateNewExportableKey(String algorithm, String curveName)
at System.Security.Cryptography.ECCngKey.GenerateKey(ECCurve curve)
--- End of inner exception stack trace ---
at System.Security.Cryptography.ECCngKey.GenerateKey(ECCurve curve)
at System.Security.Cryptography.ECDiffieHellman.Create(ECCurve curve)
at TestCore.Program.Main(String[] args)
Сообщение об ошибке не ясномне.Эта кривая действительно не поддерживается?Или что-то не так в параметрах, но тогда что именно?Меня удивило бы, если кривая не поддерживается, потому что кривая nistP521 поддерживается и согласно этому документу IBM, который я нашел в Интернете, они одинаковы: https://www.ibm.com/support/knowledgecenter/en/linuxonibm/com.ibm.linux.z.wskc.doc/wskc_r_ecckt.html