SHA1与openssl不匹配

时间:2018-02-04 01:08:21

标签: c++ openssl sha1

我是一名将C应用程序移植到Java的Java开发人员。我不是开发人员,所以这一直是一个挑战。部分软件使用openssl创建SHA1。我无法在C和Java之间实现匹配的SHA哈希。实际上,在将实现提取到几行代码然后在ubuntu上对openssl进行测试之后,ALL 3会为同一个字符串生成不同的哈希值。

我已经在这个问题上工作了好几个小时,我很想忘记。 C和Java实现如下。请,如果你看到我做错了什么,请指出。

更新:我通过在echo中添加-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

1 个答案:

答案 0 :(得分:1)

  

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")