openssl生成rsa密鑰對


#include <boost/asio/ssl.hpp>
#include <fstream>
#if defined(_WINDOWS_) 
#if (OPENSSL_VERSION_NUMBER >= 0x10101000L)
#pragma comment(lib,"libcrypto.lib")
#pragma comment(lib,"libssl.lib")
#else
#pragma comment(lib,"libeay32.lib")
#pragma comment(lib,"ssleay32.lib")
#endif
#endif


#define KEY_LENGTH  2048             // 密鑰長度
#define PUB_KEY_FILE "./pubkey.pem"    // 公鑰路徑
#define PRI_KEY_FILE "./prikey.pem"    // 私鑰路徑

/*
製造密鑰對:私鑰和公鑰
**/
void GenerateRSAKey(std::string& out_pub_key, std::string& out_pri_key)
{
    size_t pri_len = 0; // 私鑰長度
    size_t pub_len = 0; // 公鑰長度
    char* pri_key = nullptr; // 私鑰
    char* pub_key = nullptr; // 公鑰

    // 生成密鑰對
    RSA* keypair = RSA_generate_key(KEY_LENGTH, RSA_3, NULL, NULL);

    BIO* pri = BIO_new(BIO_s_mem());
    BIO* pub = BIO_new(BIO_s_mem());

    // 生成私鑰
    PEM_write_bio_RSAPrivateKey(pri, keypair, NULL, NULL, 0, NULL, NULL);
    // 注意------生成第1種格式的公鑰
    //PEM_write_bio_RSAPublicKey(pub, keypair);
    // 注意------生成第2種格式的公鑰(此處代碼中使用這種)
    PEM_write_bio_RSA_PUBKEY(pub, keypair);

    // 獲取長度  
    pri_len = BIO_pending(pri);
    pub_len = BIO_pending(pub);

    // 密鑰對讀取到字符串  
    pri_key = (char*)malloc(pri_len + 1);
    pub_key = (char*)malloc(pub_len + 1);

    BIO_read(pri, pri_key, pri_len);
    BIO_read(pub, pub_key, pub_len);

    pri_key[pri_len] = '\0';
    pub_key[pub_len] = '\0';

    out_pub_key = pub_key;
    out_pri_key = pri_key;

    // 將公鑰寫入文件
    std::ofstream pub_file(PUB_KEY_FILE, std::ios::out);
    if (!pub_file.is_open())
    {
        perror("pub key file open fail:");
        return;
    }
    pub_file << pub_key;
    pub_file.close();

    // 將私鑰寫入文件
    std::ofstream pri_file(PRI_KEY_FILE, std::ios::out);
    if (!pri_file.is_open())
    {
        perror("pri key file open fail:");
        return;
    }
    pri_file << pri_key;
    pri_file.close();

    // 釋放內存
    RSA_free(keypair);
    BIO_free_all(pub);
    BIO_free_all(pri);

    free(pri_key);
    free(pub_key);
}

int main()
{
    std::string pub_key;
    std::string pri_key;

    GenerateRSAKey(pub_key, pri_key);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章