2015-03-01 72 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定義