加密和#x2B+;和蟒蛇 考虑客户端和服务器之间的Diffie-Hellman密钥交换,其中客户端应用程序用C++编写,后端用Python编写。 客户机应用程序使用lib进行加密,Python使用lib

加密和#x2B+;和蟒蛇 考虑客户端和服务器之间的Diffie-Hellman密钥交换,其中客户端应用程序用C++编写,后端用Python编写。 客户机应用程序使用lib进行加密,Python使用lib,python,c++,crypto++,diffie-hellman,python-cryptography,Python,C++,Crypto++,Diffie Hellman,Python Cryptography,这里是客户端应用程序部分,其中生成私钥和公钥 //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()

这里是客户端应用程序部分,其中生成私钥和公钥

//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

是否有人试图使用这两个库在Crypto++和Python之间实现Diffie-Hellman密钥交换?

问题在于,当以某种方式将序列化数据传输到后端时,如何使用Python
EllipticCurvePublicKey
类型接口恢复它。即使我决定使用protobuf,同样的问题也会出现

但现在我找到了解决方案,如果有人也会遇到这个问题,我会把它放在这里

正如我发现的那样,没有接口可以直接从Crypto++
SecByteBlock
序列化对象加载Python
EllipticCurvePublicKey
对象(在这个范围内表示Diffie-Hellman公钥)

要做到这一点,我们需要将公钥转换为椭圆曲线点,并将点的每个坐标(这是一个大整数)序列化,正如您在这段代码中看到的:

CryptoPP::DL_GroupParameters_EC params(曲线);
CryptoPP::ECPPoint p=params.DecodeElement(pubA.BytePtr(),true);

编写
ECPPoint p=params.decodelement(pubA.BytePtr(),true)时的std::cout
pubA
是否来自Python中的另一方?或者您正在准备发送给另一方的公钥?
IntToString(p.x)
(和
p.y
)实际上并不需要。您可以
std::cout@jww CPPoint p=params.DecodeElement(pubA.BytePtr(),true)用于准备发送给另一方的公钥。IntToString函数也用于发送到后端。对于仅输出,您是对的,不需要调用IntToString函数。
ValueError: Could not deserialize key data