在PHP中获取128位二进制字符串的正确SHA-256哈希值

时间:2018-02-05 05:58:58

标签: php encryption binary cryptography sha256

我正在尝试在PHP中获得128位二进制字符串的正确SHA-256哈希值。以下是在https://cryptii.com/hash-function计算的正确哈希的示例:

二进制字符串: 00110001110010011100000110100111101100100111110011010100011010001000011111110111101000001111111011100011101100110101111101001011

SHA-256: eab9eee82d6427d3544129f43796a98b82455f28ec921083c23524757bdead91

我将二进制字符串存储在一个文本文件中,该文件用:

读取
// $binstring='00110001110010011100000110100111101100100111110011010100011010001000011111110111101000001111111011100011101100110101111101001011';
$binstring = file_get_contents('bin.txt');
$sha256 = hash('sha256', $binstring);
echo $sha256;
// Result:6112fa0eb3c8b8bbff62f2c85bf0aee09655d8f1d51f8a6b038dd5661e573f96

上面的代码导致显示不正确的 SHA-256哈希值。我想这是因为哈希函数是从字符串生成SHA-256而不是从实际二进制生成。

我尝试过将二进制文件传递给哈希函数的一些不同方法,但我认为在将二进制文件视为字符串以外的任何内容时,我受限于最大整数。

有人可以建议上述解决方案或解决方法吗?我知道PHP可能不是实现这一目标的最佳方式,但我想在查看其他解决方案之前看看是否可行。

我在下面的SHA-256哈希中添加了一些正确的二进制示例以供参考,这些也是使用上面的cryptii.com链接生成的:

二进制字符串:11001010101010001101001001100110011000000001001100000111101011001101111100000100100010111011110100010001010100000100000100101111

SHA-256: 9d6e178ab78d35647b916fd6d8988607cb4092338c0266c40ea2af70ef9c378a

二进制字符串: 01100011100110010011000001001010110000010110111100001010100101100111011000011011010111100011101100101111000101101010001000100101

SHA-256: 11024115219275eee8960fc1cd7b876842c162abc078fbbc92f5dd9e7b65a3a8

1 个答案:

答案 0 :(得分:1)

据我所知,PHP似乎没有任何内置方法将10的字符串转换为原始字节,因此您需要自己完成

这是一种可能的方法,在循环中一次读取8个字符(即每个字节)并转换为字符以构建字符串。

$binstring = '00110001110010011100000110100111101100100111110011010100011010001000011111110111101000001111111011100011101100110101111101001011';

$data = "";

for ($i = 0; $i < strlen($binstring); $i += 8) {
    $next = substr($binstring, $i, 8);
    $next = chr(bindec($next));

    $data .= $next;
}


$sha256 = hash('sha256', $data);
echo $sha256;

// Result: eab9eee82d6427d3544129f43796a98b82455f28ec921083c23524757bdead91