SHA1 不匹配打开

SHA1 Mismatches openssl

本文关键字:不匹配 SHA1      更新时间:2023-10-16

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

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

更新:我已经能够通过添加 -n 来匹配 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")