Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 执行副总裁“更新摘要和”;从‘;无符号字符*’;至‘;常量字符*’&引用;_C++_Hash_Openssl_Sha256 - Fatal编程技术网

C++ 执行副总裁“更新摘要和”;从‘;无符号字符*’;至‘;常量字符*’&引用;

C++ 执行副总裁“更新摘要和”;从‘;无符号字符*’;至‘;常量字符*’&引用;,c++,hash,openssl,sha256,C++,Hash,Openssl,Sha256,以下是OpenSSL wiki上的示例: void digest_message(unsigned char *message, unsigned char **digest, unsigned int *digest_len) { EVP_MD_CTX *mdctx; if((mdctx = EVP_MD_CTX_create()) == NULL) handleErrors(); if(1 != EVP_DigestInit_ex(mdctx, E

以下是OpenSSL wiki上的示例:

void digest_message(unsigned char *message, unsigned char **digest, unsigned int *digest_len)
{
    EVP_MD_CTX *mdctx;

    if((mdctx = EVP_MD_CTX_create()) == NULL)
        handleErrors();

    if(1 != EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL))
        handleErrors();

    if(1 != EVP_DigestUpdate(mdctx, message, strlen(message)))
        handleErrors();

    if((*digest = (unsigned char *)OPENSSL_malloc(EVP_MD_size(EVP_sha256()))) == NULL)
        handleErrors();

    if(1 != EVP_DigestFinal_ex(mdctx, *digest, digest_len))
        handleErrors();

    EVP_MD_CTX_destroy(mdctx);
}
问题是,当我尝试编译它时,会出现以下错误:

evp_test.cpp:18:60: error: invalid conversion from ‘unsigned char*’ to ‘const char*’ [-fpermissive]
 if(1 != EVP_DigestUpdate(mdctx, message, strlen(message)))

In file included from /usr/include/c++/5/cstring:42:0
因此,在消息上调用
strlen
会导致错误,因为
strlen
需要一个
const char
?这是因为字符串是常量字符的数组吗

我应该采取哪些不同的措施来解决此问题?

已修复:

void digest_message(const unsigned char *message, size_t message_len,
                    unsigned char **digest, unsigned int *digest_len)
{
    EVP_MD_CTX *mdctx;

    if((mdctx = EVP_MD_CTX_create()) == NULL)
        handleErrors();

    if(1 != EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL))
        handleErrors();

    if(1 != EVP_DigestUpdate(mdctx, message, message_len))
        handleErrors();

    if((*digest = (unsigned char *)OPENSSL_malloc(EVP_MD_size(EVP_sha256()))) == NULL)
        handleErrors();

    if(1 != EVP_DigestFinal_ex(mdctx, *digest, digest_len))
        handleErrors();

    EVP_MD_CTX_destroy(mdctx);
}
你说得对,
strlen
需要一个
char
数组,而不是
无符号char
字节

更大的问题是设计/工程。需要显式长度参数,因为不能保证字节数组像C字符串一样以NULL结尾。事实上,字节数组中可能嵌入了几个空值。

它已被修复:

void digest_message(const unsigned char *message, size_t message_len,
                    unsigned char **digest, unsigned int *digest_len)
{
    EVP_MD_CTX *mdctx;

    if((mdctx = EVP_MD_CTX_create()) == NULL)
        handleErrors();

    if(1 != EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL))
        handleErrors();

    if(1 != EVP_DigestUpdate(mdctx, message, message_len))
        handleErrors();

    if((*digest = (unsigned char *)OPENSSL_malloc(EVP_MD_size(EVP_sha256()))) == NULL)
        handleErrors();

    if(1 != EVP_DigestFinal_ex(mdctx, *digest, digest_len))
        handleErrors();

    EVP_MD_CTX_destroy(mdctx);
}
你说得对,
strlen
需要一个
char
数组,而不是
无符号char
字节


更大的问题是设计/工程。需要显式长度参数,因为不能保证字节数组像C字符串一样以NULL结尾。事实上,一个字节数组中可能嵌入了一些空值。

Lol。。。我们刚刚讨论的是OpenSSL的C++编译器支持。看见共识是不支持C++编译器“仅仅因为”。据我所知,没有技术上的原因。哈哈。。。我们刚刚讨论的是OpenSSL的C++编译器支持。看见共识是不支持C++编译器“仅仅因为”。据我所知,没有技术上的原因。