从 string 转换为 unsigned char * ,反之亦然

发布于 2025-01-11 15:02:10 字数 3216 浏览 0 评论 0原文

我有两个功能:1.加密(字符串文本,字符串密钥)和2.解密(字符串文本,字符串密钥)。这些函数在 key 下加密/解密文本。我使用openssl库和函数:EVP_EncryptUpdate和EVP_DecryptUpdate这两个函数的输入参数是(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl)。我的功能如下,输出为: “你好世界\x5\x5\x5\x5\x5” 应该是“Hello world” 我想铸件有问题。

std::string encrypt(std::string text, std::string k){   
    const unsigned char  *plaintext=(const unsigned char*) text.c_str();
    const unsigned char  *key=(const unsigned char*) k.c_str();
    EVP_CIPHER_CTX *ctx;
    int len;
    int plaintext_len=strlen((const char *)plaintext);
    int ciphertext_len=plaintext_len+256;
    unsigned char * ciphertext=new unsigned char[ciphertext_len];
    
    /* Create and initialise the context */
    if(!(ctx = EVP_CIPHER_CTX_new()))
       handleErrors();

    /*
     * Initialise the encryption operation.
     */
    if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, NULL))
        handleErrors();
    /*
     * Provide the message to be encrypted, and obtain the encrypted output.
     * EVP_EncryptUpdate can be called multiple times if necessary
     */
    if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
        handleErrors();
    ciphertext_len = len;
    /*
     * Finalise the encryption. Further ciphertext bytes may be written at
     * this stage.
     */
    if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))
        handleErrors();
    ciphertext_len += len;

    /* Clean up */
   EVP_CIPHER_CTX_free(ctx);

    
    std::string cipherteststring=(char const* )ciphertext ;

    delete []ciphertext;
    return cipherteststring;    
}

std::string decrypt(std::string text, std::string k)
{   
    
    const unsigned char  *ciphertext=(const unsigned char*)text.c_str();
    const unsigned char  *key=(const unsigned char*) k.c_str();
    int ciphertext_len=strlen((const char *)ciphertext);
    EVP_CIPHER_CTX *ctx;
    int len;
    int plaintext_len=ciphertext_len;
    unsigned char *decryptedtext=new unsigned char[plaintext_len];

    /* Create and initialise the context */
    if(!(ctx = EVP_CIPHER_CTX_new()))
        handleErrors();

    /*
     * Initialise the decryption operation.
     */
    if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, NULL))
       handleErrors();

    /*
     * Provide the message to be decrypted, and obtain the plaintext output.
     * EVP_DecryptUpdate can be called multiple times if necessary.
     */
    if(1 != EVP_DecryptUpdate(ctx, decryptedtext, &len, ciphertext, ciphertext_len))
       handleErrors();

    /* Clean up */
    EVP_CIPHER_CTX_free(ctx);
    //std::string plaintextstring( reinterpret_cast< char const* >(decryptedtext) ) ;
    std::string plaintextstring=(char const*)decryptedtext;
    decryptedtext[plaintext_len] = '\0';    
    delete []decryptedtext;
    return plaintextstring;
}
int main (){
std::string key ="01234567890123456789012345678901";
    std::string plaintext ="Hello world";
    std::string encrypted;
    std::string decrypted;
    std::string decryptedhexstr;
    encrypted=encrypt (plaintext,key);
    decrypted = decrypt(encrypted, key);
    cout<<decrypted;
return 0;
}``

I have two functions: 1. encryption (string text, string key) and 2. decryption (string text, string key). these functions encrypt/decrypt text under key . I use openssl library and functions:EVP_EncryptUpdate and EVP_DecryptUpdate the input arguments of these two functions are (EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl). my functions are below and the output is :
"Hello world\x5\x5\x5\x5\x5"
which should be "Hello world"
i suppose there is something wrong with castings.

std::string encrypt(std::string text, std::string k){   
    const unsigned char  *plaintext=(const unsigned char*) text.c_str();
    const unsigned char  *key=(const unsigned char*) k.c_str();
    EVP_CIPHER_CTX *ctx;
    int len;
    int plaintext_len=strlen((const char *)plaintext);
    int ciphertext_len=plaintext_len+256;
    unsigned char * ciphertext=new unsigned char[ciphertext_len];
    
    /* Create and initialise the context */
    if(!(ctx = EVP_CIPHER_CTX_new()))
       handleErrors();

    /*
     * Initialise the encryption operation.
     */
    if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, NULL))
        handleErrors();
    /*
     * Provide the message to be encrypted, and obtain the encrypted output.
     * EVP_EncryptUpdate can be called multiple times if necessary
     */
    if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
        handleErrors();
    ciphertext_len = len;
    /*
     * Finalise the encryption. Further ciphertext bytes may be written at
     * this stage.
     */
    if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))
        handleErrors();
    ciphertext_len += len;

    /* Clean up */
   EVP_CIPHER_CTX_free(ctx);

    
    std::string cipherteststring=(char const* )ciphertext ;

    delete []ciphertext;
    return cipherteststring;    
}

std::string decrypt(std::string text, std::string k)
{   
    
    const unsigned char  *ciphertext=(const unsigned char*)text.c_str();
    const unsigned char  *key=(const unsigned char*) k.c_str();
    int ciphertext_len=strlen((const char *)ciphertext);
    EVP_CIPHER_CTX *ctx;
    int len;
    int plaintext_len=ciphertext_len;
    unsigned char *decryptedtext=new unsigned char[plaintext_len];

    /* Create and initialise the context */
    if(!(ctx = EVP_CIPHER_CTX_new()))
        handleErrors();

    /*
     * Initialise the decryption operation.
     */
    if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, NULL))
       handleErrors();

    /*
     * Provide the message to be decrypted, and obtain the plaintext output.
     * EVP_DecryptUpdate can be called multiple times if necessary.
     */
    if(1 != EVP_DecryptUpdate(ctx, decryptedtext, &len, ciphertext, ciphertext_len))
       handleErrors();

    /* Clean up */
    EVP_CIPHER_CTX_free(ctx);
    //std::string plaintextstring( reinterpret_cast< char const* >(decryptedtext) ) ;
    std::string plaintextstring=(char const*)decryptedtext;
    decryptedtext[plaintext_len] = '\0';    
    delete []decryptedtext;
    return plaintextstring;
}
int main (){
std::string key ="01234567890123456789012345678901";
    std::string plaintext ="Hello world";
    std::string encrypted;
    std::string decrypted;
    std::string decryptedhexstr;
    encrypted=encrypt (plaintext,key);
    decrypted = decrypt(encrypted, key);
    cout<<decrypted;
return 0;
}``

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文