Per craccare password con attacco dizionario si utilizzano file contenenti parole di senso compiuto,o password statisticamente probabili. Ma per craccare le cosiddette "password forti" si deve ricorrere al metodo bruteforce , ovvero provare tutte le combinazioni possibili di un determinato gruppo di caratteri.Per risolvere , con algoritmi , questo genere di problemi le formule del calcolo combinatorio che interessano sono 3:
A)Calcolo combinazioni senza ripetizione , in sostanza dato un gruppo di caratteri es. "abc" , e impostando la lunghezza delle password es. 2, come risultato di questo calcolo si ottengono le coppie ab,ac,bc.Il numero di combinazioni valide si calcola con la formula:
C=k!/(n!*(k-n)!)
Dove , con i dati del' esempio, k=3 e n=2.
B)Calcolo permutazioni semplici, dato un gruppo di caratteri es."abc" , come risultato di questo calcolo si ottengono le terne abc,acb,bca,cba,bac,cab.Il numero di combinazioni si calcola con la formula:
C=k!
Dove, con i dati dell' esempio, k=3.
C)Calcolo disposizioni semplici, dato un gruppo di caratteri es. "abc", e impostata la lunghezza delle password es. 2, come risultato di questo calcolo si ottengono le coppie ab,ac,bc,ba,ca,cb.Il numero di combinazioni valide si calcola con la formula:
C=k!/(k-n)!
Dove, con i dati dell' esempio, k=3 e n=2.
E' ovvio che le disposizioni semplici si ottengono applicando ad ogni gruppo generato dalle combinazioni semplici, l'algoritmo per la generazione delle permutazioni semplici.Facciamo un esempio pratico , se volessi cercare una password composta solo dai caratteri del sistema di numerazione esadecimale (1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f) e sapessi che la lunghezza della password è di 10 caratteri,allora dovrei provare tutte le disposizioni semplici con k=16 e n=10.
Il problema si presta molto bene ad essere risolto con algoritmi ricorsivi, recentemente ho tradotto alcuni algoritmi ,scritti originariamente in C e C++, in PHP.Come ho detto prima gli algoritmi sono 2 e non 3, in quanto il terzo è solo la combinazione degli altri 2.
Algoritmo PHP combinazioni senza ripetizione:
<?php
function combinazioni($str,$combi){
global $COMBI;
global $temp;
$tot=strlen($str);
for($y=0;$y<$tot;$y++){
$temp=$temp.substr($str, $y , 1);
if(strlen($temp)==$COMBI){
echo $temp,"<br />";
$rr=strlen($temp);
$temp=substr($temp,0 , $rr-1);
}
else{
if($combi==0)
return;
if(($tot-$y-1)>0)
$str1=substr($str, -($tot-1-$y));
if(($tot-$y-1)>0)
combinazioni($str1,($combi-1));
$rr=strlen($temp);
$temp=substr($temp,0 , $rr-1);
}}}
$temp="";
$str="abc";//dati dell' esempio
$COMBI=2;//dati dell'esempio
$combi=2;//dati dell'esempio
combinazioni($str,$combi);
?>
Algoritmo PHP permutazioni semplici:
<?php
function permutazioni($str,$i,$n){
global $str;
if($i==$n)
{
for($j=0;$j<=$n;$j++)
echo substr($str, $j , 1);
echo "<br />";
}
else
{
for( $j = $i ; $j<=$n ; $j++ )
{
Swap($str,$i,$j);
permutazioni($str,$i+1,$n);
Swap($str,$i,$j);
}}}
function Swap( $str, $ind1,$ind2){
global $str;
$as=strlen($str);
$temp1=substr($str, $ind1 , 1);
$temp2=substr($str, $ind2 , 1);
for($r=0;$r<$as;$r++){
if($r==$ind1)
$temp3=$temp3.$temp2;
elseif ($r==$ind2)
$temp3=$temp3.$temp1;
else
$temp3=$temp3.substr($str, $r , 1);
}
$str=$temp3;
return;
}
$str="abc";//dati dell' esempio
permutazioni($str,0,strlen($str)-1);
?>
Entrambi gli algoritmi sono facilmente traducibili in C/C++, per onestà devo dire che l'algoritmo delle permutazioni semplici non è stato scritto da me ma solo tradotto in PHP.Ho implementato questi algoritmi su questo sito http://danieler.altervista.org/ ,purtroppo ho dovuto porre una limitazione alla lunghezza della stringa, sia per non consumare troppe risorse sul server altervista, sia perché stringhe lunghe avrebbero dato origine a pagine molto pesanti causando rallentamenti del browser.
Nessun commento:
Posta un commento