Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SHA1错误在C中的实现_C_Openssl_Sha1 - Fatal编程技术网

SHA1错误在C中的实现

SHA1错误在C中的实现,c,openssl,sha1,C,Openssl,Sha1,我一直在从openssl/sha.h获取sha1()函数,但是我得到了随机输出和一些警告。我已经读了很多,并且尝试了一些示例代码,但是我得到了所有的警告,并且没有正确显示 以下是代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <openssl/sha.h> int main() { const u

我一直在从openssl/sha.h获取sha1()函数,但是我得到了随机输出和一些警告。我已经读了很多,并且尝试了一些示例代码,但是我得到了所有的警告,并且没有正确显示

以下是代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <openssl/sha.h>

int main() 
{ 
const unsigned char data[] = "Hello, World";
unsigned long length = sizeof(data);
unsigned char  hash[SHA_DIGEST_LENGTH];
SHA1(data, length, hash);
printf("%02x \n", hash);
return 0;

}
当我运行它并获得输出时: 62652b34

任何帮助都会很好

printf("%02u \n", hash);

通过打印未签名的字符来删除警告,这样无法转储整个缓冲区。您需要循环它,如下所示。您从输出中得到的值实际上是
散列
缓冲区的地址,这显然不是您想要的。您希望缓冲区中的十六进制字节作为文本转储

所以

intmain()
{
const unsigned char data[]=“你好,世界”;
无符号长长度=sizeof(数据);
无符号字符哈希[SHA_DIGEST_LENGTH];
SHA1(数据、长度、散列);
int i=0;
对于(;i

关于您的警告,不推荐使用此接口是因为此接口已过时,无法执行您正在尝试的加密操作(SHA1)。OpenSSL中有一些最新的接口。具体考虑EVP接口。

我花了一段时间才把它全部搞定。最好的方法是使用EVP,它提供了几乎所有的通用函数

#include <openssl/evp.h>
模式必须是“SHA256”、“SHA512”、“SHA1”作为字符串。 dataToHash是输入,dataSize是输入的大小, outhash应已分配,散列将写入其中

unsigned int hash(const char *mode, const char* dataToHash, size_t dataSize, unsigned char* outHashed) {
    unsigned int md_len = -1;
    const EVP_MD *md = EVP_get_digestbyname(mode);
    if(NULL != md) {
        EVP_MD_CTX mdctx;
        EVP_MD_CTX_init(&mdctx);
        EVP_DigestInit_ex(&mdctx, md, NULL);
        EVP_DigestUpdate(&mdctx, dataToHash, dataSize);
        EVP_DigestFinal_ex(&mdctx, outHashed, &md_len);
        EVP_MD_CTX_cleanup(&mdctx);
    }
    return md_len;
}

一个使用示例(未经测试,我在C++包装中使用上面的代码)


您不应该直接使用SHA1方法,因为它已被弃用(您的代码可能会在下一个版本中崩溃)。 如果要使用您的版本,需要将每个字符打印为十六进制:

int i;
for(i=0; i<SHA_DIGEST_LENGTH; i++) {
    printf("%02x", hash[i]);
}
inti;

对于(i=0;这是不对的。如果值<10(我几乎向您保证会是),这将发送要打印的哈希数组地址,作为一个无符号的最小两位数int,前面加0)。此代码与OP代码的唯一区别在于,它将地址打印为无符号int而不是十六进制。两者都不正确。如果将结果与一些测试台数据进行比较,请确保长度正确。在大多数情况下,“Hello,World”的长度应为12,但我认为它是13,如sizeof()还计算ascii零字符。感谢您的大力帮助。我的evp.h也有不推荐使用的问题。我现在想使用其他版本的版本吗?@user1626342 hmm,这很奇怪,您不应该对evp不推荐使用有任何问题。您能发布代码/警告吗?我想,因为我使用的是mac我不得不添加一堆if头。
OpenSSL_add_all_algorithms();
unsigned int hash(const char *mode, const char* dataToHash, size_t dataSize, unsigned char* outHashed) {
    unsigned int md_len = -1;
    const EVP_MD *md = EVP_get_digestbyname(mode);
    if(NULL != md) {
        EVP_MD_CTX mdctx;
        EVP_MD_CTX_init(&mdctx);
        EVP_DigestInit_ex(&mdctx, md, NULL);
        EVP_DigestUpdate(&mdctx, dataToHash, dataSize);
        EVP_DigestFinal_ex(&mdctx, outHashed, &md_len);
        EVP_MD_CTX_cleanup(&mdctx);
    }
    return md_len;
}
const char *inData = "test data2";
unsigned char outHash[20]; // output is already allocated
hash("SHA1", inData, 10, outHash);
int i;
for(i=0; i<SHA_DIGEST_LENGTH; i++) {
    printf("%02x", hash[i]);
}