【问题标题】:The different of SHA512 between openssl and php [closed]openssl和php之间SHA512的不同[关闭]
【发布时间】:2012-10-13 15:47:04
【问题描述】:

这里是 C 代码:

#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;
}

输出:

这是 PHP 代码:

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

输出:

�4��ǰ��II�-A[r�?�� �Η#��D6π�8jD���?���J�b9���^X�

C代码和PHP代码的结果不一样,我的代码有什么问题?

【问题讨论】:

  • 你得到什么错误?贴一些例子。
  • data$data 很可能不同。
  • 打印 C 和 PHP 函数的输入和输出,这样我们就可以看到你在用 different 讨论什么
  • C代码和PHP代码都可以,但是输入相同的字符串结果不同。
  • 字符串之间有足够的相似性,可以断定你被编码弄糊涂了。

标签: php c hash sha


【解决方案1】:

输出是乱码,因为输出是一个二进制字符串,浏览器试图将其显示为 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 输出小写十六进制。
- http://us2.php.net/manual/en/function.hash.php

【讨论】:

  • 我的问题不是乱码,我想知道为什么C和PHP的输出不一样。
  • @solomon_wzs,你怎么知道它不一样?您是从命令行运行 C 程序并在浏览器中运行 PHP 吗?实际的字符串可能是相同的,这就是为什么您需要对它们进行编码以便我们可以确定是否存在问题。
  • 是的,你是对的。当我在shell中打印php的输出时,它与c的输出相同。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2011-04-04
  • 2010-12-06
  • 2012-07-16
  • 1970-01-01
  • 2018-06-07
相关资源
最近更新 更多