Я пытаюсь создать общий секрет между веб-сервером с PHP и настольным приложением C #. Я знаю библиотеку BouncyCastle, но я бы предпочел не использовать ее, так как она довольно огромная.
Я использую phpecc и ECDiffieHellmanCng и пытаюсь создать общий секрет между двумя сторонами, но у меня возникают проблемы с экспортом / импортом на C #.
Кажется, что phpecc требует формат der / pem для импорта ключа, и ECDiffieHellmanCng, похоже, не имеет простого способа экспорта в совместимом формате.
Должен ли я написать свой собственный кодер и декодер pem / der, чтобы сделать это, или есть альтернативный способ?
В настоящее время я делаю следующее в C #:
using (var ecdh = new ECDiffieHellmanCng()) { ecdh.HashAlgorithm = CngAlgorithm.ECDiffieHellmanP384; ecdh.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash; var encoded = EncodePem(ecdh.PublicKey.ToByteArray()); //... do something with encoded } private static string EncodePem(byte[] data) { var pemDat = new StringBuilder(); var chunk = new char[64]; pemDat.AppendLine("-----BEGIN PUBLIC KEY-----"); var encodedData = Convert.ToBase64String(data); for (var i = 0; i < encodedData.Length; i += chunk.Length) { var index = 0; while (index != chunk.Length && i + index < encodedData.Length) { chunk[index] = encodedData[i + index]; index++; } pemDat.AppendLine(new string(chunk)); } pemDat.AppendLine("-----END PUBLIC KEY-----"); return pemDat.ToString(); }
Очевидно, что вышеупомянутое только делает кодировку pem, поэтому на стороне php она возвращает ошибку, когда пытается ее проанализировать:
Тип: Runtime
Сообщение об исключении: неверные данные.
Файл: /…/vendor/mdanter/ecc/src/Serializer/PublicKey/Der/Parser.php
Линия: 49