Come decodificare str_shuffle (PHP) per ottenere le sue uscite mt_rand

1
$output = str_shuffle("12345");

es. $output è ora 25134 Come faccio a sapere quali numeri sono usciti da mt_rand() per consentire lo shuffle Voglio sapere questo perché voglio il seme di mt_rand() e str_shuffle() utilizza mt_rand() che non è crittograficamente sicuro poiché utilizza Mersenne Twister (Wikipedia) So che shuffle per Python utilizza il Fisher Yates shuffle (Wikipedia) ma non ho idea di come funzioni in PHP. puoi ottenere il seed utilizzato se hai 624 output utilizzando mersenne-twister-recover (GitHub) o puoi bruto forza il seme con untwister (GitHub)

    
posta OfficialNoob 29.06.2018 - 17:00
fonte

1 risposta

1

Secondo sorgenti 7.2.7 di PHP , il La funzione str_shuffle utilizza php_string_shuffle che fa

while (--n_left) {
    rnd_idx = php_rand();
    RAND_RANGE(rnd_idx, 0, n_left, PHP_RAND_MAX);
    if (rnd_idx != n_left) {
        temp = str[n_left];
        str[n_left] = str[rnd_idx];
        str[rnd_idx] = temp;
    }
}

Quindi suppongo che ti piacerebbe conoscere i valori intermedi di rnd_idx (poiché php_rand() è un alias di php_mt_rand() ).

Ma RAND_RANGE è una macro definita come #define RAND_RANGE(__n, __min, __max, __tmax) (__n) = php_mt_rand_range((__min), (__max)) , quindi il 1 ° valore di php_rand() è già perso all'istante.

Quindi, non otterrai l'elenco di tutti i valori intermedi mt_range() .

Tuttavia, sapendo che l'algoritmo sembra essere at each round, swap the current letter with a random letter before in the input string; the 1st round takes the last letter as the current one; the next round takes the letter previous current letter as the new current letter , puoi ottenere il valore mt_rand ragionando all'indietro.

Se ABCD è il valore di input e BADC è il risultato, significa che i valori erano 2;2;0 ( ABCD = > ABDC = > ABDC = > BADC ) ma non conosci ancora il valore delle chiamate "perse" in php_mt_rand . Quindi la sequenza di mt_rand era in realtà ?;2;?;2;?;0 che corrisponde al seme 4 e 25 : se fai mt_srand(4); echo str_shuffle('ABCD'); otterrai BADC e lo stesso se il tuo seme è impostato su 25 . Avresti bisogno di una lunga catena di caratteri unici per ottenere una sequenza abbastanza lunga da corrispondere a un solo seme.

    
risposta data 29.06.2018 - 18:09
fonte

Leggi altre domande sui tag