2012-10-23 2 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); 
01,235 16,

출력 :?

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

C 코드와 PHP 코드의 결과가 다른데, 내 코드에 어떤 문제가 있습니까?

+1

무슨 에러가 발생합니까? 몇 가지 예를 게시하십시오. –

+0

'data'와'$ data'는 서로 다른 것 같습니다. –

+0

C와 PHP 함수 모두의 입력과 출력을 출력하여 'different'에 대한 이야기를 볼 수 있습니다. – Mike

답변

3

출력이 브라우저가 ASCII 또는 UTF-8로 표시하려고하는 이진 문자열이기 때문에 출력이 왜곡됩니다. 16 진수, 10 진수, 32 진수 또는 다른 일반 인간 표현으로 인코딩해야합니다.

string hash (string $algo , string $data [, bool $raw_output = false ]) 

TRUE로 설정

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

원시 이진 데이터를 출력한다. FALSE는 소문자 인 hexits를 출력합니다.

- http://us2.php.net/manual/en/function.hash.php

+0

내 질문의 요점은 왜곡되지 않습니다, 나는 왜 C와 PHP의 출력이 다른지 알고 싶습니다. –

+0

@solomon_wzs, 어떻게 다른지 알고 계십니까? 명령 줄에서 C 프로그램을 실행하고 브라우저에서 PHP를 실행합니까? 실제 문자열은 동일 할 수 있으므로 인코딩해야하므로 문제가 있는지 확실히 알 수 있습니다. – Xeoncross

+0

네, 맞습니다. 쉘에서 php의 결과를 출력 할 때, 이것은 c의 출력과 같습니다. –