我一直在尝试使用加密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时没有。
如果我过度写了keybuf的值,那么它才有效。
我尝试将某些论坛中提到的密钥转换为(u8 *),但这也不起作用
使用char的扭曲输出是:
3ffffffe9ffffffb7ffffffb472ffffffe0ffffffed41225affffffebffffffdaffffffd3ffffffbaffffffabffffffde
有人可以帮我这个吗?
答案 0 :(得分:1)
您有两个显示问题。
首先:将char
值 - 隐含地signed char
- 作为printf()
的参数传递,使其扩展为signed int
。因此,传递具有高位设置的值(例如,0xe9
,样本输出中的第二个字节)将使其符号扩展为0xffffffe9
并按原样打印。
要解决此问题,请将output
声明为unsigned char
数组或等效类型u8
。
第二:您使用%x
格式字符串打印每个字节,未指定填充。这会导致0x0
和0xf
之间的值打印为单个字符而不是两个,从而导致输出不明确。
要解决此问题,请使用%02x
格式字符串。