簡體   English   中英

使用 RSA_public_encrypt 的 C++ 公鑰加密

[英]C++ Public Key Encryption with RSA_public_encrypt

我目前正在努力使用 C++ 中的公鑰加密。 我正在使用 openssl 但生成的字符串總是被破壞。 我目前的解決方案如下:

string encryptWithPublicKey(const char* pData, int iLen) { // pData: String to encrypt, iLen: length

        char chPublicKey[] = "---Public Key-- ...";

        BIO* bio = BIO_new_mem_buf(chPublicKey, -1);

        RSA* rsa = PEM_read_bio_RSA_PUBKEY(bio, NULL, NULL, NULL);
    

        int nLen = RSA_size(rsa);
        char* pEncode = (char*)malloc(nLen + 1);
        int rc = RSA_public_encrypt(iLen, (unsigned char*)pData, (unsigned char*)pEncode, rsa, RSA_NO_PADDING);

        cout << "From: " << pData << " To: '" << pEncode << "'";

        RSA_free(rsa);
        CRYPTO_cleanup_all_ex_data();
        std::string strName = std::string(pEncode);

        return strName;
}

加密的輸出總是這樣的格式:“================================== ===========================²²²²☻"

不知道為什么輸出有那種格式^^

也許有人知道如何更好地使用加密。

謝謝庫爾特

  1. 加密數據是二進制的。 你不應該打印二進制數據。 您應該在打印前將其編碼為 base64 或十六進制。

  2. ════════════是0xCC字節,未初始化內存的魔法填充字節。 似乎沒有寫入輸出,這意味着對RSA_public_encrypt的調用失敗。

您沒有檢查返回值rc

int rc = RSA_public_encrypt(iLen, (unsigned char*)pData, (unsigned char*)pEncode, rsa, RSA_NO_PADDING);

添加一些錯誤報告以查看確切的錯誤:

if (rc < 0) {
    char buf[128];
    cerr << "RSA_public_encrypt: " << ERR_error_string(ERR_get_error(), buf) << endl;
}

它可能會打印類似RSA_padding_add_none:data too small for key size

這是因為RSA_public_encrypt精確加密RSA_size(rsa)字節(RSA 密鑰的大小),主要用於加密對稱密鑰,而對稱密鑰又用於加密。

我使用公鑰/私鑰進行對稱密鑰傳輸

好的。 在這種情況下,密鑰應該適合,您只需要將其填充到RSA_size(rsa)字節。 或者更好的是,使用一些好的填充,如RSA_PKCS1_OAEP_PADDING而不是RSA_NO_PADDING

請注意, std::string(pEncode)需要 C 字符串輸入。 您需要std::string(pEncode, rc)才能將二進制數據存儲在std::string 或者更好的是,使用 base64(請參閱EVP_EncodeBlock )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM