Script per permutazione

  • Creatore Discussione Creatore Discussione marcomg
  • Data di inizio Data di inizio

marcomg

Utente Attivo
19 Nov 2011
204
0
16
Ciao a tutti, avrei la necessità di avere uno script che dato un insieme di caratteri mi trovi tutte lo combinazioni possibili decidendo la lunghezza, io he ho fatto uno, vi posto il codice dopo, ma il problema è che non so come evitare un for ad ogni lungezza. Ad esempio se lo voglio trovare una password con 6 caratteri devo inserire 6 for concatenati? Non si potrebbe fare richiamando una funzione più volte? Non sono molto pratico :muro:

Ecco lo script:
PHP:
#!/usr/bin/php
<?php
$file = fopen("file.txt", "a");
function save($string){
	global $file;
	fwrite($file, $string.PHP_EOL);
}
$stringa_caratteri = "abcdefghijklmnopqrstuvwxyz";
$array_caratteri = str_split($stringa_caratteri);
$numero_di_caratteri = count($array_caratteri);
$ultimo_dell_array = $numero_di_caratteri-1;

// Ora setto il tutto per farlo con 5 caratteri:
for($_05=0; $_05<=$ultimo_dell_array; $_05++){
	for($_04=0; $_04<=$ultimo_dell_array; $_04++){
		for($_03=0; $_03<=$ultimo_dell_array; $_03++){
			for($_02=0; $_02<=$ultimo_dell_array; $_02++){
				for($_01=0; $_01<=$ultimo_dell_array; $_01++){
					for($_00=0; $_00<=$ultimo_dell_array; $_00++){
						save($array_caratteri[$_05].$array_caratteri[$_04].$array_caratteri[$_03].$array_caratteri[$_02].$array_caratteri[$_01].$array_caratteri[$_00]);
					}
				}
			}
		}
	}
}

fclose($file);
?>

C'è qualcuno disposto ad aiutarmi?

Grazie :D
 
Ciao,
quello che vuoi fare tu si chiama attacco brute force ( forza bruta )

Ne approfitto per segnalare questo articolo che spiega in modo semplice l'efficacia di questo tipo di attacco e quindi l'importanza di scegliere password complesse
 
Dei tempi di attesa li conosco e volendo saprei anche come accorciarli... Ma non mi interessa, mica devo scassinare le password delle persone, anche solo a pensare lo spazio che occuperebbero!
È solo per diletto e per imparare!
Come mi consigli di modificarlo?
 
Ultima modifica:
ciao
ho visto la risposta di criric, che ritengo giusta, ed anche la tua che però, nel caso tu volessi davvero forzare delle pass, non lo ammeteresti di certo.
comunque passiamo ad una semplice matematica applicata al tuo esempio tutte le combinazioni di 26 elementi presi a gruppi di 5.
mi sembra di intuire che tu metta la combinazione dentro un array con chiave [$_nn], credo che non ti basti se come dici vuoi le combinazioni possibili.
se vuoi le combinazioni possibili dovresti farti un array di

combinazioni_possibili=n!/((n-k)!*k!)=26!/(16!*5!)= 160.626.866.400 elementi

se poi addiruttura dovessi fare le dispossizioni (sempre 26, 5 a 5)
disposizioni_possibili=n!/(n-k)!=26!/16!=19.275.223.968.000 elementi

poi visto che dici che il tempo non ti interessa consideriamo la minore (combinazione) e che tu abbia un pc veloce che ti estragga una combinazione in 1/1000 di sec

tempo=160.626.866.400*(1/1000)/3600= 44.618 ore circa => 1859 giorni

http://it.wikipedia.org/wiki/Combinazione
http://it.wikipedia.org/wiki/Disposizione
 
Diciamo che mi interessa una cosa prettamente teorica, metterla in pratica (per quanto potrei farlo) non mi converrebbe, servirebbero troppi soldi e troppa corrente...
Quello che mi interessa è semplicemente la progettazione dello script che effettui un brute force. Poi se lo utilizzi o no sono fatti miei, anche se posso assicurarvi che non lo farò. L'articolo che mi ha segnalato criric ha ragione sul tempo, ma se io riducessi i caratteri a 5 caratteri e la password fosse di 8 caratteri la riterrei possibile. È solo per fare una prova 0:)
Ciò che ho scritto nel primo post è un'idea di come procedere che mi è venuta facendolo a mano, ovvero invece di contare con il sistema decimale (10 simboli) di contare con un sistema in base n e di utilizzare come simboli quelli che sono (nel mio script) quelli contenuti nell'array $array_caratteri.

Ora chiedevo solo (visto che non è che sia bravo nella programmazione php) come evitare di ripetere un ciclo for ad ogni volta che si aumentano (si fa per dire) unità, decine, centinaia, migliaia, eccetara eccetara.


Se mi aiuterete o ci proverete vi sarò grato,
marcomg
 
Non era mia intenzione dire che stai creando uno script per entrare nel sistema di qualcun'altro
ma questa discussione verrà letta da centinaia di persone diverse, alcune delle quali potrebbero avere questo scopo

Non credo che sia il caso che io ti posti o ti aiuti a creare uno script del genere

Sono d'accordo con te sul fatto che sarebbe un ottimo allenamento mentale, inoltre secondo me, se sai come fare un attacco brute force sai anche come difenderti.

Argomento altrettanto interessante appunto è come difendersi da tali attacchi

In un sistema di login è bene registrare sia gli accessi riusciti che i tentativi di accesso
PHP:
if(login_succes) {
    INSERT INTO tabella accessi 
} else {
    INSERT INTO tabella accessi negati
}

Registrando i tentativi di accesso con tanto di data e ip si puo facilmente creare una query per verificare che lo stesso ip non abbia tentato l'accesso per piu di 3 volte nell'arco di 10 secondi per esempio, risultato difficile da replicare da un essere umano, e in tal caso bloccare l'accesso a quell'ip per tot minuti o chiedere di inserire un codice captcha o qualsiasi altra soluzione venga in mente per proteggersi
 
Ultima modifica:
@criric
Grazie per l'idea del login ;) non ci avevo mai pensato. Io avevo messo un captha e ho pensato di essere a posto. Un brute force a mano credo sia impossibile. Non si sa mai...


Credo che informare la gente su come "contare con le lettere". Poi se venga usato per generare un pid oppure per effettuare un brute force credo siano problemi di chi lo usa. Un coltello può salvare una vita o spezzarla. È uno strumento e può essere utilizzato per qualunque fine. Se pensate che eliminare tutti i coltelli sia una soluzione. Siete liberi di pensarlo, ma non condivido.

Comunque alla fine ho risolto. Lo script arranca (bisogna perfezionarlo). Se volete lo posto, altrimenti lo tengo per me e lo divulgherò tramite altri mezzi.

A dopo,
marcomg
 

Discussioni simili