将摘要(无符号字符 *)转换为C中的int值

bksxznpy  于 2023-03-17  发布在  其他
关注(0)|答案(2)|浏览(106)

我正在使用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中的摘要模,我想知道!

pkwftd7m

pkwftd7m1#

C没有原生的512位整数类型。
如果你想打印摘要,那么你需要打印十六进制的每个字节。

int i;
for (i=0;i<512/8;i++) {
    if (i!=0) printf(":");
    printf("%02X", digest[i]);
}
printf("\n");
gtlvzcf8

gtlvzcf82#

你的一些代码只是语法错误。

unsigned char[512] digest;

应为:

unsigned char digest[512];

如果需要512位,则数组大小可能应为512 / 8
但是您还有其他问题,我怀疑SHA512()是否能给出ASCII格式的数字,所以在它的输出中使用atoi()是没有意义的。
另外,C语言不支持512位整数。在大多数系统上,整数的大小是32或64位。处理大于512位的整数需要特殊的库。
高级语言可以用几行代码来完成这些事情,这是很好的,但在C中完成这些事情需要的时间要多得多。

相关问题