二进制转换结果为00000000000



我正在测试一些生成密码的代码:

<?php
//8076?
$key = '8076e852267ecefe2a80c76b66ba8ca99fb7874fa5556e8b64f4707003f4aed0';
$a = time() . $key;
print "a = $a" . PHP_EOL;
$b = sprintf('%b', $a);                            
print "b = $b" . PHP_EOL;
$totp = hash('sha3-256', $b);
print "totp = $totp" . PHP_EOL;
$x = gmp_init(0);
$y = gmp_init(1);
for ($i = strlen($totp) - 1; $i >= 0; $i--, $y = gmp_mul($y, 16))
$x = gmp_add($x, gmp_mul($y, hexdec($totp[$i])));
print "x = $x" . PHP_EOL;
print sprintf('%08d', gmp_strval(gmp_mod($x, '100000000')));
print PHP_EOL;

结果是:

a = 16407820138076e852267ecefe2a80c76b66ba8ca99fb7874fa5556e8b64f4707003f4aed0
b = 0
totp = f9e2eaaa42d9fe9e558a9b8ef1bf366f190aacaa83bad2641ee106e9041096e4
x = 113026826332749616999480801584179790214435636530758034338031008093509348529892
48529892

为什么b=000000

每次使用这个密钥生成它时,我都需要有一个不同的密码。我知道这很愚蠢,一个随机数会起作用,就像";"安全";。安保人员让我这么做。我是一名软件工程师。

这个十六进制数字有点奇怪。对于其他价值观,我得到了一个好结果。例如$key="3a8b9846009b54bb7a11e900e9b50000a6e14da4c4c2ef49f4016c326c339694"工作正常。

您将字符串$a格式化为一个没有意义的二进制数字,您需要对其进行转换。您需要使用pack,然后将该二进制值转换为字符串或整数,或者保持原样,无论您需要什么。

现在可以工作了。(十六进制字符串不包含有效的十六进制值,所以我使用了每个字符(


<?php
//$key = '8076e852267ecefe2a80c76b66ba8ca99fb7874fa5556e8b64f4707003f4aed0';
//$key = '3a8b9846009b54bb7a11e900e9b50000a6e14da4c4c2ef49f4016c326c339694';
$key = '145bfea3b819bee905b5d5295338964150c489789a9228f2e981b189de5cbbee';
$a = '';
for ($i = 0; $i < strlen($key); $i++)
$a .= decbin(ord($key[$i]));
$a .= decbin(time());
print "a = $a" . PHP_EOL;
$totp = hash('sha3-256', $a);
print "totp = $totp" . PHP_EOL;
$x = gmp_init(0);
$y = gmp_init(1);
for ($i = strlen($totp) - 1; $i >= 0; $i--, $y = gmp_mul($y, 16))
$x = gmp_add($x, gmp_mul($y, hexdec($totp[$i])));
print "x = $x" . PHP_EOL;
print sprintf('%08d', gmp_strval(gmp_mod($x, '100000000')));
print PHP_EOL;

相关内容

  • 没有找到相关文章

最新更新