我正在使用SHA 512来获取一些消息的摘要。我想把摘要转换成int(可能是512位的int)。我写了代码,但是我注意到我总是得到0作为答案。我用python和c写代码,用python写要容易得多。
这是我用C编写的代码:
#include <stdio.h>
#include <stdlib.h>
#include <OpenSSL/sha.h>
int main() {
unsigned char message[] = "hello world";
unsigned char digest[512];
SHA512(message,strlen((char *) message),digest);
int integer_value = atoi((char *) digest);
printf("The integer value of the message is %d\n", integer_value);
return 0;
}
在python中,这要容易得多,而且运行良好!
import hashlib
import sys
Message ="hello world"
integer_value = int.from_bytes(hashlib.sha512(Message.encode()).digest(),sys.byteorder)
我是C新手,我整天都在思考解决这个问题的方法,但是在C中,和Python相比,有太多的事情要做。我的目标是从C中的digest中得到int值,就像我在Python中所做的那样。我也尝试使用strtol代替atoi,但是仍然得到0作为答案。
- update* 我还想提一下,我的目标也是用某个数(假设为7)的值求模
例如,在python中,它是这样的:
import hashlib
import sys
Message ="hello world"
integer_value = int.from_bytes(hashlib.sha512(Message.encode()).digest(),sys.byteorder)
Modulo = integer_value % 7
也许我需要提到的是,这就是为什么我想得到integer_value,我可能是错的,如果有更好的方法来获得在C中的摘要模,我想知道!
2条答案
按热度按时间pkwftd7m1#
C没有原生的512位整数类型。
如果你想打印摘要,那么你需要打印十六进制的每个字节。
gtlvzcf82#
你的一些代码只是语法错误。
应为:
如果需要512位,则数组大小可能应为
512 / 8
。但是您还有其他问题,我怀疑
SHA512()
是否能给出ASCII格式的数字,所以在它的输出中使用atoi()
是没有意义的。另外,C语言不支持512位整数。在大多数系统上,整数的大小是32或64位。处理大于512位的整数需要特殊的库。
高级语言可以用几行代码来完成这些事情,这是很好的,但在C中完成这些事情需要的时间要多得多。