我正在尝试设置HMAC-SHA-256哈希的基本测试,但是引擎设置存在问题。理想情况下,我只想设置HMAC-SHA算法,但到目前为止,我什至没有得到加载所有算法都能正常工作的一般情况。目前,我在尝试设置默认摘要的行上出现段错误。

另外,我通常是Java专家,所以请不要犹豫指出代码中的任何错误。

#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
  unsigned char* key = (unsigned char*) "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b";
  unsigned char* data = (unsigned char*) "4869205468657265";
  unsigned char* expected = (unsigned char*) "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7";
  unsigned char* result;
  HMAC_CTX* ctx;
  ENGINE* e;

  ENGINE_load_builtin_engines();
  ENGINE_register_all_complete();
  ENGINE_set_default_digests(e);

  HMAC_CTX_init(ctx);
  HMAC_Init_ex(ctx, key, 40, EVP_sha256(), e);
  result = HMAC(NULL, NULL, 40, data, 16, NULL, NULL);
  HMAC_CTX_cleanup(ctx);

  ENGINE_finish(e);
  ENGINE_free(e);

  if (strcmp((char*) result, (char*) expected) == 0) {
    printf("Test ok\n");
  } else {
    printf("Got %s instead of %s\n", result, expected);
  }
}

编辑:该程序现在已经演变为以下内容,但是我仍然在HMAC_Init_ex上进行隔离:
unsigned char* key = (unsigned char*) "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b";
unsigned char* data = (unsigned char*) "4869205468657265";
unsigned char* expected = (unsigned char*) "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7";
unsigned char* result;
unsigned int result_len = 64;
HMAC_CTX ctx;
ENGINE* e;

result = (unsigned char*) malloc(sizeof(char) * result_len);
e = (ENGINE*) ENGINE_new();

ENGINE_load_builtin_engines();
ENGINE_register_all_complete();
ENGINE_set_default_digests(e);

HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key, 16, EVP_sha256(), e);
HMAC_Update(&ctx, data, 40);
HMAC_Final(&ctx, result, &result_len);
HMAC_CTX_cleanup(&ctx);

ENGINE_finish(e);
ENGINE_free(e);

最佳答案

正如Martin所说,您最初的建议存在的问题是您需要初始化ENGINE。编辑后的代码的问题在于您正在执行ENGINE_new,这将为您提供一个全新的ENGINE,然后您需要为其提供密码方法,摘要方法等。事实上,对于您想要的(以及什么)几乎每个人都想要),而完全忽略所有ENGINE的东西是正确的选择。

一些附属问题:

  • 您的字符串是十六进制的,但是每个字符需要一个\x才能在字符串中的该位置实际获得该十六进制字节,我怀疑这是您想要的。
  • 您试图从“数据”中散列40个字节,但时间不长(实际效果:您最终会部分散列结果字符串)
  • 您的预期结果(据我所知)是不正确的
  • 您将在终端上打印出随机字符,因为HMAC函数将生成32字节的随机二进制数据,而不是可打印的内容。

  • 以下代码编译,运行并通过测试。它与您发现的示例代码有些不同(因为它仍然使用单独的HMAC_ *函数-如果您想使用HMAC_Update一点一点地进行哈希处理,则很有用):
    #include <openssl/engine.h>
    #include <openssl/hmac.h>
    #include <openssl/evp.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    
    int main(void)
    {
            unsigned char* key = (unsigned char*) "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b";
            unsigned char* data = (unsigned char*) "\x48\x69\x20\x54\x68\x65\x72\x65";
            unsigned char* expected = (unsigned char*) "\x49\x2c\xe0\x20\xfe\x25\x34\xa5\x78\x9d\xc3\x84\x88\x06\xc7\x8f\x4f\x67\x11\x39\x7f\x08\xe7\xe7\xa1\x2c\xa5\xa4\x48\x3c\x8a\xa6";
            unsigned char* result;
            unsigned int result_len = 32;
            int i;
            HMAC_CTX ctx;
    
            result = (unsigned char*) malloc(sizeof(char) * result_len);
    
            ENGINE_load_builtin_engines();
            ENGINE_register_all_complete();
    
            HMAC_CTX_init(&ctx);
            HMAC_Init_ex(&ctx, key, 16, EVP_sha256(), NULL);
            HMAC_Update(&ctx, data, 8);
            HMAC_Final(&ctx, result, &result_len);
            HMAC_CTX_cleanup(&ctx);
    
            for (i=0; i!=result_len; i++)
            {
                    if (expected[i]!=result[i])
                    {
                            printf("Got %02X instead of %02X at byte %d!\n", result[i], expected[i], i);
                            break;
                    }
            }
            if (i==result_len)
            {
                    printf("Test ok!\n");
            }
            return 0;
    }
    

    当然,它并不能回答您最初关于如何初始化ENGINE的问题,但是如果没有更多上下文,这实际上是没有正确答案的,而上下文与您的情况不相关...

    关于c - 了解OpenSSL中的引擎初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/242665/

    10-13 03:33