2015-09-02 54 views
0

我想了解openssl庫與CLI相比如何工作,並且無法設法找到如何在這兩者中使用SHA256來獲得相同的答案。SHA256有表cli和openssl庫

使用im OpenSSL的1.0.1e-FIPS 2013年2月11日

我的CLI命令是

echo a | openssl sha256 

輸出

(標準輸入)= 87428fc522803d31065e7bce3cf03fe47596631e5e07bbd7a0fde60c4cf25c7

C程序

int main(int argc, char *argv[]) { 
    unsigned char  msg[ 100 ]; 
    long unsigned int msg_len; 
    unsigned char  md[ SHA256_DIGEST_LENGTH ];  // SHA256_DIGEST_LENGTH = 32 

    msg_len = 100; 
    memset(msg, 0, msg_len); 
    msg[ 0 ] = 'a'; 
    msg[ 1 ] = '\0'; 

    if (! simpleSHA256(msg, msg_len, md)) { 
     return 1; 
    } 

    hex_print(md);   // for 0<=i<=32 do printf("%02x", md[ i ]); 
} 

其中

bool simpleSHA256(void *input, unsigned long length, unsigned char *md) { 
    SHA256_CTX context; 
    if (! SHA256_Init(&context)) 
     return false; 
    if (! SHA256_Update(&context, (unsigned char*)input, length)) 
     return false; 
    if (! SHA256_Final(md, &context)) 
     return false; 

    return true; 
} 

與輸出:

653504743d03afc72051d85fce9bcb8afd05d7911e5c9fe91265fa36d7d98b0 

我究竟做錯了什麼?導致這兩者都假設給出相同的輸出

+1

有一件事肯定是'echo a'會打印出'a','\ n'。換行符可以通過'echo -n a'來抑制。但結果仍然不同,所以這不是全部答案。 – DevSolar

回答

3

當你做echo a它打印字母一個換行符。所以你在C程序中使用的字符串應該是"a\n"

此外,你做數組的所有的校驗和,不僅在命令行示例中使用的兩個字母。改用適當的長度。

+1

OP在他們的例子中也處理了100個字符。 – Matthew

+0

沒有意識到它的問題....非常感謝!有效! –

+1

@ItaySela:密碼安全散列的一個重點是,輸入中的*分*改變會產生*完全*不同的輸出。而且由於散列應該也適用於二進制數據,所以零字節*做*重要。 ;-) – DevSolar