为什么我不能将sha1输出传递给gmp_init()?

时间:2012-07-11 18:02:27

标签: php math base gmp

我今天检查了sha1的二进制参数,但我无法将生成的二进制字符串转换为基本62表示。

$str = 'mystring';
echo gmp_strval(gmp_init(sha1($str), 16), 62), PHP_EOL;      // Works
echo gmp_strval(gmp_init(sha1($str, true), 2), 62), PHP_EOL; // Fails
// Same with base_convert()...
echo base_convert(sha1($str), 16, 32), PHP_EOL;              // Works
echo base_convert(sha1($str, true), 2, 32), PHP_EOL;         // Fails

结果:

MNun4i9wmY2M2sBvnq5Z8jDi7nk
0
jjhukjbflgg000000000000000000000
0

我想知道是不是因为gmp_init()base_convert()函数需要一个整数或字符串,这可能只是二进制数据。

1 个答案:

答案 0 :(得分:2)

@mario注释是正确的,要从二进制字符串表示转换为基数2,您必须执行:

$base2 = array_map('decbin', array_map('ord', str_split(sha1($str, true))));

或者来自十六进制摘要:

$base2 = array_map('decbin', array_map('hexdec', str_split(sha1($str), 2)));

然后你需要做的就是将每个$base2的值填充为8位,然后将其内容压缩。


值得注意的是,您的base_convert来电会溢出,所以请不要依赖它。

另一个(相当重要的)是charset gmp用于base> 10实际上是:

0123456789A..Za..z

base_convert和哈希函数使用的内容相反:

0123456789a..f[g..zA..Z]

我建议您使用strtoupper对哈希进行编码,并使用strtr对其进行解码,like this