我是一名将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
答案 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")