繁体   English   中英

c++ 打印无符号字符的分段错误

[英]c++ Segmentation fault printing an unsigned char

尝试打印由 function 填充的缓冲区时出现分段错误:

    int ret = 0;
    unsigned char plaintext;

    /* ret will contain the length of the "plaintext" output buffer */
    ret = gcm_decrypt( &ciphertext[0], ciphertext_len, &aad[0], aad_len, &tag[0], (unsigned char*)decoded_key.c_str(), &iv[0], iv_len, &plaintext );

    /* This will segfault BUT it actually prints out the correct data */
    std::string sName(reinterpret_cast<char*>(&plaintext)
    cout << "ret: " << ret << endl;
    cout << "plaintext: " << sName << endl;

我已经尝试了很多方法来从该纯文本缓冲区中获取 std::string ,但我无法弄清楚。

function 需要一个unsigned char *

int gcm_decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *aad, int aad_len, unsigned char *tag, unsigned char *key, unsigned char *iv, int iv_len, unsigned char *plaintext)

根据@drescherjm 的建议,我将其更新为:

结束代码是

int main(void)
{
    std::string key_encoded = "DgvkCrkyBNSy9yHP1Yznyc2DkHTIUXaO6NlEw4CSq0E=";
    std::string decoded_key = base64_decode(key_encoded);

    std::string token_encoded = "rj_ZkkZUOZMxZOfOmLpEUB3siU7u6RjZFeM9s-gb_xCR56WFKFAJiMyF2T6CBRmlh_Sy0i_lfyT9AI8sEif8MTIIszyzSl_aDnG48aO50yaHGuRSYbUbSYm9WIiQ0g==";
    std::string token_decoded_tmp = base64_decode( token_encoded );
    std::string token_decoded( token_decoded_tmp.begin()+32, token_decoded_tmp.end() );
    int ciphertext_len = token_decoded.size();

    std::string aad = "xxxxxxxxxxxxxxx";
    int aad_len = aad.size();

    std::string tag( token_decoded_tmp.begin()+16, token_decoded_tmp.end()+32 );
    std::string iv( token_decoded_tmp.begin(), token_decoded_tmp.begin()+16 );
    int iv_len = iv.size();

    int ret = 0;
    unsigned char plaintext[1024];
    ret = gcm_decrypt( 
        (unsigned char*)token_decoded.c_str(),
        ciphertext_len, 
        (unsigned char*)aad.c_str(), 
        aad_len, 
        (unsigned char*)tag.c_str(),
        (unsigned char*)decoded_key.c_str(), 
        (unsigned char*)iv.c_str(), 
        iv_len, 
        plaintext 
    );
    cout << "ret: " << ret << endl;
    cout << "plaintext: <" << plaintext << ">" << endl;

    return 0;
}

而且现在很完美。 谢谢!

@drescherjm 我无法将您的答案标记为正确答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM