lunedì 22 ottobre 2012

Algoritmi per attacco bruteforce

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