【问题标题】:SHA1 error implementation in CC中的SHA1错误实现
【发布时间】:2013-01-12 07:33:54
【问题描述】:

我一直在努力让 sha1() 函数从 openssl/sha.h 工作,但是我得到了随机输出和一些警告。我已经阅读了相当多的内容并尝试了一些示例代码,但我都收到了警告,并且无法正确显示。

代码如下:

#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;

}

以下是我收到的警告:

sha.c: In function ‘main’:
sha.c:12: warning: ‘SHA1’ is deprecated (declared at /usr/include/openssl/sha.h:124)
sha.c:13: warning: format ‘%02x’ expects type ‘unsigned int’, but argument 2 has type   ‘unsigned char *’
sha.c:13: warning: format ‘%02x’ expects type ‘unsigned int’, but argument 2 has type ‘unsigned char *’

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

任何帮助都会很棒!

【问题讨论】:

  • 如果将结果与一些测试台数据进行比较,请确保长度正确。在大多数情况下,“Hello, World”的长度应该是 12,但在这里我认为它是 13,因为 sizeof() 也计算 ascii 零字符。

标签: c openssl sha1


【解决方案1】:

我也花了一段时间才弄明白。最好的方法是使用 EVP,它提供了几乎所有东西的通用函数。

#include <openssl/evp.h>

在调用哈希函数之前,您需要先调用这个 im main。初始化你的哈希。否则openssl会报错算法不可用。

OpenSSL_add_all_algorithms();

mode 必须是“SHA256”、“SHA512”、“SHA1”作为字符串。 dataToHash 是输入,dataSize 是输入的大小, outHashed 应该已经分配好了,hash 会写在那里

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++包装器中使用了上面的代码)

const char *inData = "test data2";
unsigned char outHash[20]; // output is already allocated
hash("SHA1", inData, 10, outHash);

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

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

【讨论】:

  • 感谢您的大力帮助。我也遇到了 evp.h 已弃用的问题。我现在应该使用其他的东西吗?
  • @user1626342 嗯,这很奇怪,你不应该对 evp 被弃用有任何问题。您可以发布代码/警告吗?
  • 我想因为我使用的是 mac OS,所以我不得不添加一堆 if 标头。
【解决方案2】:

您不能以这种方式转储整个缓冲区。你需要循环它,如下所示。您为输出获得的值实际上是hash 缓冲区的地址,这显然不是您想要的。您希望缓冲区中的十六进制字节转储为文本

所以...

int main()
{
    const unsigned char data[] = "Hello, World";
    unsigned long length = sizeof(data);
    unsigned char hash[SHA_DIGEST_LENGTH];
    SHA1(data, length, hash);

    int i=0;
    for (;i< sizeof(hash)/sizeof(hash[0]);++i)
        printf("%02x \n", hash[i]);

    return 0;

}

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

【讨论】:

    【解决方案3】:
    printf("%02u \n", hash);
    

    通过打印 unsigned char 删除警告

    【讨论】:

    • 这是不对的。如果值
    猜你喜欢
    • 2013-05-22
    • 2021-05-09
    • 2021-04-11
    • 2011-06-03
    • 2012-03-16
    • 1970-01-01
    • 2012-01-10
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多