Home > Progetti in C > Progetto ‘combina’

Progetto ‘combina’

Project combina is also now on freshmeat.net!

New release: combina 0.4.1!

“combina” è un generatore di password che utilizza quattro diversi algoritmi che si basano sul calcolo combinatorio implementando le Disposizioni Semplici o Permutazioni, Disposizioni con ripetizione (il famoso Brute Force), e le Combinazioni con e senza ripetizione! Supporta un numero illimitato di caratteri in input e restituisce l’hash MD5 e SHA1 delle password. Questa nuova release apporta le seguenti modifiche:

1 – aggiunta la man page;
2 – possibilità di installare il programma con il ‘# make install’;
3 – pacchetti Ubuntu (Dapper) disponibili;

Buon divertimento!


Vai alla sezione di download oppure continua leggendo la seguente breve introduzione al funzionamento:

Combinazioni…

…matematiche oppure no hanno sempre suscitato grande interesse e curiosità in tutte le situazioni in cui si sono presentate. Dal classico caso che capita quando cambi percorso per tornare a casa ed incontri un vecchio amico, al calcolo delle probabilità di fare un full quando scarti tre carte e mantieni in mano una coppia di donne.

Mondo matematico

C’è chi dice che il mondo è matematico 1, come dargli torto se tutto intorno a noi è soggetto a leggi fisiche e matematiche che si fondono per spiegarci il perchè di tutto. Io sono dell’opinione che le cose che non
riusciamo a capire oggi saranno oggetto di future scoperte scientifiche un domani e che non accade mai niente per caso. Bene, ora vediamo che tipo di combinazioni possono attirare la nostra attenzione e perchè sono spesso protagoniste nella nostra vita quotidiana. Parlavo, senza ombra di dubbio, di quelle che abbiamo conosciuto durante l’ora di matematica. Si, proprio quelle che ricordiamo sotto il nome di Calcolo Combinatorio.
Applicando quei teoremi e definendo un algoritmo logico, descriveremo la logica funzionale del programma che metteno in pratica quelle nozioni, a volte tediose e ripetitive, sicuramemte per colpa dell’insegnante :-) .

Al cinema

Quante volte abbiamo visto sul grande schermo quelle scene di intere videate piene di caratteri alfanumerici che freneticamente rincorrono e braccano una password? Come fanno miliardi di combinazioni ad uscire dal cilindro di un mago-programmatore che al posto della bacchetta magica usa la tastiera e pronuncia i suoi #include come “Abracadabra”?

E’ proprio questo l’argomento che andiamo scoprire, come creare un generatore di password!

Refresh

I programmi generano quelle combinazioni seguendo dei principi che hanno radici molto lontane rispetto all’ avvento dei computer. Iniziamo quindi, rivisitando quelle definizioni matematiche del calcolo combinatorio che ci forniranno il motore di tutto il nostro lavoro:

Dati n elementi distinti, si chiama disposizione semplicedegli n elementi, presi a k a k, ( k<=n ), o della classe k, un gruppo ordinato dik degli n elementi dati. Esempio:

Per n elementi distinti = a,b,c
di classe k = 2, abbiamo

ab
ac
ba
bc
ca
cb

in totale 6 combinazioni;

Dati n elementi distinti, si chiama disposizione conripetizionedegli n elementi, presi a k a k (con k numero intero qualunque), un gruppo ordinato formato con k degli n elementi, potendo uno stesso elemento figurare nel gruppo fino a kvolte.
Esempio:

Per n elementi distinti = a,b,c
di classe k = 2, abbiamo

aa
ab
ac
ba
bb
bc
ca
cb
cc

in totale 9 combinazioni;

Si chiamano permutazioni semplici degli n elementi distinti le disposizioni semplici degli n elementi presi ad n ad n.
Esempio:

Per n elementi distinti = a,b,c , abbiamo

abc
acb
bac
bca
cab
cba

in totale 6 combinazioni;

Dati n elementi distinti, si chiama combinazione semplicedegli n elementi, presi a k a k, (k <=n ), o della classe k, un qualunque gruppo formato da k degli n elementi dati.
Esempio:

Per n elementi distinti = a,b,c
di classe k = 2, abbiamo

ab
ac
bc

in totale 3 combinazioni;

detto questo non rimane altro che costruire un algoritmo in linguaggio C che implementi tali combinazioni.

Considerazioni generali

Dalle definizioni che abbiamo elencato si nota che le “disposizioni conripetizione” rappresentano l’insieme più completo di tutte le combinazioni. Le altre definizioni danno origine a dei sottoinsiemi di quest’ultimo, per questo motivo analizzeremo nel particolare solo il metodo della costruzione delle disposizioni con ripetizione.
Gli elementi che verranno utilizzati per creare le combinazioni sono i caratteri delle stringhe di cui vogliamo trovare tutte le combinazioni, in modo da imitare uno dei più famosi attacchi, cioè il brute force.
Il programma che svilupperemo si utilizzerà da riga di comando nella shell di Linux o dal prompt del dos, ricevendo come argomento dall’utente la stringa da combinare, la classe e il tipo di combianzione da impiegare.

Esempi:

$ combina -ra
aaa
aab
aac
aad
aae
aaf

zzz

$ combina -dA -k4
ABCD
ABCE
ABCF
ABCG
ABCH

ZYXW

$ combina -cn -k6
012345
012346
012347
012348
012349

456789

$ combina -r -k6 –user=danilo –md5
980ac217c6b51e7dc41040bec1edfec8 : dddddd
a6aa9df36c6a68ecb3eeb31a0770b6bc : ddddda
129341643219785e0175eb6e1d65edf6 : dddddn
e6591d381d486cd050f4ecdb0fb9ce88 : dddddi
699956cefc6bd6c84495f8add5d0e417 : dddddl

9982b2a7fceaaee2c8444b5086aee008 : oooooo

$ combina -dn -p 4 -k 6
0123

9876
01234

98765
012345

987654

$ combina -da -p3 -k5 –md5 | grep cf8595b8eecec82ad07aa16c818fea7c
cf8595b8eecec82ad07aa16c818fea7c : dcia
per trovare un hash MD5 tra quelli generati ;-)

$ combina -ca -k4 –sha1
81fe8bfe87576c3ecb22426f8e57847382917acf : abcd

a0d8a72797b5185f097a4f0f8cc7b19d98b72a5e : wxyz

$ combina -r -k 4 –user=01 –add-before=bin_
bin_0000
bin_0001
bin_0010
bin_0011
bin_0100
bin_0101
bin_0110
bin_0111
bin_1000
bin_1001
bin_1010
bin_1011
bin_1100
bin_1101
bin_1110
bin_1111

Note :

1: “Perchè il mondo è matematico?” di J.D. Barrow.

Screenshots :

Screenshot nr. 01

Download :

combina (GNU/Linux binaries)

combina (Windows binaries)

Codice sorgente (Platform Indipendent)

Codice sorgente (Progetto Dev-C++)

Sono necessarie le librerie di argtable2.x e openssl 0.9.x e per Dev-C++ seguono i relativi pacchetti:

DevPak Argtable

OpenSSL devpak from repository

GNU/Linux Packages:

pacchetto .deb per Ubuntu i386

combina_0.4.1-0ubuntu1_i386.changes

pacchetto .deb per Ubuntu AMD64

combina_0.4.1-0ubuntu1_amd64.changes

combina_0.4.1.orig.tar.gz

combina_0.4.1-0ubuntu1.diff.gz

combina_0.4.1-0ubuntu1.dsc

I pacchetti .deb con i relativi sorgenti (qui sopra) sono stati realizzati da Giuseppe Borzì al quale vanno la mia stima e ringraziamenti.

Links :

en.wikipedia.org/wiki/Combinatorial

it.wikipedia.org/wiki/Calcolo_combinatorio

Progetto ‘combina’

Copyright (C) 2004 – 2006 Danilo Cicerone

Permission is granted to copy, distribute and/or modify this document under the
terms of the GNU Free Documentation License, Version 1.2 or any later version
published by the Free Software Foundation; with no Invariant Sections, no
Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included
in the section entitled
“GNU Free Documentation License”
.

Categorie:Progetti in C Tag:
  1. 28 marzo 2006 a 16:27 | #1

    [OT] Programmig is live but must be spell checked. :-)

  2. 28 marzo 2006 a 16:52 | #2

    Grazie Alessio, la distrazione è sempre in agguato!

  3. Alex
    29 marzo 2006 a 15:50 | #3

    Senti, tutto molto caruccio, ma dato che lo hai segnalato su ZioBudda (Italian Linux Portal) come diamine lo si compila su Linux (visto che gli unici eseguibili sono per Windows)?

  4. 29 marzo 2006 a 17:17 | #4

    All’interno dei sorgenti ci sono queste due righe che spero siano chiare:

    gcc -Wall -I/usr/local/include -static -ansi “combina.c”
    -L/usr/local/lib -L/usr/local/lib -lm -largtable2 -lcrypto -o “combina”

    e sono richieste le librerie argtable2.x e OpenSS 0.9.x. Prossimamente saranno disponibili anche i binari per Linux!

  5. Alex
    29 marzo 2006 a 17:55 | #5

    Ok, grazie. Un piccolo consiglio comunque: metti un file README, a molti, come a me, non verrà in mente di aprire i sorgenti per leggere come compilarli. Questione di abitudini.

  6. 29 marzo 2006 a 18:01 | #6

    Ok, sarà fatto quanto prima, grazie.

  7. Mor
    11 aprile 2006 a 14:30 | #7

    Mi piacerebbe compilarlo, ma le librerie argtable non mi sembrano molto diffuse, visto che non sono presenti nel repositorì standard di debian stable. Non è che si può installarle localmente?

  8. 11 aprile 2006 a 14:39 | #8

    Puoi trovare tutto l’occorrente per installare le librerie di argtable a questo link:

    http://argtable.sourceforge.net/

    mentre le openssl ovviamente sono già disponibili con la maggior parte delle ditribuzioni GNU/Linux.

  9. 3 maggio 2006 a 11:27 | #9

    complimenti programma molto carino e pensato in modo originale.
    mi permetto dall’alto della mia ignoranza di farti i miei complimenti
    ciao
    A.P.

  10. 3 maggio 2006 a 12:16 | #10

    Grazie Alessio P.,
    è un piacere ospitarti tra queste pagine. Complimenti anche a te per il tuo sito, dove ho appreso che siamo anche coetanei e conterranei.
    Ciao.

  11. Vincenzo
    15 giugno 2006 a 23:20 | #11

    Perdona l’O.T. Danilo, volevo complimentarmi con te per il sito.
    Un saluto cicerò

  12. peo
    7 settembre 2006 a 18:59 | #12

    un guida all’uso per un niubbo come me?
    lo voglio installare ma non saprei farlo funzionare……….grazie

  13. 8 settembre 2006 a 7:15 | #13

    Ciao Peo, all’interno del pacchetto con il codice sorgente c’è un file README con le istruzioni di compilazione ed alcuni esempi. E’ necessario però avere le basi di utilizzo della riga di comando della shell, in questo caso puoi trovare dei buoni tutorial in rete.
    A presto.

  14. peo
    9 settembre 2006 a 16:43 | #14

    ti ringrazio, sto imparando ad usare linea di comando e combina sarà un mitvo inpiù per farlo!
    lo scarico e ti farò sapere…
    grazie e complimenti per il lavoro!

  15. lipschitz
    29 settembre 2006 a 15:08 | #15

    è possibile agiungere una opzione per usare come charset un insieme di lettere/numeri/simboli?
    Ad esempio, se volessi conoscere tutte le combinazioni di “pippo” “81″ e “super”, potrei aggiungere un charset in cui i “caratteri” sono i termini sopra riportati e il programma dovrebbe restituire:

    superpippo81
    super81pippo
    pipposuper81
    pippo81super
    81superpippo
    81pipposuper

  16. 29 settembre 2006 a 15:26 | #16

    Si, certo. Sarà una delle prossime caratteristiche!

  17. igino76
    17 ottobre 2007 a 20:53 | #17

    Ciao come mai mi da’ questi errori?
    [Linker error] undefined reference to `to_md5_string’
    [Linker error] undefined reference to `to_sha1_string’

    Sono curioso di vedere e studiare il codice che hai scritto, mi aiuti per favore?

    Grazie
    Luigi

  18. 17 ottobre 2007 a 21:40 | #18

    Probabilmente non hai le librerie necessarie indicate nel post.
    Per il codice, puoi scaricarlo ed utilizzarlo come vuoi a patto di rispettare la licenza GPLv2. Questo è l’aiuto che posso darti, il resto devi trovarlo da te, non mancano certo le documentazioni sia di argtable che di openssl, a te la prossima mossa!

  19. 26 gennaio 2008 a 10:27 | #19

    Ciao sono drpepperONE un moderatore del forum http://www.wifi-ita.com/forum/index.php.

    Complimenti per il fantastico programma.

    Bellissimo utilissimo c’è nera proprio bisogno!!

    Non ho parole per ringraziarti!!Bravo!!

    Sarebbe ancora più meraviglioso e stupendo e il non plus ultra se avesse l’opzione di settare il numero massimo di ripetzioni di carattere.

    Mi spiego :

    con l’opzione -r Permutation with repetition (default)

    combina prova tutte ma tutte le combinazioni possibili di un set di caratteri scelto.

    quindi ad esempio :

    combina -k 10 –user=123

    mi creera tutte le possibili combinazioni dei caratteri 123 con una lunghezza di 10.

    Sarebbe bellissimo se si potesse dire di limitare le ripetizioni di carattere ad un dato valore ad esempio:

    -rc (numero masssimo di riperizioni di caratteri uguali.)

    Quindi se io setto questo valore a 2 ad esempio avrò:

    aa123
    aa321
    aa213

    etc etc

    e non

    aaaa1
    aaa11

    Spero di esermi spiegato.
    Se non fossi stato chiaro non esitare a contattarmi.

    Ps: un altra bella opzione sarebbe la pissibilità di vare in anteprima il numero possibili di combinazioni ottenibili e la dimesione occupa su file system di un eventuale file che le contenga tutte.

    Cmq grazie mille per i tuoi sforzi e passione.
    C’è ne fossero di persone come teeeeee!!!!!!

    Ciao

  20. Ciccio
    15 marzo 2008 a 17:22 | #20

    Il programma è fantastico ma avrei una domanda da fare.
    A me servono tutte le disposizioni con ripetizione di 36 elementi (lettere minuscole + 0-9)presi 24 alla volta. Ho notato che la shell fa visualizzare al massimo 499 combinazioni create (non saprei se questo limite dipende da combina oppure da linux). C’è un modo per potertle salvare magari in qualche editor di testo?

  21. ivan
    7 maggio 2008 a 18:43 | #21

    Interessava anche a me questa cosa?
    E possibile salvare l’output in un file?

  22. rEvol
    30 luglio 2008 a 14:28 | #22

    risposta agli ultimi 2 commenti:
    in linux, se dopo un comando aggiungi:
    >> miofile.password
    tutto l’output del programma (stdout) viene riversato su miofile.password.

    Ottimo programma.
    Ciao

  1. Nessun trackback ancora...