当前位置:  开发笔记 > 编程语言 > 正文

了解OpenSSL中的引擎初始化

如何解决《了解OpenSSL中的引擎初始化》经验,为你挑选了1个好方法。

我正在尝试设置HMAC-SHA-256哈希的基本测试,但我遇到引擎设置问题.理想情况下,我只想设置HMAC-SHA算法,但到目前为止,我还没有得到加载所有算法的一般情况.目前我正在尝试设置默认摘要的行上获得段错误.

此外,我经常是一个Java人,所以不要犹豫,指出代码中的任何错误.

#include 
#include 
#include 
#include 
#include 

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

Jon Bright.. 14

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

一些辅助问题:

你的字符串是十六进制的,但你需要一个\ x每个字符来实际获得字符串中该位置的十六进制字节,我怀疑这是你想要的.

你试图从"数据"哈希40个字节,这不是那么长(实际效果:你最终部分哈希你的结果字符串)

你的预期结果是(据我所知)不正确

你会把随机字符打印到终端,因为HMAC函数会产生32字节的随机二进制数据,而不是可打印的东西.

以下代码编译,工作并通过测试.它与您找到的示例代码略有不同(因为它仍然使用单独的HMAC_*函数 - 如果您想使用HMAC_Update逐位进行散列,则非常有用):

#include 
#include 
#include 
#include 
#include 
#include 


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的原始问题,但是如果没有更多的上下文,那么实际上没有正确的答案,哪种情境在你的情况下并不相关......



1> Jon Bright..:

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

一些辅助问题:

你的字符串是十六进制的,但你需要一个\ x每个字符来实际获得字符串中该位置的十六进制字节,我怀疑这是你想要的.

你试图从"数据"哈希40个字节,这不是那么长(实际效果:你最终部分哈希你的结果字符串)

你的预期结果是(据我所知)不正确

你会把随机字符打印到终端,因为HMAC函数会产生32字节的随机二进制数据,而不是可打印的东西.

以下代码编译,工作并通过测试.它与您找到的示例代码略有不同(因为它仍然使用单独的HMAC_*函数 - 如果您想使用HMAC_Update逐位进行散列,则非常有用):

#include 
#include 
#include 
#include 
#include 
#include 


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的原始问题,但是如果没有更多的上下文,那么实际上没有正确的答案,哪种情境在你的情况下并不相关......

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有