我有客户端和服务器,并希望加密它们之间的通信通道。 这是一些生成公钥和私钥的简单代码:
RSA::PrivateKey privateKey;
privateKey.Initialize()
///////////////////////////////////////
// Generate Parameters
InvertibleRSAFunction params;
params.GenerateRandomWithKeySize(this->rng, 3072);
///////////////////////////////////////
// Generated Parameters
const Integer& n = params.GetModulus();
const Integer& p = params.GetPrime1();
const Integer& q = params.GetPrime2();
const Integer& d = params.GetPrivateExponent();
const Integer& e = params.GetPublicExponent();
params.
///////////////////////////////////////
// Dump
cout << "RSA Parameters:" << endl;
cout << " n: " << n << endl;
cout << " p: " << p << endl;
cout << " q: " << q << endl;
cout << " d: " << d << endl;
cout << " e: " << e << endl;
cout << endl;
///////////////////////////////////////
// Create Keys
RSA::PrivateKey privateKey(params);
RSA::PublicKey publicKey(params);
但是如何在客户端获取服务器端的客户端公钥和服务器的公钥?可能存在比在文件中序列化公钥,发送文件,在另一端接收文件并反序列化更简单的方法吗?
类Chat
有DataTransferingInterface
个实例,指向Server
或Client
(这取决于用户是否在开始时选择了)。
一些用于理解的代码:
课堂聊天:
class Chat : public OwnerServerInterface, public OwnerClientInterface
public:
//a lot of methods
protected:
virtual void handshakeServerSide(int clientSocket, void *objectForSaveIn, void *dataToSend);
virtual void handshakeClientSide(int serverSocket, void *objectForSaveIn, void *dataToSend);
private:
DataTransferingInterface* interface;
在方法handshakeServerSide()
和handshakeClientSide()
中,服务器的Chat
实例和客户端的Chat
实例进行握手(数据交换)。在此方法中,服务器必须发送自己的公钥,并获取客户端的公钥。但是怎么做呢?
答案 0 :(得分:1)
...如何在服务器端获取客户端的公钥,在客户端获取服务器的公钥?
这被称为key distribution problem。它可能(或可能不是)可以在小规模上进行管理,但是当你扩展它时它是一个非常棘手的问题。
答案取决于您的特定实例问题,看起来像是一种N路聊天程序。在像Stack Overflow这样的编程网站上回答问题真的太多了。
也许您应该阅读这个问题,包括多方或群组Diffie-Hellman方案。还要考虑一个成员离开小组时你想要发生什么。然后在Information Security Stack Exchange上提出有针对性的问题。
答案 1 :(得分:0)
Follow code是Crypto ++ RSA算法非常简单的类包装器:
EncoderRSA.h
class EncoderRSA
{
public:
EncoderRSA();
void keyGeneration();
void substitutePublicKey(Integer e, Integer n);
Integer encode(std::string plainText);
std::string decode(Integer cypher);
Integer getE();
Integer getN();
private:
AutoSeededRandomPool prng;
RSA::PublicKey publicKey; // For encrypt plain text
RSA::PrivateKey privateKey; // For decrypt plain text
};
EncoderRSA.cpp
void EncoderRSA::keyGeneration() {
InvertibleRSAFunction params;
params.GenerateRandomWithKeySize(this->prng, 3072);
RSA::PrivateKey privateKey(params);
RSA::PublicKey publicKey(params);
//because you can't do: this->privateKey(params);
this->privateKey = privateKey;
this->publicKey = publicKey;
}
void EncoderRSA::substitutePublicKey(Integer e, Integer n) {
this->publicKey.Initialize(n, e);
}
Integer EncoderRSA::encode(std::string plainText) {
Integer m((const byte*)plainText.data(), plainText.size());
Integer c = this->publicKey.ApplyFunction(m);
return c;
}
std::string EncoderRSA::decode(Integer cypher) {
Integer r = this->privateKey.CalculateInverse(this->prng, cypher);
std::string decoded;
size_t req = r.MinEncodedSize();
decoded.resize(req);
r.Encode((byte*)decoded.data(), decoded.size());
return decoded;
}
Integer EncoderRSA::getE() {
return this->publicKey.GetPublicExponent();
}
Integer EncoderRSA::getN() {
return this->publicKey.GetModulus();
}
服务器必须生成它自己的密钥(公共和私有),保存它,单独保存它自己的公钥(如果完全是:PublicExponent和PublicModulus)(在Integer
个变量中),从客户端获取公钥,用客户公钥替换自己的公钥。
与客户相同。