使用加密API计算哈希

时间:2015-09-24 02:06:41

标签: c md5 cryptoapi

我一直在尝试使用加密API计算md5哈希,但是遇到了很多问题。

char * getHashedKey(char *keybuf) {
  char * output;
  struct scatterlist sg;
  struct crypto_hash *tfm;
  struct hash_desc desc;
  int i;

  printk("%s received keybuf %s %d\n", __func__, keybuf, strlen(keybuf));
  output = kmalloc(sizeof(*output) * 16, GFP_KERNEL);
  memset(output, 0x00, 16);

  // works if I overwrite value like this
  //keybuf = "abcdef012345";

  tfm = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC);
  desc.tfm = tfm;
  desc.flags = 0;

  sg_init_one(&sg, keybuf, strlen(keybuf));
  // tried type casting too
  //sg_init_one(&sg, (u8 *) keybuf, strlen(keybuf));
  crypto_hash_init(&desc);
  crypto_hash_update(&desc, &sg, strlen(keybuf));
  crypto_hash_final(&desc, output);

  for(i = 0; i < 16; i++)
  {
      printk("%x", output[i]);
  }
  printk("\n");

  return output;
}

这是我尝试过的: 1.如果“output”是unsigned char,我得到正确的输出,但是当我使用char时没有。

  1. 如果我过度写了keybuf的值,那么它才有效。

  2. 我尝试将某些论坛中提到的密钥转换为(u8 *),但这也不起作用

  3. 使用char的扭曲输出是:

    3ffffffe9ffffffb7ffffffb472ffffffe0ffffffed41225affffffebffffffdaffffffd3ffffffbaffffffabffffffde
    

    有人可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

您有两个显示问题。

首先:将char值 - 隐含地signed char - 作为printf()的参数传递,使其扩展为signed int。因此,传递具有高位设置的值(例如,0xe9,样本输出中的第二个字节)将使其符号扩展为0xffffffe9并按原样打印。

要解决此问题,请将output声明为unsigned char数组或等效类型u8

第二:您使用%x格式字符串打印每个字节,未指定填充。这会导致0x00xf之间的值打印为单个字符而不是两个,从而导致输出不明确。

要解决此问题,请使用%02x格式字符串。