C BLAKE2输入参数

C BLAKE2输入参数,c,hash,cryptography,C,Hash,Cryptography,作为一个新手,我正在阅读关于最近一批散列函数的论文,这引起了我的兴趣。然后我想玩一下代码包中的“blake2s”代码 如果我要实现一个简单的字符串哈希器,我就可以理解密钥和salt有内置变量 但我不知道如何提供字符串或文件作为输入,并收集散列作为输入。哪些变量负责消息和摘要 也许我做错了,但下面没有打印任何输出 #include <stdio.h> #include <stdlib.h> #include <string.h> #include "blake2

作为一个新手,我正在阅读关于最近一批散列函数的论文,这引起了我的兴趣。然后我想玩一下代码包中的“blake2s”代码

如果我要实现一个简单的字符串哈希器,我就可以理解密钥和salt有内置变量

但我不知道如何提供字符串或文件作为输入,并收集散列作为输入。哪些变量负责消息和摘要

也许我做错了,但下面没有打印任何输出

#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;
}
#包括
#包括
#包括
#包括“blake2s.h”
#包括“blake2s.c”
#定义大小1024
int main(){
无符号字符*str,*hash;
str=malloc(大小*大小*str);
hash=malloc(32*sizeof*str);
printf(“>”);
scanf(“%s”,str);
inta=blake2s(散列,str,NULL,321024,0);
如果(a)
printf(“%s”,散列);
返回0;
}

您的程序有两个与打印哈希直接相关的问题:

  • 返回
    0
    表示成功。因此,您的
    if
    需要替换为以下内容

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

  • 还有一些其他错误和风格问题:

  • 您可能希望用strlen(str)替换传递给哈希器的1024,因此它只对实际字符串进行哈希运算

  • 如果用户输入的字节数超过1024字节,则程序会出现缓冲区溢出。测试程序中没有什么大问题,但您应该在适当的实现中修复一些问题,因为这将是一个安全漏洞

  • sizeof(char)==1


  • 哎呀。如果我现在给它加盐,那么我是否需要将盐从/dev/(u)random中输送出来?我认为使用salt特性没有多大意义,而且参考实现也没有公开它。第三个参数是键,要用作键的内容取决于您正在执行的操作。它与HMAC或HKDF的键几乎相同。请注意,
    scanf(“%s”,str)
    只读取第一个空格(空白、制表符、换行符)。通常,打印您读取的数据是一个好主意,这样您就知道程序得到了您认为它得到的东西。如果在程序中键入单词,则只对第一个单词进行哈希运算。或者,更糟糕的是,如果
    blake2s()
    的1024个参数表示“有1024字节的数据要散列”,则您将不确定的数据传递给函数,因为
    malloc()
    没有义务将分配的内存设置为任何特定值。