C使用sha2散列函数

C使用sha2散列函数,c,sha,C,Sha,如何使用哈希函数 void sha2( const unsigned char *input, int ilen, unsigned char output[32] ) { sha2_context ctx; sha2_starts( &ctx ); sha2_update( &ctx, input, ilen ); sha2_finish( &ctx, output ); memset( &ctx

如何使用哈希函数

void sha2( const unsigned char *input, int ilen,
           unsigned char output[32] )
{
    sha2_context ctx;

    sha2_starts( &ctx );
    sha2_update( &ctx, input, ilen );
    sha2_finish( &ctx, output );

    memset( &ctx, 0, sizeof( sha2_context ) );
}
我试过了

sha2(InpData, sizeof(InpData), OutData)

但是结果是我得到了垃圾数据。

没有看到
InpData
的声明,我们不能确定,(),但可能性是
InpData
是某种类型的指针,而不是数组。
sizeof()
运算符应用于指针时,其计算结果不是指向已分配存储的大小,而是指针的大小:通常为4或8个字节。

只需使用您想要输出的数据、长度和缓冲区来调用它

char* data = "my data to hash";
int datalen = strlen(data);       // or if binary data, the size of your input
unsigned char buffer[32];         // The buffer to receive the result

sha2(data,datalen,buffer);
请注意,缓冲区中接收的数据是二进制数据(如果是SHA-256,则为32*8=256位),因此您需要在将结果显示到屏幕之前对其进行hex/base64/等编码

编辑:非常简单和黑客十六进制编码完全没有干净的代码点:)


memset
的要点是什么?@CarlNorum
memset
的唯一要点是不要在堆栈上留下可用于对原始字符串进行反向工程的SHA-2上下文。散列具有反转的弹性,上下文状态可能不是。当然,在这种情况下,整个问题是原始字符串没有被覆盖…:)它没有帮助,仍然得到垃圾数据,但我得到的时间长了一点:ĹWç=pÓK1Ău!SŕDđDđa;正确的哈希是:D7A8FBB307D780946CA9ABCB0082E4F8D5651E46D3CDB762D002D0BF37C9E592阅读底部的注释,您想要的结果是十六进制编码的二进制,而来自sha2的结果只是纯二进制。如何简单地用C将其编码到asci,sry供新手提问,im在C中是新的?@user2304765添加了一个简单的十六进制编码。如果您没有得到正确的结果,我们需要知道您试图编码什么以尝试重复结果,因此您需要添加一些代码。仍然有效,以下是警告,来源:
char* hexencode(void* data, int len)
{
  char* outdata = malloc(len*2+1);
  char* tmp = outdata;
  unsigned char* indata = (char*)data;
  while(len--)
  {
    *tmp++ = "0123456789abcdef"[(*indata)>>4];
    *tmp++ = "0123456789abcdef"[(*indata++)&0xf];
  }
  *tmp = 0;
  return outdata;
}