gpt4 book ai didi

c++ - SHA1 不匹配 openssl

转载 作者:行者123 更新时间:2023-11-30 05:05:00 25 4
gpt4 key购买 nike

我是一名 Java 开发人员,负责将 C 应用程序移植到 Java。我不是 C 语言开发人员,所以仅此一项就是一个挑战。部分软件使用 openssl 创建 SHA1。我无法在 C 和 Java 之间实现匹配的 SHA 散列。事实上,在将实现提炼为几行代码,然后在 ubuntu 上针对 openssl 测试它们之后,所有 3 个都为同一字符串生成不同的哈希值。

我已经为此工作了几个小时,我快要失去理智了。 C 和 Java 实现如下。拜托,如果您发现我做错了什么,请指出。

更新:我已经能够通过将 -n 添加到 echo 来匹配 openssl cmd。显然它会自动添加一个行尾。不过,我仍然坚持通过 C 使用它。

Java

System.out.println(
org.apache.commons.codec.digest.DigestUtils.sha1Hex("symphony")
);
HASH: 1c882ecb4c9e6cf19a4ff207c7dbf8a250567fbf <- CORRECT SHA1

C++

uint32_t sha1_hash[5];
unsigned char data[] = "symphony";
SHA1(data, 8, (uint8_t *)sha1_hash);
cout << "SYMPHONY " << hex << sha1_hash[0] << sha1_hash[1] << sha1_hash[2] << sha1_hash[3] << sha1_hash[4]<< dec << endl;
HASH: e8b8a894e4f0b00c3b9f69ecfe81c1f0a3d43817

openssl cmd on ubuntu
echo symphony | openssl dgst -sha1
HASH: 4b2c22b662de79e609295798f6fc5cb5f7676fa6

openssl cmd on ubuntu
echo -n symphony | openssl dgst -sha1
HASH: 1c882ecb4c9e6cf19a4ff207c7dbf8a250567fbf

最佳答案

uint32_t sha1_hash[5]

将其更改为 uint8_t my_hash[20]

并使用以下方法打印:

#include <iostream>
#include <iomanip>
...

uint8_t my_hash[20];
SHA1(data, length, my_hash);
cout << hex;
for(int i = 0; i < 20; i++)
{
cout << setfill('0') << setw(2) << (my_hash[i] & 0xFF) << " ";
}

length 大概是 strlen("symphony")

关于c++ - SHA1 不匹配 openssl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48603738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com