C++ openssl散列产生部分不同的输出-c++;ubuntu

C++ openssl散列产生部分不同的输出-c++;ubuntu,c++,ubuntu,openssl,key,C++,Ubuntu,Openssl,Key,下面是我在openssl中创建哈希的代码。 我想知道为什么我的输出总是部分不同 int main() { char alg[] = "MD5"; char buf[EVP_MAX_KEY_LENGTH] = "5"; unsigned char *testKey; unsigned int olen; testKey = simple_digest(alg, buf, EVP_MAX_KEY_LENGTH,&olen); std::

下面是我在openssl中创建哈希的代码。 我想知道为什么我的输出总是部分不同

int main()
{
    char alg[] = "MD5";
    char buf[EVP_MAX_KEY_LENGTH] = "5";
    unsigned char *testKey;
    unsigned int olen;  

    testKey = simple_digest(alg, buf, EVP_MAX_KEY_LENGTH,&olen);

    std::cout << "Printing key : >>";
    print_hex(testKey,EVP_MAX_KEY_LENGTH);
    std::cout << "<<" << std::endl;
}

unsigned char *simple_digest(char *alg, char *buf, unsigned int len,unsigned int *olen)
{
    const EVP_MD *m;
    EVP_MD_CTX ctx;
    unsigned char *ret;
    OpenSSL_add_all_digests();

    if (!(m = EVP_get_digestbyname(alg)))
        return NULL;
    if (!(ret = (unsigned char *)malloc(EVP_MAX_MD_SIZE)))
        return NULL;


    EVP_DigestInit(&ctx, m);
    EVP_DigestUpdate(&ctx, buf, len);
    EVP_DigestFinal(&ctx, ret, olen);

//  std::cout << "computed key" << ret << std::endl;

    return ret;
} 

void print_hex(unsigned char *bs, unsigned int n)
{
    int i;
    for (i = 0; i < n; i++)
        printf("%02x", bs[i]);
    printf("\n");
}
正如您所看到的,只有后面的几个字符不同

提前谢谢!:D


更新(正确的工作版本):

int main()
{
    char alg[] = "MD5";
    char buf[EVP_MAX_KEY_LENGTH] = "5";
    unsigned char *testKey;
    unsigned int olen;  

    testKey = simple_digest(alg, buf,strlen(buf),&olen);

    std::cout << "Printing key : >>";
    print_hex(testKey,olen);
    std::cout << "<<" << std::endl;

}

unsigned char *simple_digest(char *alg, char *buf, unsigned int len,unsigned int *olen)
{
    const EVP_MD *m;
    EVP_MD_CTX ctx;
    unsigned char *ret;
    OpenSSL_add_all_digests();

    if (!(m = EVP_get_digestbyname(alg)))
        return NULL;
    if (!(ret = (unsigned char *)malloc(EVP_MAX_KEY_LENGTH)))
        return NULL;

    EVP_DigestInit(&ctx, m);
    EVP_DigestUpdate(&ctx, buf, len);
    EVP_DigestFinal(&ctx, ret, olen);

    return ret;
} 

void print_hex(unsigned char *bs, unsigned int n)
{
    int i;
    for (i = 0; i < n; i++)
        printf("%02x", bs[i]);
}
intmain()
{
字符alg[]=“MD5”;
字符buf[EVP_MAX_KEY_LENGTH]=“5”;
无符号字符*testKey;
无符号整数;
testKey=simple_digest(alg、buf、strlen(buf)和olen);

std::cout您试图散列一个字符串“5”,但您告诉
EVP\u Digest\u Update
您的缓冲区长度是
EVP\u MAX\u KEY\u length
。您需要传递缓冲区的实际长度,而不是最大长度

为完整起见,以下是您的主要功能:

int main()
{
    char alg[] = "MD5";
    char buf[EVP_MAX_KEY_LENGTH] = "5";
    unsigned char *testKey;
    unsigned int olen;  

    # Pass the true length of but
    testKey = simple_digest(alg, buf, strlen(buf), &olen);

    std::cout << "Printing key : >>";
    # Pass the true length of testKey
    print_hex(testKey,olen);
    std::cout << "<<" << std::endl;
}
intmain()
{
字符alg[]=“MD5”;
字符buf[EVP_MAX_KEY_LENGTH]=“5”;
无符号字符*testKey;
无符号整数;
#传递but的真实长度
testKey=simple_digest(alg、buf、strlen(buf)和olen);

std::cout您试图散列一个字符串“5”,但您告诉
EVP\u Digest\u Update
您的缓冲区长度是
EVP\u MAX\u KEY\u length
。您需要传递缓冲区的实际长度,而不是最大长度

为完整起见,以下是您的主要功能:

int main()
{
    char alg[] = "MD5";
    char buf[EVP_MAX_KEY_LENGTH] = "5";
    unsigned char *testKey;
    unsigned int olen;  

    # Pass the true length of but
    testKey = simple_digest(alg, buf, strlen(buf), &olen);

    std::cout << "Printing key : >>";
    # Pass the true length of testKey
    print_hex(testKey,olen);
    std::cout << "<<" << std::endl;
}
intmain()
{
字符alg[]=“MD5”;
字符buf[EVP_MAX_KEY_LENGTH]=“5”;
无符号字符*testKey;
无符号整数;
#传递but的真实长度
testKey=simple_digest(alg、buf、strlen(buf)和olen);

std::cout您的程序显然不会生成您的输出。我希望在一行上显示“Printing key:>>”,在下一行上显示一个散列,然后"@谢普纳:谢谢你的评论,我不知道如何去除非哈希输出,但是我运行程序两次。BUF的值总是一个数字,例如,你将流输出与调用<代码> Prtff<代码>混合。我不确定是否推荐,但是自从我做了C++编程以来,已经有很长时间了。:)您的程序显然不会生成输出。我希望在一行上显示“Printing key:>>”,在下一行上显示单个哈希,然后"@谢普纳:谢谢你的评论,我不知道如何去除非哈希输出,但是我运行程序两次。BUF的值总是一个数字,例如,你将流输出与调用<代码> Prtff<代码>混合。我不确定是否推荐,但是自从我做了C++编程以来,已经有很长时间了。:)我将该行更改为testKey=simple_digest(alg,buf,sizeof(buf),&olen);但它仍然在后面提供相同的随机输出。无论如何,感谢您的帮助!我发现了我的错误,我已在下面填写了它!:Dsizeof(buf)返回字符指针的大小,而不是指针指向的字符串的长度。嗯,那么我应该使用什么?strlen?它仍然不起作用:(使用
strlen
,但您还需要将
olen
传递给您的
print\u hex
函数,而不是
EVP\u MAX\u KEY\u LENGTH
。谢谢,这很有效!但会是128位吗?因为我需要128位密钥。我将该行更改为testKey=simple\u digest(alg,buf,sizeof(buf),&olen);但它仍然在后面给我相同的随机输出。无论如何,谢谢你的帮助!我发现了错误,我已在下面填写了它!:Dsizeof(buf)返回字符指针的大小,而不是指针指向的字符串的长度。嗯,那么我应该使用什么?strlen?它仍然不起作用:(使用
strlen
,但您还需要将
olen
传递给您的
print\u hex
函数,而不是
EVP\u MAX\u KEY\u LENGTH
。谢谢,这很有效!但这是128位的吗?因为我需要128位的密钥。
int main()
{
    char alg[] = "MD5";
    char buf[EVP_MAX_KEY_LENGTH] = "5";
    unsigned char *testKey;
    unsigned int olen;  

    # Pass the true length of but
    testKey = simple_digest(alg, buf, strlen(buf), &olen);

    std::cout << "Printing key : >>";
    # Pass the true length of testKey
    print_hex(testKey,olen);
    std::cout << "<<" << std::endl;
}