2015-09-16 65 views
-1

我有客戶端和服務器,並希望加密它們之間的通信通道。 這是一些簡單的代碼來生成公鑰和私鑰:如何交換公鑰?

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() Server的實例Chat和客戶端的Chat實例進行握手(數據交換)。在這種方法中,服務器必須發送它自己的公鑰,並獲取客戶端的公鑰。但怎麼做呢?

+0

沒有人能真實地回答你的問題,因爲你沒有提供關於客戶端和服務器如何實際通信的信息,也沒有提供如何在代碼中實現通信的信息。 – Olipro

+0

是的,有序列化密鑰的標準。例如,參見[RFC 3447](http://tools.ietf.org/html/rfc3447)附錄A.1.1(並且,因爲它使用ASN.1,ASN.1上的標準參考之一)。 –

回答

0

跟蹤代碼是非常簡單的類,包裝器加密+ 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變量中),從客戶端獲取公鑰,將其替換爲pu客戶端公鑰使用blic鍵。

客戶端也一樣。

+0

您應該爲您的問題添加其他信息; *不*作爲答案。點擊*編輯*即可。 (並且不要將其他信息作爲評論發佈)。 – jww

1

...我如何獲得客戶端上的客戶端公鑰和客戶端上的服務器公鑰?

這就是所謂的key distribution problem。它可能(或不可以)小規模地管理,但是當你擴大規模時,它是一個非常棘手的問題。

答案取決於您的特定實例問題,並且看起來像一個N路聊天程序。在堆棧溢出等編程網站上回答問題真的太多了。

也許您應該仔細閱讀該問題,包括多方或組Diffie-Hellman方案。同時考慮一下當一個成員離開一個組時你想要發生什麼。然後詢問有關Information Security Stack Exchange的有針對性的問題。