如何兑换公钥?

时间:2015-09-16 20:19:15

标签: c++ rsa crypto++

我有客户端和服务器,并希望加密它们之间的通信通道。 这是一些生成公钥和私钥的简单代码:

    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);

但是如何在客户端获取服务器端的客户端公钥和服务器的公钥?可能存在比在文件中序列化公钥,发送文件,在另一端接收文件并反序列化更简单的方法吗?

ChatDataTransferingInterface个实例,指向ServerClient(这取决于用户是否在开始时选择了)。 一些用于理解的代码:

课堂聊天:

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实例进行握手(数据交换)。在此方法中,服务器必须发送自己的公钥,并获取客户端的公钥。但是怎么做呢?

2 个答案:

答案 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个变量中),从客户端获取公钥,用客户公钥替换自己的公钥。

与客户相同。