Рассмотрим обмен ключами Диффи-Хеллмана между клиентом и сервером, где клиентское приложение написано на c ++, а серверная часть написана на python.
Клиентское приложение использует Crypto ++ lib для криптографии и Python криптография.
Здесь часть клиентского приложения, где генерируется закрытый и открытый ключ
//domain parameters
OID CURVE = secp256k1();
AutoSeededX917RNG<AES> rng;
ECDH < ECP >::Domain dhA(CURVE);
// application private and publik key
SecByteBlock privA(dhA.PrivateKeyLength()), pubA(dhA.PublicKeyLength());
std::string privB64(R"(P3VfVpnSYcKQWX+6EZOly2XKy6no4UAB0cQhjBfyBD4=)");
privA.Assign(reinterpret_cast<const byte*>(FromB64(privB64).c_str()), dhA.PrivateKeyLength());
dhA.GeneratePublicKey(rng, privA, pubA);
// serializa public key into integer
Integer intPub;
intPub.Decode(pubA.BytePtr(), pubA.SizeInBytes());
std::string ret;
intPub.DEREncode(CryptoPP::StringSink(ret));
std::cout << ToB64(ret);// the output is loaded into python
Теперь вопрос в том, что я не знаю, как десериализовать открытый ключ в python. EllipticCurvePublicKey. Когда я использую cryptography.hazmat.primitives.serialization.load_der_public_key ()
я собираюсь
ValueError: Could not deserialize key data
Кто-нибудь пытается реализовать обмен ключами Диффи-Хеллмана между Crypto ++ и Python, используя эти две библиотеки?
Проблема заключалась в том, что сериализованные данные каким-то образом были перенесены в бэкэнд, как восстановить их с помощью Python. EllipticCurvePublicKey
Тип интерфейса. Даже если я решу использовать protobuf, такой же вопрос возникнет.
Но теперь я нашел решение, которое я поставлю здесь, если кто-то также столкнется с этой проблемой.
Как я выяснил, нет интерфейса для прямой загрузки Python EllipticCurvePublicKey
объект из Crypto ++ SecByteBlock
сериализованный объект (представляющий открытый ключ Диффи-Хеллмана в этой области).
Для этого нам нужно преобразовать открытый ключ в точку эллиптической кривой и сериализовать каждую координату точки (которая является большим целым числом) так, как вы можете видеть в следующем фрагменте кода:
CryptoPP::DL_GroupParameters_EC<ECP> params(CURVE);
CryptoPP::ECPPoint p = params.DecodeElement(pubA.BytePtr(), true);
std::cout << CryptoPP::IntToString(p.x) << std::endl;// this will be send to backend
std::cout << CryptoPP::IntToString(p.y) <<std::endl;
Чтобы восстановить два целых числа (координаты x и y точки) в коде Python как открытый ключ DH, вам нужно сделать следующее
# assuming that the x and y values are from client side
x = 109064308162845536717682288676453496629093274218806834681903624047410153913758
y = 63162707562199639283552673289102028849183508196715869820627148926667819088660
peer_public_key =cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePublicNumbers(x, y, ec.SECP256K1()).public_key(default_backend())
Других решений пока нет …