SHA1 不匹配 openssl
SHA1 Mismatches openssl
我是一名 Java 开发人员,正在将 C 应用程序移植到 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")
我是一名 Java 开发人员,正在将 C 应用程序移植到 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")