2015-03-01 57 views
0

作为一个新手,我正在阅读最近的杂凑函数和BLAKE2吸引我的论文。然后我想在代码包中使用“blake2s”代码。BLAKE2输入参数

如果我要实现一个简单的字符串散列函数,我可以理解,有一个键和盐的内置变量。

但我无法弄清楚如何提供一个字符串或文件作为输入并收集哈希作为输入。哪些变量负责消息和摘要?

也许我做错了,但以下不打印任何输出。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "blake2s.h" 
#include "blake2s.c" 

#define SIZE 1024 

int main(){ 
    unsigned char *str, *hash; 
    str = malloc(SIZE * sizeof *str); 
    hash = malloc(32 * sizeof *str); 
    printf("> "); 
    scanf("%s", str); 
    int a = blake2s(hash, str, NULL, 32, 1024, 0); 
    if(a) 
     printf("%s", hash); 
    return 0; 
} 
+0

哎呀。如果我现在要用盐,那么我需要从/ dev /(u)中随机输入salt吗? – sprkv5 2015-03-01 13:01:03

+0

我没有在使用salt特性时看到很多观点,AFAIK参考实现并未公开它。第三个参数是关键,你想用什么作为关键取决于你在做什么。这与HMAC或HKDF的关键几乎相同。 – CodesInChaos 2015-03-01 13:03:10

+0

请注意'scanf(“%s”,str)'只能读取第一个空格(空白,制表符,换行符)。打印你阅读的数据通常是一个好主意,这样你就知道程序得到了你想象的结果。如果你在程序中键入单词,只有第一个单词将被散列。或者,更糟糕的是,如果'blake2s()'的1024参数表示“有1024个字节的数据要散列”,那么您将不确定的数据传递给函数,因为'malloc()'不必将分配的内存设置为任何具体的价值。 – 2015-03-02 18:03:41

回答

2

你的程序有直接相关的印刷哈希两个问题:

  1. 成功通过返回0表示。所以你if需要通过类似

    if(a==0) 
        printf("%s", hashStr); 
    else 
        printf("error %d", a); 
    
  2. 哈希是原始二进制,甚至可以包含\0字节来代替。在打印之前,您应该应用十六进制或Base64编码。

和其他一些bug和风格问题:

  1. 你可能想以取代strlen(str)传递给散列器1024,所以只哈希实际的字符串。

  2. 如果用户输入超过1024个字节,程序将遭受缓冲区溢出。在测试程序中没有大问题,但是应该在正确的实现中修正它,因为它会成为安全漏洞。

  3. sizeof(char) == 1定义