У меня есть следующий код:
var curve = ECCurve.NamedCurves.nistP256;
var ecdhSender = ECDiffieHellman.Create(curve);
var ecdhReceiver = ECDiffieHellman.Create(curve);
Насколько я понимаю, я должен иметь возможность вычислить секретное соглашение либо с помощью объекта ecdhSender с использованием ecdhReceiver.PublicKey, либо с использованием объекта ecdhReceiver с ecdhSender.PublicKey, и оба значения секретного соглашения должны быть одинаковыми. Если это неверное предположение, пожалуйста, дайте мне знать.
Поскольку ECDiffieHellman.Create возвращает тип ECDiffieHellman, я написал следующий код, чтобы получить секретное соглашение:
string receiverHexString = null;
using (SafeNCryptSecretHandle secretAgreement = (ecdhReceiver as ECDiffieHellmanCng).DeriveSecretAgreementHandle(ecdhSender.PublicKey))
{
byte[] secretAgreementBytes = new byte[32];
IntPtr pointer = secretAgreement.DangerousGetHandle();
Marshal.Copy(pointer, secretAgreementBytes, 0, secretAgreementBytes.Length);
receiverHexString = BitConverter.ToString(secretAgreementBytes).Replace("-", string.Empty).ToLower();
Console.WriteLine($"receiver secretAgreement: 0x{receiverHexString}");
}
string senderHexString = null;
using (SafeNCryptSecretHandle secretAgreement = (ecdhSender as ECDiffieHellmanCng).DeriveSecretAgreementHandle(ecdhReceiver.PublicKey))
{
byte[] secretAgreementBytes = new byte[32];
IntPtr pointer = secretAgreement.DangerousGetHandle();
Marshal.Copy(pointer, secretAgreementBytes, 0, secretAgreementBytes.Length);
senderHexString = BitConverter.ToString(secretAgreementBytes).Replace("-", string.Empty).ToLower();
Console.WriteLine($"sender secretAgreement: 0x{senderHexString}");
}
Assert.AreEqual(receiverHexString, senderHexString);
Мое утверждение не работает. Очевидно, я что-то делаю не так (если тайные соглашения должны быть одинаковыми).
Это как я извлекаю байты из ручки? Или что-то другое?