2012-10-23 40 views
2

這裏之間SHA512的不同是C代碼:OpenSSL和PHP

#include <openssl/sha.h> 
#include <stdio.h> 
char *hash_sha512(char *data){ 
    SHA512_CTX ctx; 
    char *md=malloc(sizeof(char)*(SHA512_DIGEST_LENGTH+1)); 

    SHA512_Init(&ctx); 
    SHA512_Update(&ctx, data, strlen(data)); 
    SHA512_Final(md, &ctx); 
    md[SHA512_DIGEST_LENGTH]='\0'; 

    return md; 
} 
int main(int argc, char *argv[]){ 
    str=hash_sha512("GFLOuJnR19881218"); 
    printf("%s\n", str); 
    free(str); 
    return 1; 
} 

輸出:

< 4IIA [RΗ#6π 8jDJb9ږ^ X

這裏是PHP代碼:

$hash=hash('sha512', 'GFLOuJnR19881218', TRUE); 

輸出:?

<>4ǰII-A [RΗ#D6π8jDĴ b9 ږ ^X

C代碼和PHP代碼的結果不一樣,我的代碼出了什麼問題?

+1

你什麼錯誤?發表一些例子。 –

+0

最有可能的'data'和'$ data'是不同的。 –

+0

打印C和PHP函數的輸入和輸出,所以我們可以看到你在用''不同'來談論什麼 – Mike

回答

3

輸出亂碼,因爲輸出是瀏覽器試圖顯示爲ASCII或UTF-8而不能輸出的二進制字符串。您需要將它們都編碼爲十六進制,十進制,base32或其他正常的人類表示,然後進行比較。

$binary = hash('sha512', 'GFLOuJnR19881218', TRUE); 
$hex = hash('sha512', 'GFLOuJnR19881218'); 
string hash (string $algo , string $data [, bool $raw_output = false ]) 

設置爲TRUE時,輸出原始二進制數據。 FALSE輸出小寫的hexits。
- http://us2.php.net/manual/en/function.hash.php

+0

我的問題的關鍵不是亂碼,我想知道爲什麼C和PHP的輸出是不同的。 –

+0

@solomon_wzs,你怎麼知道它不同?你是從命令行和瀏覽器中的PHP運行C程序嗎?實際的字符串可能是相同的,這就是爲什麼你需要對它們進行編碼,所以我們可以肯定地知道還有一個問題。 – Xeoncross

+0

是的,你是對的。當我在shell中輸出php的輸出時,它與c的輸出相同。 –