Te refieres a algo como utilizar el valor en formato base32 para realizar el hasheo y demas?
He modificado la funcion para poder testeaar varios valores al mismo tiempo:
function hotp($key,$c) {
$mask = ['f' => '7','e' => '6','d' => '5','c' => '4','b' => '3','a' => '2','9' => '1','8' => '0'];
echo "key: $key\n";
echo "c: $c\n";
echo "hash: $hash_value_str\n";
echo "4bits (hex): ".$hash_value_str[39]."\n";
$offset = intval($hash_value_str[39],16)*2; $extract = substr($hash_value_str,$offset,8); echo "extract: $extract\n";
if(isset($mask[$extract[0]])) { echo $extract[0]."& 7 =";
$extract[0] = $mask[$extract[0]];
echo $extract[0]."\n";
echo "new extract: $extract\n";
}
echo "Value: $value\n";
return ($value % 1000000);
}
Y ahora solo tengo que hacer:
$base32 = new Base2n(5, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', FALSE, TRUE, TRUE);
$key = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
echo "Key in base32: ".$base32->encode($key)."\n";
printf("%06d\n",hotp
($key,$ct)); printf("%06d\n",hotp
($base32->encode($key),$ct));
Tiene muchos Echo la funcion que se pueden comentar, estan ahi para de momento validar que la funcion esta haciendo bien los pasos del algoritmo.
Alguna salida es:
Key in base32: IFAUCQKBIFAUCQKBIFAUCQKBIFAUCQKBIFAUCQKBIFAUCQKBIFAQ====
key: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
c: 52566234
hash: 428fc537d16c867ee7e1b4b3cc432c7e288d5769
4bits (hex): 9
extract: e1b4b3cc
e& 7 =6
new extract: 61b4b3cc
Value: 1639232460
232460
key: IFAUCQKBIFAUCQKBIFAUCQKBIFAUCQKBIFAUCQKBIFAUCQKBIFAQ====
c: 52566234
hash: a49ac9470db4a542a36b42d28b7e089e11123f8a
4bits (hex): a
extract: 42d28b7e
Value: 1121094526
094526
Ahora como comentas he probado la llave en su formas de AAAAA y en sus forma en base32.
El google Authenticator lo configuro de la siguiente manera:
Primero agrego la llave en su formato base32

Y obtienes los valores

Pero no coincide con lo que arroja el programa, tengo la duda de saber si el valor $C es correcto, lo obtengo del time/30:
Saludos!
MOD: Imagenes adaptadas a lo permitido.