__ ___ __ _ __ ___ __ _ | _/ _ \_ | _ __ __| | __ _| _/ _ \_ |_ _ __ _ __| |_ __ __ _ | | | | | || '_ \ / _` |/ _` | | | | | | | | |/ _` |/ _` | '__/ _` | | | |_| | || | | | (_| | (_| | | |_| | | |_| | (_| | (_| | | | (_| | | |\___/| ||_| |_|\__,_|\__,_| |\__\_\ |\__,_|\__,_|\__,_|_| \__,_| |__| |__| |__| |__| .::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[.]::[.] .: [O]nda[Q]uadra [OQ20031122 0X0A] :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: http://www.ondaquadra.org - articoli@ondaquadra.org :: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: "Tutto nel ciberspazio e' scandito dalla squarewave dei micro-processori Il clock dei micro e' come un battito cardiaco elettronico..." .::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[.]::[.] .: [O]nda[Q]uadra [OQ20031122 0X0A] :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::. :: 0x00 [L0GiN] LA JiHAD [oq~staff] :: 0x01 [PAGiNAZER0] CRED0 [Pupi] :: 0x02 [CRYPT0] RSA REVERSiNG [Evilcray] :: 0x03 [NETW0RKiNG] NEL R0UTER CiSC0 [Cartesio] :: 0x04 [C0DiNG] 0PENSSL E RSA C0DiNG [binduck] :: 0x05 [C0DiNG] DiAL0G0 S0PRA i DUE MASSiMi FiLESYSTEM [eazy] :: 0x06 [SECURITY] SQL-iNJECTi0N [Master^Shadow] :: 0x07 [SECURITY] SAM CRACKiNG [h23] :: 0x08 [APPRENDiSTA STREG0NE] C0DiCE iNVERS0: CRiTT0GRAFiA [Zer0] :: DiGiTALE AVANZATA PARTE 7 :: 0x09 [ViSi0Ni] ESTASi Di UN BLiTTER iMPAZZiT0 [Arkanoid] :: 0x0A [SHUTD0WN] EL0Gi0 DELLA P0VERTA' [Tritemius] [.]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: LEGAL DISCLAIMER :: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Nessuna persona dello staff di OndaQuadra si assume responsibilita' per l'uso improprio dell'utilizzo dei testi e dei programmi presenti nella e-zine, ne' per danni a terzi derivanti da esso. OndaQuadra non contravviene in alcun modo alle aggiunte/modificazioni effettuate con la legge 23 dicembre 1993, n.547 ed in particolare agli artt. 615-quater- e 615-quinques-. Lo scopo di OndaQuadra e' solo quello di spiegare quali sono e come avvengono le tecniche di intrusione al fine di far comprendere come sia possibile difendersi da esse, rendere piu' sicura la propria box e in generale approfondire le proprie conoscenze in campo informatico. I programmi allegati sono semplici esempi di programmazione che hanno il solo scopo di permettere una migliore comprensione di quanto discusso e spiegato nei testi. Non e' soggetta peraltro agli obblighi imposti dalla legge 7 marzo 2001, n. 62 in quanto non diffusa al pubblico con "periodicita' regolare" ex art. 1 e pertanto non inclusa nella previsione dell'art.5 della legge 8 febbraio 1948, n.47. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: COSTITUZIONE DELLA REPUBBLICA ITALIANA :: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Diritti e doveri dei cittadini: Rapporti civili Articolo 21 Tutti hanno diritto di manifestare liberamente il proprio pensiero con la parola, lo scritto e ogni altro mezzo di diffusione. [...] :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[.]::[.] .: [O]nda[Q]uadra [0X0A] OQ20031122[0A] :: [0x00][L0GiN] LA JiHAD [OQ] [.]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::. Sono molte le battaglie che vedono impegnati gli hacker su tutti i fronti. Intanto ci sono le minacce provenienti dalle celebri leggi americane ed europee (DMCA, ECMA) sul copyright digitale; minacce messe in atto da potenti organizzazioni (vedi la RIAA) con le loro iniziative aggressive. Per non dimenticare i problemi europei sul brevetto, le iniziative della BSA, il caso SCO/Linux. Lo sviluppo della situazione internazionale, precipitata drammaticamente l' 11 settembre 2001 ed evoluta verso guerre di cui vediamo l'esito tutti i giorni, ha fornito ad alcuni l' alibi per auspicare un giro di vite sul controllo e la riduzione dei diritti civili e della privacy, tutto ciò spinto dall' onda emotiva scaturita dalla reale minaccia terroristica. E in questo scenario globale si va ad inserire la nostra situazione, la realtà italiana; una realtà in evoluzione verso lo sviluppo di una societa' multirazziale, multiculturale e multireligiosa. Evoluzione (o trasformazione) che inevitabilmente avviene tra tensioni, polemiche, drammi umanitari. L' hacking da sempre si pone come la "religione laica" della libertà dell' informazione, l' apertura mentale in senso generale, l' apertura verso culture diverse; l' hacking ha anche sempre sostenuto e promosso l' utilizzo della tecnolgia per migliorare la vita di tutti, senza mai dimenticare l' importanza della cretività, anzi dandole un ruolo centrale. In questo panorama anche Ondaquadra deve evolvere ed adattarsi a questo nuovo mondo; si trasforma ritornando alle origini, alla semplicità. Ondaquadra diventa più agile e leggera apre anche ai grandi temi della nostra epoca. E allora in segno di apertura verso le culture, ci appropriamo di un termine così mal compreso in Occidente, spesso erroneamente tradotto come "guerra santa". Proclamiamo la nostra "Jihad", una battaglia fatta di idee, sogni e fantasia; una battaglia per la difesa del nostro modo di vedere la realtà. Una battaglia condotta in "clandestinita'", condotta lontano dai riflettori. Esercitiamo la nostra volontà di potenza come scomparsa. Andiamo nella Foresta e combattiamo come fantasmi, invisibili come il Vento. La Jihad della libertà digitale è proclamata. Jihad che combatteremo fino all' ultimo bit... :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[.]::[.] .: [O]nda[Q]uadra [0X0A] OQ20031122[0A] :: [0x01][PAGINAZER0]CRED0 [Pupi] [.]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::. Credo negli amici, quelli veri, quelli che si caramellano le palle per sei ore ascoltando tutti i tuoi sfoghi e non se ne vanno perchè sanno che tu hai bisogno di sfogarti e concludono con un "Non ci pensare, la vita va avanti" e tu vorresti ammazzarli e non ti rendi conto che in fondo hanno ragione... Credo nell'amore, l'amore cieco, l'amore contro cui vai a sbattere la testa mille e mille volte e nonostante tutte le sofferenze sei sempre pronto a ripartire, prendere la rincorsa e tirare ancora un'altra testata in quel muro che è, l'amore... Credo nei momenti solitari di cui ogni uomo ha bisogno, durante i quali non riesci a lasciarti in pace e mille pensieri torturano la tua mente fino a farti impazzire, ti assale la malinconia e finisci sempre col ritrovarti in lacrime per qualcosa che non hai ben capito cos'è... Credo nelle cazzate che si fanno solo quando si è ragazzi, e ti dici "Tanto non mi possono fare niente, sono minorenne, quando divento grande poi smetto" e una volta grande continui a fare cazzate perchè, nonostante tutto, continui a credere in tutto questo... Credo che ognuno dovrebbe lottare per ciò in cui crede e credo che per quanto possa apparire solitaria e senza speranza, ogni battaglia, se motivata da veri ideali e non da futili affari, merita di essere combattuta... Credo che i miliardi di dollari spesi in armamenti per assoggettare il mondo al proprio volere non valgano neppure mezza di tutte le vite finite nei grandi mattatoi delle guerre... Credo che il mondo non abbia colori e che chiunque, in ogni parte del globo, possa essere considerato un proprio fratello... Credo che il luogo di nascita sia una mera e stupida casualità, in quanto credo di essere, prima di tutto, figlio del mondo... Credo in chi si sforza davvero per rendere migliore questo mondo e credo che ognuno di noi dovrebbe fare quel poco che nel proprio piccolo possiamo fare, nella speranza che un giorno qualcuno possa davvero godere dei nostri sforzi uniti... Credo nella razza umana, nonostante abbia mostrato negli anni quanto di marcio nasconda fra le sue piaghe, e credo che valga la pena morire sapendo che questo mio gesto servirà a far vivere chissà chi, chissà dove, chissà quando... Credo nella vita, e anche davanti alla morte pianterò alberi in modo che la signora delle tenebre non abbia mai la meglio sulla nostra razza... Credo nelle canzoni che si trovano proprio su quel cd che non doveva essere nello stereo in quel momento perchè ti fanno pensare ancora di più a cose a cui vorresti non pensare e sono proprio quelle canzoni che un giorno ti strapperanno un sorriso quando le riascolterai e penserai a ciò che fu... Credo nella ragazza che hai amato per tutta la vita e con cui sei stato, ti sei lasciato, sei tornato, ti sei lasciato di nuovo e via dicendo e adesso è sposata con lo stupido di turno e quando ti vede sorride con dolore e abbassa gli occhi e ti rendi conto che hai lasciato un segno indelebile nel cuore di chi non ti ha voluto... Credo che sia inutile battersi per tenersi stretto qualcuno che non desidera altro che uscire per sempre dalla tua vita e credo fermamente nel motto "Chi non mi vuole, non mi merita" che suona tanto come una cazzata ma che aiuta a buttare giù, talvolta, bocconi altrimenti troppo amari da digerire... Credo nelle frasi fatte, perchè se sono fatte e mantengono vivo il loro significato vuol dire che sotto sotto nascondono un fondo di verità che sta ad ognuno di noi trovare... Credo nelle cose dette e non dette, che non significano niente, ma che lasciano alla tua fantasia l'interpretazione, così che tu possa lasciar volare i pensieri, anche solo per un attimo, sulle ali dei sogni... Credo nei sogni, credo in chi ce la mette tutta per ottenere onestamente ciò che vuole e credo che realizzare i propri sogni valga molto più di migliaia e migliaia di euro... Credo in chi non si arrende, in chi ha battuto centinaia di volte il culo a terra ed ogni volta, impassibile, si è rialzato ed è ripartito, pronto a combattere ancora... Credo in quei film poco famosi che solo tu ed altri due o tre vedono e che sembrano descrivere in tutto e per tutto la storia della tua vita e allora ti senti per un attimo un pò protagonista di uno strano "Truman show"... Credo che la vita sia una e che non ci sia granché al di fuori di essa e per questo credo che sia stupido sprecarla per rimpiangere in quei pochi giorni guadagnati di non averli persi godendo della propria gioventù... Credo in cose forse più grandi di me e in cui, qualcuno potrebbe dirmi, è stupido credere, ma credo che sia proprio credendo in queste cose che riesco a dare un significato e un motivo alla mia esistenza... Ma soprattutto credo che sia inutile piangere l'estinzione degli "Hacker" e starsene lì come scemi a rimproverarsi di non essersi dati abbastanza da fare, di non essersi mossi in tempo... Credo che ognuno di noi nasconda in sè una personalità molto vicina a quella del vero hacker, chi più, chi meno, e credo che sarebbe quasi arrivata l'ora di darsi una svegliata... Credo che il futuro sia in mano a gente come noi, a gente normale, che lavora, si impegna, cerca di migliorarsi, di capire, ride e piange quando serve, cerca di assaporare la propria vita per quella che è, senza chiedere di più, ha dei veri sentimenti, non ha lasciato che il denaro e il frenetico tam-tam dell'era moderna appiattissero il proprio Io, ma anzi conserva una propria inestimabile, imprevedibile, inarrestabile ed irriproducibile personalità... Credo in gente che crede, nonostante tutto, in qualcosa... Credo in tutti voi, chiunque siate, ovunque siate e per qualsiasi cosa vi stiate battendo... Credo... ###PUPI### :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[.]::[.] .: [O]nda[Q]uadra [0X0A] OQ20031122[0A] :: [0x02][CRYPT0] RSA REVERSiNG [Evilcry] [.]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::. -Hiew -SoftICE o qualunque altro debugger -RSA Tool 2 -Calcolatrice -Qualche tool per il decripting (tipo powmod) URL o FTP del programma www.google.it Notizie sul programma Lockless 3 CM (se volete fare pratica) Essay RSA overview Da qualche tempo a questa parte, ho iniziato ad interessarmi di RSA, sia perchè è interessante da studiare come sistema di crittografia, sia perchè mi è capitato in più di una protezione, ed inizialmente non sapevo nemmeno che cosa fosse!. L' Rsa è un cifrario a chiave pubblica nato al M.I.T. nel 1978, ad opera di Ron Rivest, Adi Shamir e Les Andleman (RSA deriva infatti dal cognome di questi 3 ricercatori). L' Rsa è un crittosistema asimmetrico che si basa su alcune proprietà particolari che hanno i numeri primi. Questo sistema ha trovato un vasto campo di utilizzo, algoritmi come El-Gamal (anche El-Gamal è un sistema asimmetrico e quindi abbastanza sicuro) sono diventati più rari, dato il loro massiccio utilizzo in passato. Vediamo adesso un' ipotetica sessione di crypting: nella quasi totalità dei casi il messaggio viene trasformato in Int cioè in numero intero, e poi si tratta soprattutto di un discorso matematico. Il primo passo per criptare un messaggio è : n=p*q N come si può notare dall' equazione ( meglio relazione matematica), è il prodotto tra p e q che sono 2 numeri primi. Con la dovuta cautela si può affermare che più piccoli sono P e Q è minore è la sicurezza, quindi è preferibile usare un modulo N abbastanza grande. Adesso va calcolato Ô(n). Per far ciò si usa: Ô(n)=(p-1)*(q-1) Questa è un' implementazione o più precisamente estensione del teorema di Eulero. In pratica Ô(n), è un numero 'RELATIVAMENTE' primo a (p-1)*(q-1). Ma a questo punto qualcuno potrebbe chiedersi, che significa "relativamente primo": un numero è relativamente primo ad un altro quando questi due numeri non hanno fattori in comune, tranne ovviamente 1. Ad esempio 8 e 21 non sono numeri primi, però 8 e 21 saranno relativamente primi ad un altro numero cioè 1, dato che l' unico fattore comune a 8 e 21 è 1. Precisazione (i fattori di 8 sono 1,2,4,8, quelli di 21 sono 1,3,7,21). Spero di aver chiarito un pò questo concetto. {{{ Tnx fly to CyberLaw}}}. Un altro passo e siamo apposto. Molto semplicemente 'E' si ricava da: e =Ô(n) E rappresenta la chiave (o meglio l' Esponente pubblico) con cui sarà criptato il nostro messaggio. Perciò E dev' essere un numero primo. La chiave di decrittazione d si ottiene attraverso: d = e^(-1) mod ((p-1)*(q-1)) ------->Perciò dobbiamo conoscere 'e', 'p' e 'q' Ok, adesso sappiamo più o meno come avviene una sessione Rsa, come avrete certamente notato durante quest' operazione ci sono dei valori che conosciamo e altri che vanno scoperti (nel caso di un attacco). Possiamo crearci quindi una tabella che in seguto ci potrebbe essere d' aiuto. P e Q Sono numeri primi Incogniti N N è il prodotto di p*q Conosciuto Ô(n) Ô(n)=(p-1)*(q-1) Incognito e Chiave di cripto Incognita d Chiave di decripto Conosciuta A questa tabella si potrebbe aggiungere x (messaggio in chiaro) ed y (messaggio criptato). Adesso siamo arrivati al cuore dell' algoritmo cioè alla strafamosa: C=M^e mod n Dove M è il messaggio da criptare e C è il messaggio criptato. Cercate di ricordarla dato che è il nucleo dell' algoritmo. Spero che sappiate ricavarivi la formula inversa in modo da ottenere il messaggio originale. La formula è la seguente: M=C^d mod n Siamo alla fine della nostra panoramica sul Rsa, come avrete sicuramente notato si tratta di un discorso principalmente matematico, ho cercato di sintetizzare al massimo il discorso, vi ho risparmiato tutti i retroscena (teorema di Eulero, Fermat) o si sistemi di fattorizzazione tipo il Metodo della Curva Ellittica (buon metodo per numeri piccoli, se però siamo di fronte a numeri grandi, risulta molto lento), poi ci sono: Pollard's Monte Carlo Algorithm, Continued Fraction Algorithm, Trial Division (questo è il più vecchio metodo di fattorizzazione che conosco). In questo periodo non c'è neanche bisogno di sbattersi molto con calcoli, dato che ci sono tanti programmi (specialmente dopo MIRACL) che fanno questo per noi. Pratical RSA In questa sezione iniziamo a fare pratica con il programma RsaTool2 (dei The Egoiste TMG) che ci sarà molto utile per il reversing. Per prima cosa, dopo aver aperto il programma settate il Numer Base) a 10 (cioè lavoriamo in base decimale) , e verifichiamo la veridicità della formula: n=p*q Nel riquadro "Modulus N", inserite 47 e premete "Factor N", questo dovrebbe dirvi che è un numero primo, stessa cosa con 53. Adesso otteniamo N=2491 da una semplice moltiplicazione (47*53), facendo finta di non conoscere P e Q, mettiamo 2491 in "Modulus N", e vediamo cosa si ottiene se lo fattorizziamo. Il programma ritorna esattamente in valori P e Q. Se andiamo un attimo a vedere la formula: d = e^(-1) mod ((p-1)*(q-1)) vediamo che possiamo ricavarci anche la chiave di decripto D, avendo però P e Q, mettiamo i valori P e Q nei loro relativi fields, e premiamo "Calc D", adesso sappiamo anche la chiave di decriptazione. Avendo il messaggio criptato, adesso possiamo decrittarlo. Per far questo basta applicare la formula: M=(C^d) mod n Possiamo usare la stessa calcolatrice di windows per decriptare numeri relativamente piccoli, o meglio costruirci un programma che faccia questo per noi. La fattorizzazione (addendum) Questa piccola sezione, non è di fondamentale importanza per capire l' algoritmo, ma potrebbe aiutarvi a capire quali sono le problematiche più importanti di un attacco a quest' ultimo. Come spero abbiate capito, per riuscire a violare un codice protetto con Rsa dobbiamo FATTORIZZARE il modulo N. Fin quando si tratta di fattorizzare numeri piccoli non ci sono problemi, ma i problemi sorgono quando si hanno davanti moduli N molto grossi, in questo caso vanno usati algoritmi di tipo probabilistico. Gli algoritmi per la fattorizzazione si dividono in due categorie: -Algoritmi deterministici. -Algoritmi di Montecarlo (si basano su una scelta semi-casuale dei dati di partenza). Più precisamente gli algoritmi deterministici sono a loro volta divisi in tre categorie: -Algoritmi che restituiscono ad ogni tentativo riuscito un divisore proprio (sia o non sia un numero primo) -Algoritmi che per ogni tentativo riuscito restituiscono SEMPRE un divisore primo. -Algoritmi che ad ogni tentativo riuscito restituiscono un divisore comune al numero dato. L' algoritmo o teorema di Euclide, è quello che viene più usato per gli attacchi. La formula comunemente utilizzata è: x=(x.a)(x.b)/(x.a.b) mod N Sia N=777 se si divide per 3 otteniamo 259 (che è >32), 259 si può dividere per 7 e si ottiene 37 (che è < 72). I divisori primi di 259 perciò sono: 3, 7, 37. Provate a fattorizzarlo con RsaTool2 ed otterrete gli stessi fattori. Questo genere di algoritmi deterministici possono essere buoni (per buoni si intende la rapidità di risoluzione) per numeri piccoli, per risolvere numeri molto grandi vengono invece usati gli algoritmi di Montecarlo, cioè di tipo probabilistico. {{Guardare le referenze a fine art.}} Reversing corner Ora che bene o male dovremmo aver acquistato una certa familiarità con questo algoritmo, iniziamo a vedere qualche esempio pratico. Iniziamo con un crackme abbastanza semplice ed utile. Io ho scelto il lockless 3CM, reperibile sul sito dei lockless. Per prima cosa mettiamo due bpx a getdlgitemtexta ed a getwindowtexta. Dopo che sice ha poppato dovremmo essere qui: Reference To: USER32.GetDlgItemTextA 004137FE Call dword ptr [00428910] 00413804 jmp 00413819 ;Salta sotto Referenced by a (U)nconditional or (C)onditional Jump at Address: 00413819 pop ebp 0041381A ret 000C Dopo la chiamata a getdlgitemtexta e dopo il ret ci troveremo qui: 004029B0 push FFFFFFFF 004029B2 push 00419E18 004029B7 mov eax, dword ptr fs:[00000000] 004029BD push eax 004029BE mov dword ptr fs:[00000000], esp 004029C5 sub esp, 00000650 004029CB push esi 004029CC push edi Possible StringData Ref from Data Obj ->"9901" ; Questo è un valore molto importante, 004029CD push 004200DC 004029D2 lea ecx, dword ptr [esp+000000E4] 004029D9 call 00401130 ;In questa call il numero 9901 viene "copiato" in un' altra locazione Possible StringData Ref from Data Obj ->"12790891"; Anche questo è importantissimo 004029DE push 004200D0 004029E3 lea ecx, dword ptr [esp+1C] 004029E7 mov dword ptr [esp+00000664], 00000000 004029F2 call 00401130 ;Chiamata alla solita call, che ora trasferisce 12790891 Possible StringData Ref from Data Obj ->"8483678" ; Altro valore di grande importanza 004029F7 push 004200C8 004029FC lea ecx, dword ptr [esp+00000274] 00402A03 mov byte ptr [esp+00000664], 01 00402A0B call 00401130 ;Idem come sopra Possible StringData Ref from Data Obj ->"5666933" ;Ultimo valore ma non di meno importante 00402A10 push 004200C0 00402A15 lea ecx, dword ptr [esp+000001AC] 00402A1C mov byte ptr [esp+00000664], 02 00402A24 call 00401130 ;viene richiamata la solita call 00402A29 mov edx, dword ptr [esp+00000668] ;Indirizzo relativo al serial 00402A30 or esi, FFFFFFFF ; 00402A33 mov edi, edx ;| Metodo molto comune usato per calcolare la lunghezza di una stringa 00402A35 mov ecx, esi ;| in questo caso del nostro serial 00402A37 xor eax, eax ;| 00402A39 mov byte ptr [esp+00000660], 03 ;| 00402A41 repnz ;| 00402A42 scasb ;| 00402A43 not ecx ;| 00402A45 dec ecx ;| 00402A46 cmp ecx, 0000000E ;se il serial è diverso da Eh (cioè 14 chars) 00402A49 jne 00402BB2 ;Salta alla beggar off, sennò continua 00402A4F xor ecx, ecx 00402A51 mov al, byte ptr [ecx+edx] ;char relativo al serial 00402A54 cmp al, 30 00402A56 jl 00402BB2 ;Salta alla beggar off, se è più piccolo di 30, cioè 0 00402A5C cmp al, 39 00402A5E jg 00402BB2 ;Salta alla beggar off, se è più grande di 39 cioè 9 00402A64 inc ecx ;Incrementa il contatore 00402A65 cmp ecx, 0000000E 00402A68 jl 00402A51 ;Se è più piccolo di Eh, vai al prossimo ciclo Adesso soffermiamoci per a fare qualche considerazione. All' inizio viene preso il serial, invece che il name, e questo dovrebbe farci un pò pensare, perchè se quello che viene manipolato è il serial, allora dobbiamo prepararci all' analisi dell' algoritmo.In questo caso fortunatamente sappiamo per certo che si tratta di rsa, e la cosa ci avvantaggia molto. Poi notiamo anche la presenza di quattro numeri fissi, che ci fa pensare (intuitivamente) a E ed N. Vi ricordo la formula: C=M^e mod n Inoltre a 00402a51 che inizia una routine che controlla se il seral inserito sia un numero, se non lo è salta ad errore. Da questo ciclo capiamo anche che bisogna lavorare (operazioni di fattorizzazione e varie) in base 10. Arrivati a questo punto, è meglio se tralasciamo l' analisi della routine che segue, poichè è abbastanza lunga ed ingarbugliata. Cercherò quaindi di riassumervi un pò cosa succede: -Il serial dev' essere di 14 cifre, e poi durante l' algoritmo questo numero verrà "spezzato" in due parti uguali composte da 7 cifre. Ad ognuno di questi "pezzi" di serial saranno applicate una seria di operazioni, che coinvolgono anche in numeri visti sopra (9901 e 12790891). Alla fine, le due parti di serial vengono riunite e poi avviene il check finale, che ci dirà se il serial è giusto o sbagliato. Dalle operazioni che vengono fatte, possiamo capire che 12790891 rappresenta il modulo N e che 9901 E. Adesso ci tocca riuscire a decriptare le due parti di serial. Seguendo la routine, si può notare inoltre che i valori: 5666933 e 8483678, sono le due parti di serial corretto, ma purtroppo sono criptati. Inoltre se avete notato entrambi i valori sono di 7 cifre ciascuno il che dovrebbe insospettirci. Quindi arrivati a questo punto, facciamoci uno schema della situazione e vediamo cosa possiamo fare: -Conosciamo il seriale corretto ma criptato, cioè conosciamo il parametro C. -Conosciamo il modulo N con cui sono stati criptati i due valori. -Conosciamo E (Con E e con P e Q si può trovare il parametro D). Abbiamo tutto per un corretto decripting, ma dirvi soltanto quale bottoni premere non sarebbe utile a nulla. Quindi cerchiamo di arrivare alla soluzione: per poter decriptare i due spezzoni di serial dobbiamo avere oltre al messaggio criptato (C) , il modulo N ed D. Se vi ricordate N è dato da P*Q che sono due numeri primi, quindi fattorizzandolo dovremmo riuscire a trovare P e Q (2 numeri in questo caso relativamente piccoli). Aprite RsaTool2, ed impostatelo a base 10, dato che come abbiamo precendente visto i valori sono tutti in base 10. Scrivete nell' edit box "Modulus N" e fattorizzatelo "Factor N", il programma vi dirà che questo numero è primo, questo significa che non può essere il modulo N (che dovrebbe essere composto dal prodotto di due numeri primi), però dato che è primo può essere il nostro Esponete Pubblico E. Ora proviamo a fattorizzare 12790891, e da cui otteniamo P (1667) e Q( 7673).. A questo punto dato che abbiamo P, Q e l' esponete pubblico E, possiamo calcolarci la chaive di decripto D, che dipende dalla seguente formula: d = e^(-1) mod ((p-1)*(q-1)) RsaTool2 ci permette anche di calcolarci D, ricordatevi di mettere 9901 in Public Exp, e poi premete "Calc D". Il valore di D sarà 10961333, adesso abbiamo tutti gli elementi per poter applicare la formula: M=C^d mod n Non sognatevi nemmeno di usare la calcolatrice di windows, esistono dei programmi apposta per poter decriptare un numero. Vi consiglio di non effettuare il decripting su un computer lento, ci vorrrebbe molto tempo. Questi sono i valori da usare per il decrypt: M1=(8483678^10961333) mod 12790891 M2=(5666933^10961333) mod 12790891 Da cui si ottiene: M1=7167622 M2=3196885 Queste sono le due parti di serial decriptatato, se ricordate, l' algoritmo richiedeva un serial di 14 cifre e successivamente veniva diviso in due, M1 ed M2 rappresentano i 2 pezzi di serial. Quindi per ottenere il seriale corretto M1M2, vanno uniti. Il valore così ottenuto sarà 71676223196885. Riconoscere l' Rsa. Riconoscere l' Rsa negli schemi di protezione, non è molto semplice, poichè può presentarsi sotto numerose forme, o peggio può essere "riadattato". Ma ho pensato di elencarvi in modo molto generico le principali caratteristiche che *dovrebbe* avere: -Viene preso il seriale e viene criptato, solitamente con la formula C=(M^E) mod N, (M non è altro che il serial). -Di conseguenza dovremo avere 2 valori fissi, che rappresentano il modulo N e l' esponente pubblico E. -Poi dovrebbe avvenire un confronto tra il serial criptato ed il nome. Adesso voglio riportarvi un spezzone di codice preso da un crackme, che potrebbe chiarirvi un pò le idee. 0040118D sub_40118D proc near 0040118D mov ebx, eax ;In eax abbiamo il nostro serial, che ora vine messo in ebx 0040118F mov ecx, dword_4030A8 ;in ecx viene messo un valore fisso 00401195 mov esi, dword_4030A4 ; in esi viene messo un altro valore fisso 0040119B mov eax, 1 ; mette 1 in eax 004011A0 loc_4011A0: 004011A0 cdq ;ConvertDoubleToQuad, si prepara ad un divisione 04011A1 mul ebx ; Moltiplica ebx per eax 004011A3 div esi ;divide esi per eax (in esi si trova uno dei valori fissi) 004011A5 mov eax, edx ;Sposta il resto della divisione in edx 004011A7 loop loc_4011A0 ; mette in loop queste operazioni, questo ciclo sarà ripetuto 1109 volte, dato che ecx contiene proprio 1109! dopo abbiamo un confronto tra il serial corretto ed il seriale inserito da noi e criptato. VALORI: 004030A4= 0EAD2C511h cioè 3939681553 004030A8=455h cioè 1109 La routine è abbastanza semplice, in ebx abbiamo il serial inserito da noi, il quale viene moltiplicato per eax (che la prima volta contiene 1) e poi viene diviso per esi (in esi abbiamo il valore 3939681553). Poi viene preso il resto della divisione (quindi possiamo considerarlo come un MOD!!!) e spostato in eax, tutte queste operazioni vengono ripetute 1109 volte!. Ormai avreste già dovuto capire di che operazione si tratta, ma comunque vediamo un pò analiticamete cosa avviene: eax=eax * ebx dato che viene iterato per 1109 volte equivale a: eax=(ebx ^ 1109) di seguito abbiamo eax = eax / esi , ma poichè viene preso solo il resto può essere considerato come: eax MOD esi (da ricordare che esi è 3939681553) Quindi da tutto questo si ricava che, C=(Seriale ^ 1109) MOD 3939681553 Bene! abbiamo finito, ho cercato di scrivere qualcosa di sintetico e completo allo stesso tempo, spero di esserci riuscito. Nei vari schemi di protezione l' Rsa si può presentare in modo molto vario, noi abbiamo esaminato solo uno dei casi più semplici. La prossima volta (se ho tempo) scriverò qualcosa su come viene usato l' rsa a 128, 256 e 512 bit. References: -Cenni di Aritmetica Superiore per la Crittologia, di Marco Frigerio -Vari docs letti in giro. Note finali In fine vorrei porgere i miei più cari saluti a chi mi ha insegnato qualcosa e chi mi ha aiutato a capire, o più semplicemente alle persone con le quali ho passato delle ore piacevoli. Disclaimer Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly . Capitoooooooo????? Bhè credo di si ;)))) Autore: Evilcry E-Mail: evilcry@virgilio.it :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[.]::[.] .: [O]nda[Q]uadra [0X0A] OQ20031122[0A] :: [0x03][NETW0RKiNG] NEL R0UTER CiSC0 [Cartesio] [.]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::. Tutto ciò che è contenuto in questo articolo non è da utilizzare in maniera lucrosa e/o in maniera lamerosa, ma è semplicemente un testo per porre un po' di risposte a quei perché di tutti i giorni. Non vuole essere una guida approfondita..a questo possiamo arrivare semplicemente se ne viene richiesta la necessità. Ma sopratutto perché questo carattere del "gedit" è così piccolo.. mi sto fottendo gli occhi, mi conviene cambiare utility. Ecco le cose fondamentali da fare prima di leggere questo articolo: 1) Visualizzare un carattere più grande. 2) Avere una bella "Fi*a" di fianco a voi. 3) essere assolutamente rilassati. 5) il punto 4 lo salto. Cominciamo.("occhio che partiremo da molto lontano") Quante volte scrivendo c:\>tracert IP_HOST oppure [localhost@root]# traceroute IP_HOST vi è capitato di vedere una tabella simile: 1 10.1.1.1 0.675 ms 1.829 ms 0.476 ms 2 10.1.7.22 5.351 ms 4.559 ms 1.258 ms 3 10.1.11.1 3.395 ms 10.3.7.1 (10.3.7.1) 6.390 ms 1.985 ms 4 10.1.15.1 1.529 ms 2.399 ms 10.14.1.1) 1.174 ms 5 10.1.13.1 5.272 ms 10.946 ms 5.307 ms 6 14.4.10.1 6.219 ms 5.977 ms 5.700 ms 7 12-1-1-0.mil11.it 6.519 ms 6.651 ms 7.738 ms 8 23.14.1.2.net 102.337 ms 102.567 ms 102.084 ms 9 124.12.1.1 103.003 ms 103.558 ms 103.424 ms "Che ca**o sono sti "zagareddri" --> "cosi !".. ? il comando traceroute o tracert è un'applicazione che invia un pacchetto e TRACCIA i passaggi che effettua tale pacchetto per raggiungere la destinazione impostata nella richiesta. Alcuni utilizzano questa applicazione per effettuare un controllo generale del funzionamento della rete ed individuare eventuali errori o per schematizzare l'intero percorso della rete. Tutto è nato da qua, mentre eseguivo il traceroute, avevo deciso di localizzare ogni ip, e costruire a mano la mappa della Rete, disegnando e disegnando mi son trovato dinnanzi ad un IP del genere "gw-3-0-0.ip.net", un GATEWAY (=ponte), cosa per me indigena, alquanto aliena, era proprio come un UFO per i miei occhi, la sera discutendo amichevolmente, scoprii che quel GATEWAY era un "ROUTER", cosa ancora più ignota. E' nato da li un fervido interesse verso tali dispositivi che stanno alla base delle LAN e WAN (guardare l'articolo di Spy e di l1l0, che hanno fornito le necessarie nozioni). Per continuare l'articolo dovrei fare una piccola introduzione allo stack TCP/IP. Lo stack "TCP/IP" prende il nome dai due protocolli più importanti e vale a dire il Transfer Control Protocol (TCP) e IP (Internet Protocol)ma lo stack TCP/IP comprende altri sottoprotocolli...un terzo protocollo è l'UDP (User Datagram Protocol) non sto a narrararvi tutta la vicenda, ne conseguirebbe un ulteriore articolo, di conseguenza torniamo al riassuntino: Il modello TCP/IP si è formato basandosi sullo standard ISO/OSI (International Standards Organization/Open Systems Interconnection) uno standard formato parecchi anni fa (io non ero nato) per far comunicare computer in reti di grandi dimensioni. La prima Rete ARPANET mamma di tutte le reti, un po' come i LED ZEPPELIN per il rock, i Metallica per il Metal...La FI*A per le femmine !... dai un po' di pazienza allegeriamo questo articolo. Tornando al modello "OSI" esso è costituito da 7 Livelli, viene rappresentato come una pila.. (chissà VoLTa se conosceva lo standard.. BATTUTONA, spero che qualcuno l'abbia capita) Livello 7 APPLICAZIONE = che equivale alle applicazioni che si eseguono sul computer per poi fornire dei servizi alle reti... un modo per ricordare questo livello è pensare al "ftp, telnet, e-mail, web browser... etc." Livello 6 PRESENTAZIONE = è il livello che si occupa della presentazione dei dati per il livello superiore.. cioè se io ti invio un file di Testo .Doc che abbia una certa topoligia di intestazione.. e poi ti viene rappresentato come file AUDIO .. vuol dire che qualcosa non è stata eseguita per il verso giusto. Livello 5 SESSIONE = si occupa ti aprire mantenere e chiudere una sessione.. che viene utilizzata dai livelli superiori Livello 4 TRASPORTO = Provvede all'affidabilita', al trasporto effettivo dei dati da una macchina sorgente a quella di destinazione. I Livello 3 RETE = rete è un livello fondamentale la comunicazione in rete.. in questo Livello vengono collocati gli indirizzi IP. Il Livello Rete consente di mettere in comunicazione due sistemi di elaborazione che possono essere localizzati anche su reti geograficamente diverse. (cioè se io sto in cucina.. e mia nonna sta in bagno, posso comunicarle che è finita la cartaigenica grazie al livello rete) Livello 2 DATA LINK(lo lascio in inglese che fa più colpo) = si occupa del collegamento e del flusso dati. Livello 1 FISICO = lo dice la parola stessa.. "se non hai il PC accesso.. non comunichi ". N.B: Ogni Livello comunica con l'entità di pari livello (peer) tramite il PDU protocol data unit. Dopo questa BREVISSIMA descrizione del modello OSI, proprio breve.. magari qualcuno mi può prendere superficialmente e considerarmi un ignorante.. ! passiamo al.. ######################################################################## Il Router: E' un dispositivo di rete che si colloca al livello 3 del modello OSI (quindi.. vedi su ^ .. livello rete). Il suo compito è di potere decisionale basandosi sul protocollo di terzo livello, il protocollo IP, indi per cui decide quale strade far prendere ad un pacchetto per arrivare a tale destinazione.. Esempio pratico: se io voglio comunicare con un biglietto scritto a mia nonna che è in bagno ma è finita la cartaigenica il router deciderà da dove far passare l'informazione, il router dirà "do il messaggio alla sorella di Cartesio che poi lo da al papà che lo consegna alla nonna..ma il papà di cartesio è a lavoro, quindi mi tocca lasciare il biglietto sotto la porta del bagno così la nonna appena si accorgerà di questo biglietto lo leggerà e scoprirà di essere senza carta igenica. Il router prende tale decisione attraverso i protocolli di routing. il RIP (Routing Information Protocl) IGRP (Interior Gateway Router Protocol) EIGRP (Enhanced IGRP), OSPF (Open Shortest Path First). Il RIP è un protocollo che seleziona il percorso basandosi sul numero di HOP (salti) che deve fare un pacchetto per arrivare a destinazione, non è detto che la via che scelga il RIP sia la più veloce.. ma certamente è quella che comprende meno passaggi.. IGRP A differenza del protocollo RIP, dove l'unica metrica possibile è l"hop count" e si ha un limite massimo di 15 hop count, in IGRP le metriche si basano su 4 parametri: Bandwidth, Delay, Reliability, Load. EIGRP e' stato sviluppato da CISCO a partire dalla release software 9.21 sulle basi del protocollo IGRP, rispetto al quale sono stati introdotti dei miglioramenti. OSPF Open Shortest Path First... detto tutto. Stiamo arrivando al router !!! GIOVANI... mentre mia nonna è ancora in bagno che chiede la cartaigenica. ######################################################################## Struttura del Router Un router è un dispositivo di rete che ha le stessa caratteristiche di un pc, e cioè il router ha una Rom, Ram, interfacce, CPU, schedamadre... etc.. etc... Prenderemo in esame un esempio di router Cisco. RAM: nella ram risiede la configurazione corrente del router e le variabili temporanee necessarei per il corretto funzionamento. Viene caricata quando viene riavviato un router. N.b: Il contenuto della RAM viene perso durante lo spegnimento del router. NVRAM: (non volatile RAM) è la memoria che non viene persa durante il riavvio del router.. e contiene il backup della configurazione. FLASH: Parte di memoria di tipo permanente in cui risiede l'IOS (Internetwork Operating System).. tutte stè parole per dire .. che nella memoria FLASH ci sta il sistema operativo. ROM: è la memoria in cui si trvoa il software di diagnostica.. come nel PC... CONSOLE: è una interfaccia seriale AUX: è una porta seriale usata per il collegamento di altre periferiche ausiliari, difatti il nome AUX abbreviazione di AUXILIAR significa proprio ausiliaria. Interfacce di rete: sono le connessione di rete che possono essere collocati su schedamadre oppure moduli separati... Esempio Ethernet, Seriali. o per ISDN .. etc.quindi le interfacce son ciò che ti permettono di essere in rete . :P proprio una interpretazione filosofica. come dire "Cogito Ergo Sum". Un router ha anche un sistema operativo, ora comincia la parte carina... Parte fondamentale del router è la configurazione... Sapendo che il router è alla base della Rete, instrada pacchetti, seleziona percorsi, possiamo immaginare l'importanza del ruolo che esso svolge. E quanto è importante configurare nel modo esatto il router e le apposite interfacce. ######################################################################## Il router e la CLI (command line interface).. ricordo che parliamo sempre di router CISCO. Il prompt del router è: Nome_router> il simbolo > indica che si è in una modalità user in cui si possono eseguire alcuni semplici comandi di visualizzazione delle configurazioni. Ma con una configurazione non dettagliata del router, possono venire a galla alcune informazioni preziose per un utente qualsiasi ma dannose per l'amministratore della rete. Sul router può essere attivo il server http che permette la visualizzazione di alcune caratteristiche del router anche da utenti sconosciuti !.. eseguendo il comando Nome_router> show running-config si otterrà una serie di informazioni riguardo configurazioni e stato delle interfacce di rete del router, esempio: interface Ethernet 0 ip address 10.1.1.1 255.255.255.0 no ip directed-broadcast no mop enable ! poi si possono osservare informazioni riguardo password line aux 0 line vty 0 4 "cisco" password terminal login ! tramite http server attivo sul router basta scrivere ip_del_router/level/16/exec/show/config e si ottiene la stessa lista sopra elencata. Ecco che sbuca fuori la password del line vty 0 4 (line virtual terminal --> le connessioni telnet, 0 4 --> perché possono effettuarsi massimo 5 sessioni telnet contemporaneamente. di conseguenza è meglio mascherare la password e disattivare il web server per il controllo da WEB, più avanti spiegherò come. Per ottenere una lista di comandi che si possono esguire in modalità USER è possibile.. anzi consigliato eseguire il comando "?" Nome_router> ? e verrà elencata una serie di comandi che possono essere eseguiti dalla modalità USER il comando "?" può essere adoperato anche per suggerimento riguardo il completamento di un comando ad esempio Nome router> show ? verrà elencata una serie di comandi da eseguire conseguenti a show.. esempio: interfaces running-config startup-config version etc etc.. se la nonna è ancora in bagno... il comando "show interfaces" serve per mostrare lo stato e le caratteristiche di tutte le interfacce presenti nel router, quali Ethernet 0 .. Ethernet 1, Serial 0, Serial 1.. etc. Quando si parla di "stato dell'interfaccia" del router si intende lo stato fisico e lo stato di rete di tale interfaccia del router, vale a dire i "cavi, dispositivi etc.. etc.." e i protocolli "ip, tcp, ipx, appletalk, routing". Di conseguenza quando viene visualizzato nello stato di un'interfaccia dopo aver eseguito "show interfaces" `Interface Serial 0 is up, line protocol is up` vuol dire che tutto funziona per il meglio, che tutto è UP che tutto è SU che tutto funge.! Interface Serial 0 is up, line protocol is down significa che c'è un problema di rete Interface Serial 0 is down, line protocol is up significa che c'è un problema a livello fisico dell'interfaccia Interface Serial 0 is down, line protocol is down, vuol dire che è "IMBAGAGLITA, che non è tutto incasianto". Interface Serial 0 is administratively down vuol dire che l'interfaccia è SPENTA dall'amministratore della rete. Dopo aver spiegato per sommi capi la modalità USER quella limitata nell'esecuzione dei comandi, vedermo la parte privilegiata. Per entrare in modalità privilegiata bisogna digitare "enable" ed invio, e verrà richiesta una passoword per avere accesso. Tale password non viene visualizzata da un user qualunque.. però alle volte per disattenzione degli amministratori le password di "user" e di "privileged" sono le stesse. Somiglia molto ad un prompt di una shell linux difatti, l'accesso privilegiato al router è caratterizzato dallo sharp = # :) quindi il prompt del router in modalità superuser sarà `Nome_router# ` basta digitare il "?" per avere subito scarrozzata una lista di tantissimi comandi da eseguire in questa modalità.. tra ciò i comandi per la configurazione della rete e la configurazione delle password di accesso. Uno dei punti relativi alla sicurezza: le password di accesso in chiaro e criptate. Il router utilizza una opzione per il criptaggio delle password in modo tale da nascondere anche al semplice utente di guardare la password di accesso con un semplice "show running-config". o tramite un ip_del_router/level/16/exec/show/config. andiamo a disattivare il web server e criptare la password. Nome_router> enable password: Nome_router# siamo in modalità privilegiata.. la password non viene scritta neanche con gli asterischi.. in modo tale da non comprendere nanche la sua lunghezza. ora entriamo nel settore di "configurazione globale", in cui si possono effettuare una serie di configuarzioni quali..esempio hostname.. Entriamo in modalità configurazioni globali con il comando configure terminal, si otterrà un prompt del genere: nome_router(config)# hostname Mia_nonna_è_in_bagno Mia_nonna_è_in_bagno(config)# ... sarà il nome del nostro router. ecco ora..l'opzione per disattivare il server http del router in modo tale da esporlo meno ad attacchi. Mia_nonna_è_in_bagno(config)# hostname Router Router(config)# scusate ma quel prompt era troppo lungo l'ho dovuto cambiare. Router(config)# no ip http server Router(config)# il comado qui sopra ha disattivato l'http server. Da notare che nel router cisco la maggiorparte delle volte che si vuol negare un qualcosa basta mettere davanti il comando "no". infatti se noi avessimo voluto rendere attivo "http server" ci sarebbe bastato digitare Router(config)# ip http server Router(config)# in questa sezione di configurazoine globale del router si possono settare le password di accesso "line console 0" "line vty 0 4" e "enable Router(config)# enable password cisco (=equivale alla password che viene richiesta quando dalla modalità user si digita enable per entrare in modalità privilegiata) Router(config)# line console 0 Router(config-line)# login "invio" (per settare un login nullo) Router(config-line)# login Nonna (login = nonna) Router(config-line)# password cisco Router(config-line)# exit Router(config)# line vty 0 4 Router(config-line)# login Router(config-line)# password cisco per tornare indietro nel prompt non c'è cd .. oppure cd / ma basta digitare exit per tornare al prompt precedente e cioè Router(config)# oppure dicitare CTRL+Z per tornare al prompt principale e cioè Router#. Ed infine la password di enable secret, vale a dire la password criptata con l'algoritmo MD5, che permette di rendere illegibile tale password a chiunque con uno show running-config, perché il risultato dell'output sarà... service password-encryption $1812AS39012!|0$091a!"£81! ... uazhazuzhu mi sento redicolo. Ogni qualvolta si cambia qualche settaggio del router che pretende essere salvato e ricaricato al prossimo riavvio conviene copiare la configurazione che è presente attualmente "cioè in running, per questo viene chiamata running-config nella startup-config che è quella che risiede nella memoria NVRAM che passerà le informazioni alla RAM al prossimo riavvio. Il comando per copiare la configurazione in running in NVRAM è Router# copy running-config startup-config N.b: se fate alcune modifiche a parametri, e settaggi di rete, ma non eseguite un copy running-config startup-config .. appena il router viene spento e riacceso le modifiche si riveleranno nulle. Di conseguenza tocca ripetere le procedure da capo. ######################################################################## Configurazione delle interfacce del router Il router è formato da interfacce che permettono la comunicazione in rete, tali interfacce possono trovarsi su scheda madre o possono essere dei moduli aggiuntivi. Andiamo ora a configuarare una interfaccia Router> enable password: Router# andiamo in configurazione globale.. Router# configure terminal Router(config)# interface Ethernet 0 (attenzione Ethernet 0.. può cambiare a seconda delle varie IOS dei vari router.. ad esempio può essere FastEthernet 0 oppure FastEthernet 0/0, sesso discorso vale per seriale..) Router(config-if)# <-- questo prompt con l'aggiunta di if sta a simboleggiare che siamo nella configuarzione dell'interfaccia ... nel caso sopra elencato "Ethernet 0" non ci resta altro che dare un ip ed una netmask all'interfaccia Ethernet del nostro router Router(config-if)# ip address 10.1.1.1 255.255.255.0 Poi settare la nostra interfaccia UP, e cioè metterla in funzione con il comando Router(config-if)# no shutdown Router(config-if)# si può passare da una interfaccia all'altra digitando semplicemente Rotuer(config-if)# interface serial 0 (ed inautomatico.. il prompt non sembrerà cambiato.. ma siamo nella interfaccia serial 0) non tutti i router cisco.. rispondono così... di conseguenza un consiglio personale è.. digitare exit che porterà al seguente prompt: Router(config)# interface serial 0 Router(config-if)# ip address 37.1.1.1 255.255.255.0 Router(config-if)# clock rate 56000 -----> "questo comando lo rimando in un altro articolo... dipende da l'utilizzo che ne viene fatto di questo di articolo" Router(config-if)# no shutdown Router(config-if)# CTRL+Z Router# ######################################################################## IOS (Internetworking Operating System) .. Sistema operativo del router. Il sistema operativo risiede nella memoria falsh del router per ottenere inforamzioni riguardo alle memorie del router.. basti digitare uno show version e si otterrano informazioni relative a: Piattaforma sulla quale si sta operando, IOS e versione e nome del file, memorie e le capacità delle memorie. Sulla memoria flash possono essere copiate più IOS. Nei router Cisco c'è differenenza tra le realase 11.0 in giù e 11.x in su.. Occhio ragazzi .. se siete su un router non digitate mai ... dico mai .. Router# erase flash questo significherebbe cancellare il sistema operativo. Di conseguenza una reazione a catena di rompimenti di balle...E' come se io facessi ERASE CARTAIGENICA.. mia nonna potrà stare in bagno per sempre oppure ... ? ... pulirsi in qualche altro modo. Il nome del file del sistema operativo è sempre un file binario di conseguenza caratterizzato da una estenzione .bin. Anche il nome del file ha delle specifichè che indicano Piattaforma, caratteristiche, fattori di compressione... che forse il 90 % degli utenti... ignorerà. Un esempio: c7200-ajs56-mz c7200: Router Cisco Serie 7200 - a: supporto protocollo APPN; j: supporto di caratteristiche Enterprise; s: supporto di NAT,ISL,VPDN/L2F 56: supporto di crittografia a 56 bit - m: esecuzione in RAM z: file compresso con Zip. E' possibile copiare una IOS da un TFTP (trivial file transfer protocol) che utilizza il protocollo UDP non affidabile ma veloce, per trasferire il file. Perché caricare una IOS da un TFTP ? per fare eseprimenti, testando IOS, compatibilità tra interfacce e IOS, per avere a disposizione molte più IOS, difatti la memoria di un router è molto limitata e non riesce a contenere un gran numero di IOS, di conseguenza su un server TFTP la quantità e la varietà di IOS disponibili sarebbe maggiore.. Si può configurare anche il router in modo da decidere la procedura di avvio... come settare il bios del pc quando selezioni "1) floppy 2) Cd - rom 3)HD... etc.. in un router basta andare in modalità di configurazione generale...di conseguenza digitare configure terminal Router(config)# boot system flash nome_file.bin Router(config)# boot system tftp nome_file.bin ip_del_server. etc... per avere più completezza di conoscenza basta digitare Router(config)# boot system ? e comparirà una lista di comandi disponibili.. non sto ad elencarvi.. perché non sono qui.. a descrivere tutti i comandi di un router.. ma le cose essenziali.. per approcciare ad esso. ######################################################################## Siamo giunti al termine dell'Articolo, però voglio che si sappia che questo articolo.. è solo per un approccio al router e non un tutorial completo, perché ho omesso parecchie parti anche importanti ma che inserirò o aggiornerò in seguito ad eventuali richieste... Vedremo se questi accorgimenti sono serviti.. e se qualcuno si è interessato in tal modo da chiedermi un articolo più dettagliato. Per finire. Accorgimenti sicurezza: Disattivare le porte Echo UDP e Chargen UDP, possono essere causa di un DoS che provocherebbe il collasso del router. Disattivare il server http Attivare l'enable secret "password" Alcuni router sono vulnerabili ad un attacco del genere http://ip_router/%% che possono causare un blocco del sistema. scritto da "CaRTeSio".. cogito ergo sum. e-mail: comunicazione@polizia.it :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::[.]::[.] .: [O]nda[Q]uadra [0X0A] OQ20031122[0A] :: [0x04][C0DiNG] 0PENSSL E RSA C0DiNG [binduck] [.]::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::. Article && sources by binduck - binduck@coder.hu 0. Intro 1 RSA - Teoria 1.1 OpenSSL/RSA [genrsa,rsa,rsautl] (generare chiave,cifrare/decifrare,firmare,...) 1.1.1 GPG 1.2 Impariamo ad implementare RSA nei nostri programmi 1.2.1 RSA - Headers 1.2.2 RSA - Le chiavi 1.2.3 RSA - Cifrare e decifrare 0. Intro In questo articolo voglio illustrarvi le basi che vi permetteranno di capire e implementare il potenete algoritmo RSA. 1]Vedremo, quindi, come utilizzare il toolkit openssl (ne vedremo le principali funzioni, come creare le chiavi, come cifrare/decifrare dati). 2]Vedremo insieme le basi delle librerie openssl, e in particolare quelle che vi permetteranno di implementare l'algoritmo nei vostri programmi. Per affrontare la lettura di questo articolo avrete bisogno di conoscere: - il linguaggio C - se volete comprendere la parte matematica dovrebbe bastare l'infarinatura di matematica fornitavi nelle elementari e nelle medie. - dovreste avere openssl e le librerie (/usr/include/openssl/) se vi mancano....installatele. 1 RSA - Teoria RSA fu sviluppato da tre matematici del MIT:Rivest, Shamir e Adleman: - Cifrario a chiave pubblica (usato nel PGP e in molti altri programmi) - Si basa sulla teoria matematica dei numeri; infatti le chiavi sono costituite dal prodotto di due numeri primi molto grandi(piu' di trecento cifre) - Cifrazione/Decifrazione di dati - Firma/Controllo firma - Supporta chivi di diversa grandezza in modo da fornire vari livelli di sicurezza (grandezza minima consigliata e' 1024). Riprendiamo alcuni concetti basilari della crittografia che ci saranno utili. Un cifrario a chiave pubblica (o cifrario asimmetrico) e' basato sull'utilizzo di due chiavi,una per cifrare e una per decifrare. La prima chiave puo' essere distribuita a chi vuole farci pervenire messaggi cifrati in modo che solo noi possiamo decifrarli con la nostra chiave segreta(che DEVE rimanere segreta). Il fatto che la chiave pubblica possa essere tranquillamente distribuita anche via email, in messaggi in chiaro, elimina la necessita' di utilizzare canali altamente sicuri per lo scambio della chiave utilizzata nei cifrari a chiave semplice. Iniziamo a vedere l'algoritmo in generale ed a analizzarlo dal punto di vista matematico. 1)Il cifrario RSA e' basato sul prodotto di due numeri primi di grandi dimensioni, che possono superare le 300 cifre. Ricordo inanzitutto che un numero si dice primo solo se e' divisibile per 1 e se stesso. Noi prenderemo due numeri primi piccoli per fare un esempio: P = 7 e Q = 11 2)Ora chiamiamo N il prodotto dei due: N = P * Q = 77 3)Ora calcoliamo il valore della funzione di Eulero di N in questo modo: M = f(n) = (P-1)*(Q-1) Nel nostro caso M = 60 Vi ricordo che il valore della funzione di Eulero dovra' rimanere segreto. 4)Ora scegliamo un numero E tale che E e M siano primi tra loro. Poiche' 1 < E < M allora iniziamo a dividere M per tutti i numeri maggiori di 1 fino a che non troviamo un numero che abbia una parte decimale. 60 / 2 = 30 60 / 3 = 20 60 / 4 = 15 60 / 5 = 12 60 / 6 = 10 60 / 7 = 8.57 Quindi E = 7 5)Ora calcoliamo D usando la formula D = ((H * M) + 1) / E in modo che H sia il piu' piccolo valore per cui D sia intero. Quindi iniziamo a sostituire H con i numeri 1,2,3,... fintanto che il risultato trovato non sia intero. D = ((1 * 60) + 1) / 7 -> NO D = ((2 * 60) + 1) / 7 -> NO .... .... D = ((5 * 60) + 1) / 7 = 301 / 7 = 43 D = 43 6)Bene ora abbiamo generato la nostra chiave che useremo per crifrare/decifrare i dati. Per cifrare usiamo la formula: C = (B^E) mod N Dove C e' il testo cifrato, mentre B e' il valore decimale del testo che vogliamo cifrare. Prendiamo come esempio B = 3 -> C = (3 ^ 7) mod 77 = 31 Per decifrare usiamo la formula: L = (C^D) mod N Prendiamo ora il numero precedentemente ottenuto e decifriamolo: L = (31 ^ 43) mod 77 = 3 Nota: si potrebbe pensare che si possa semplicemente calcolare la funzione di Eulero senza utilizzare i numeri primi P e Q. Questo non e' impossibile ma richiede un ingente quantita' di tempo, avendo lo stesso grado di complessita' della fattorizzazione di N. 1.1 OpenSSL/RSA Vediamo ora come utilizzare openssl in combinazione con RSA. Creiamo inanzitutto le chiavi RSA, e per fare questo si usa openssl genrsa: openssl genrsa [-out nome_file] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [numbits] binduck@fuzzy:~$ openssl genrsa -des3 1024 > key.pem Con questo comando generiamo una chiave RSA di lunghezza 1024 bits e la salviamo nel file key.pem nel formato PEM. Verra' chiesto di inserire una password per cifrare la chiave con 3des prima di salvarla(possiamo sostituire -des3 con -des o -idea). Se invece non vogliamo cifrarla basta fare eliminarel'opzione -des3: binduck@fuzzy:~$ openssl genrsa 1024 > key.pem Vediamo le altre opzioni del comando openssl genrsa: -out file_out :Il nome del file di output. -passout arg :Il file sorgente delle password per l'output. -F4|-3 :L'esponente pubblico da usare(65537 o 3(default 65537)) numbits :Numero di bits(minimo consigliato 1024). PER MAGGIORI INFORMAZIONI SULLE OPZIONI: genrsa(1) Ora ricaviamo la chiave pubblica da quella privata appena generata, utilizzando openssl rsa: openssl rsa[-inform] [-outform |PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [passout arg] [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] -in file :Legge la chiave RSA contenuta nel file passato come argomento.(Per default la chiave sara' intesa come privata). -pubin :Dichiara che la chiave letta con -in file sara' pubblica. -pubout :Dichiara che l'output sara' una chiave pubblica. binduck@fuzzy:~$ openssl rsa -in key.pem -pubout > pub.pem o in maniera equivalente: binduck@fuzzy:~$ openssl rsa -in key.pem -pubout -out pub.pem Vediamo le altre opzioni interessanti: -check :Controlla la struttura di una chiave privata RSA. binduck@fuzzy:~$ openssl rsa -check -in key.pem Altre opzioni utili sono quelle che permettono di cifrare una chiave, con un algoritmo a scelta tra des, 3des, idea, in un secondo momento dalla creazione della chiave. binduck@fuzzy:~$ openssl rsa -in key.pem -des3 -out key.pem A questo punto bastera' digitare la pass phrase, confermarla e la vostra chiave sara' cifrata. Ovviamente possiamo essere interessati a rimuovere la password dalla chiave: binduck@fuzzy:~$ openssl rsa -in key.pem -out keydec.pem Dovrete inserire la pass phrase per eliminare la cifratura e il gioco e' fatto. -modulus :Stampa il modulo della chiave. binduck@fuzzy:~$ openssl rsa -in key.pem -modulus PER MAGGIORI INFORMAZIONI SULLE ALTRE OPZIONI: rsa(1) Ora passiamo a vedere come cifrare/decifrare,firmare/verificare dati usando l'algoritmo RSA. openssl rsautl [-in file][-out file][-inkey file][pubin][-certin] [-sign][-verify][-encrypt] [-decrypt][-pkcs][-ssl][-raw][-hexdump] [-asn1parse] NOTA: rsautl, poiche' usa l'algoritmo RSA direttamente puo' essere usato solo per cifrare dati di piccole dimensioni. Se tentiamo di firmare un file troppo grande verra' generato un errore che ci dira' appunto che la dimensione del file era troppo elevata per la chiave usata. -inkey file :Usa la chiave contenuta nel file passato come argomento. (Per default rsautl si aspettera' una chiave privata). -pubin :Dichiara che la password contenuta nel file letto con -inkey file e' una chiave pubblica. -certin :Dichiare che l'input sara' un certificato contentente una chiave RSA. Prendiamo come esempio un file contenente una password. echo "rsa_algorithm" > pass.txt Ora per cifrare il file digitiamo: binduck@fuzzy:~$ openssl rsautl -encrypt -in pass.txt -inkey pub.pem -pubin> crypto Ora avremo la nostra password cifrata nel file "crypto". Ovviamente pub.pem e' la chiave pubblica precedentemente generata con openssl genrsa. Vediamo ora il processo inverso, decifriamo la password: binduck@fuzzy:~$ openssl rsautl -decrypt -in crypto -inkey key.pem Questo stampera' sullo stdout la password in chiaro. key.pem e' la chiave privata, poiche' stiamo decifrando. Mettiamo il caso che vogliamo semplicemente firmare un documento usando la nostra chiave privata(anche nel caso delle firme possiamo firmare solo dati di piccole dimensioni). binduck@fuzzy:~$ openssl rsautl -sign -in small_file.txt -inkey key.pem -out signed_file Vediamo ora come verificare dei dati firmati: binduck@fuzzy:~$ openssl rsautl -verify -in signed_file -inkey key.pem PER MAGGIORI INFORMAZIONE SULLE ALTRE OPZIONI: rsautl(1) 1.1.1 GPG Se vi siete rotti delle limitazioni insite nell'uso di rsautl a causa della dimensione dei file vi consiglio di usare gpg. Pero' per quanto riguarda l'utilizzo di RSA in gpg bisogna ricordare che questo algoritmo e' usato solo per le firme. Ci sono ottime guide dedicate a questo programma, prima fra tutte il manuale che potrete trovare a questo indirizzo: http://www.gnupg.org/(en)/documentation 1.2 Impariamo ad implementare RSA nei nostri programmi. Ora passiamo alla parte piu' interessante: Impariamo come implementare RSA nei nostri programmi. 1.2.1 RSA - Headers Qui e' riportata la lista di headers che utilizzeremo per creare dei programmini di base. #include Funzioni per generare le chiavi, cifrare, decifrare, firmare, verificare dati. ----------------------------- #include Funzioni per leggere e scrivere strutture in formato PEM. Noi le utilizzeremo per salvae le chiavi RSA nei files. Ricordate openssl genrsa che salva le chiavi generate in formato PEM. ----------------------------- #include Funzioni per accedere ai codici di errore generati dalle funzioni della libreria openssl. ----------------------------- 1.2.2 RSA - Le chiavi Vediamo la struttura di una chiave RSA: struct { BIGNUM *n; //public modulus BIGNUM *e; //public exponent BIGNUM *d; //private exponent BIGNUM *p; //secret prime factor BIGNUM *q; //secret prime factor BIGNUM *dmp1; // d mod (p-1) BIGNUM *dmq1; // d mod (q-1) BIGNUM *iqmp; // q^-1 mod p }; RSA Ovviamente nelle chiavi pubbliche l'esponente privato(d) e i relativi valori segreti (p e q) sono NULL (per chiarirvi le idee potete andare a rivedervi la trattazione matematica al paragrafo 1). Nelle chiavi private p, q, dmp1, dmq1 e iqmp potrebbero anche essere NULL, ma le operazioni effettuate usando questa chiave risulterebbero piu' lente. Ricordiamo infatti che per decifrare si usa solo d (guardatevi sempre il par.1). Vediamo come creare le chiavi. Prima presentero' le funzioni necessarie e poi vedremo un semplice programma per creare le nostre chiavi. Inanzitutto dobbiamo allocare e iniziare una struttura RSA. Questo e' possibile con la funzione RSA_new(): --------------------------------------------------------------------- #include RSA * RSA_new(void); Ritorna NULL se fallisce l'allocazione; l'errore puo' essere ottenuto usando ERR_get_error() (spiegata piu' avanti). Come potete vedere dal programma per crear le chiavi usando la funzione RSA_generate_key() la struttura viene direttamente inizializzata. --------------------------------------------------------------------- RSA_free() libera la memoria occupata dalla struttura RSA, ma prima di fare cio' cancella la chiave. #include RSA_free(RSA *rsa); Ricordatevi di liberare sempre la memoria occupata dalle vostre chiavi. --------------------------------------------------------------------- Per creare le chiavi usiamo la funzione RSA_generate_key(): #include RSA *RSA_generate_key(int num, unsigned long e, void(*callback) (int,int,void *), void *cb_arg); int num: numero di bit. Come dice la man page e' meglio scegliere una chiave >= di 1024 bit. unsigned long e: e' l'esponente. Deve essere un numero dispari, tipicamente si sceglie 3, 17 o 65537. Se la funzione fallisce ritorna NULL. Il numero dell'errore puo' essere ottenuto sempre con ERR_get_error(). --------------------------------------------------------------------- #include int RSA_check_key(RSA *rsa); Questa funzione controlla se la chiave e' una vera chiave RSA. Se e' corretta allora la funzione ritorna 1, se non e' una chiave ritorna 0, mentre se la funzione fallisce ritorna -1. --------------------------------------------------------------------- Ora che sappiamo come creare la nostra chiave vediamo come scrivere la chiave privata in un file. Possiamo usare una funzione presente in pem.h: PEM_write_RSAPrivateKey(): #include int PEM_write_RSAPrivateKey(FILE *fp,RSA *x,const EVP_CIPHER *enc, unsigned char *kstr,int klen,pem_password_cb *cb,void *u); --------------------------------------------------------------------- Mentre per scrivere la chiave pubblica useremo PEM_write_RSAPublicKey(): #include int PEM_write_RSAPublicKey(FILE *fp,RSA *x); Tutte e due queste funzioni di scrittura ritornano 1 se hanno successo e 0 se falliscono. --------------------------------------------------------------------- Per leggere la chiave privata scritta in formato pem usiamo PEM_read_RSAPrivateKey(): #include RSA *PEM_read_RSAPrivateKey(FILE *fp,RSA **x,pem_password_cb *cb, void *u); --------------------------------------------------------------------- Per leggere la chiave pubblica usiamo PEM_read_RSAPublicKey(): #include RSA *PEM_read_RSAPublicKey(FILE *fp,RSA **x,pem_password_cb *cb, void *u); Le funzioni di lettura ritornano un puntatore alla struttura letta o NULL se c'e' un errore. Settiamo enc, cb, kstr e u a NULL e poniamo klen a 0 poiche' non necessitiamo di crittare le strutture PEM. --------------------------------------------------------------------- Ora sappiamo come creare e salvare le nostre chiavi. Prima di vedere un esempio pratico introduciamo anche le funzioni per il controllo degli errori. #include unsigned long ERR_get_error(void); Questa funzione ritorna il codice dell'ultimo errore. --------------------------------------------------------------------- #include char *ERR_error_string(unsigned long e, char *buf); Genera una stringa "human-readable". Un utilizzo di queste due funzioni combinate e' questo: printf("%s\n",ERR_error_string(ERR_get_error(),NULL)); --------------------------------------------------------------------- Bene ora vediamo un piccolo esempio su come creare una chiave e salvarla su dei files. -----------------------------keygen.c-------------------------------- /* Simple RSA Key generator. Saves keys in PEM format. Coded by binduck - Compile: gcc -lssl keygen.c -o keygen Usage: ./keygen Ex. ./keygen 1024 */ #include #include #include #include #define SECFILE "sec.pem" #define PUBFILE "pub.pem" int main(int argc, char *argv[]) { RSA *key; FILE *fp; int keylen=0; if(argc!=2) { fprintf(stderr,"Error: too many/few arguments.\n " "Usage: %s \n",argv[0]); exit(0); } keylen = atoi(argv[1]); if((key = RSA_generate_key(keylen,3,NULL,NULL)) == NULL) { fprintf(stderr,"%s\n",ERR_error_string(ERR_get_error(),NULL)); exit(-1); } if(RSA_check_key(key) < 1) { fprintf(stderr,"Error: Problems while generating RSA Key.\nRetry.\n"); exit(-1); } fp=fopen(SECFILE,"w"); if(PEM_write_RSAPrivateKey(fp,key,NULL,NULL,0,0,NULL) == 0) { fprintf(stderr,"Error: problems while writing RSA Private Key.\n"); exit(-1); } fclose(fp); fp=fopen(PUBFILE,"w"); if(PEM_write_RSAPublicKey(fp,key) == 0) { fprintf(stderr,"Error: problems while writing RSA Public Key.\n"); exit(-1); } fclose(fp); RSA_free(key); printf("RSA key generated.\nLenght = %d bits.\n",keylen); return 0; } --------------------------------------------------------------------- Per compilare digitate: gcc -lssl keygen.c -o keygen Usage: ./keygen binduck@fuzzy:~$ ./keygen 1024 Eseguendo il programma, questo ci creera' due files 'pub.pem' e 'sec.pem' in cuiverranno salvate le nostre chiavi RSA. Ovviamente potrete specificare la lunghezza da voi desiderata (Es. 64 o 512 o 2048). Ecco come risulterebbe una chiave privata a 1024 bit generata. -----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDWxE5+qNqE20NQWqRi71vkqroI+52CgzGmKv42BsE6kk1QiVSS 9Qm75bKfEP7Jz83NO/YO5DPHp6ZVr38nY6HCY3Ta/fNU0O/xNE3UiOQSK8dn7lbw 7itshIwjPpK09cgL6wos4Sm+lcHjdRk5DyTKcRNadWyXSxNsdrR5FWtImwIBAwKB gQCPLYmpxecDPNeK5xhB9Oftxyawp75XAiEZcf7Oryt8YYjgW423TgZ9Q8xqC1SG iokzfU60mCKFGm7jylTE7RaAXuiq84NDz71wmFjOgqGzePHl4CH5WnPi0GTwfssI cEBr5WjUu2DTNKAUdk+1jLJFXFY6UIws6tzZB1SPNNagewJBAPAvdSm765vsMcOL zfIks0rMpx9c4QZrXAgm+IoAN3EQOvZ9KNAK1xkUYDPJEyJ93GY5ZjyPaFnM9t+x n97l1r8CQQDk6GVm8oN9Z5aMPNDSzNGrj+f+xxngEjxDzcH2YfDcVy8cb8T4Daqt vWSP2JWZm4YAWJzACuuQ+zAMBAJnQ4ElAkEAoB+jcSfyZ/LL17KJTBh3hzMaFOiW BEeSsBn7BqrPoLV8pFNwirHku2LqzTC3bFPoRCZEKF+a5oiklSEVP0PkfwJBAJia 7kShrP5FDwgoizczNnJf7/8vZpVhfYKJK/mWoJLkyhL1Lfqzxx5+QwqQY7u9BAA7 Eyqx8mCndV1YAZotAMMCQQDYZg4eFgmTJuq/J/Ls7NusdBxuwh0fKRt2KPhCZw5r 5mEeCDflQ3ATBjeUt6Z77JG0aEmQUq5NOqd/ju1VtBst -----END RSA PRIVATE KEY----- Ed ecco la chiave pubblica relativa: -----BEGIN RSA PUBLIC KEY----- MIGHAoGBANbETn6o2oTbQ1BapGLvW+Squgj7nYKDMaYq/jYGwTqSTVCJVJL1Cbvl sp8Q/snPzc079g7kM8enplWvfydjocJjdNr981TQ7/E0TdSI5BIrx2fuVvDuK2yE jCM+krT1yAvrCizhKb6VweN1GTkPJMpxE1p1bJdLE2x2tHkVa0ibAgED -----END RSA PUBLIC KEY----- 1.2.3 Cifrare/Decifrare Nell'header openssl/rsa.h troviamo le funzioni di cui abbiamo bisogno: RSA_private_decrypt() e RSA_public_encrypt(). --------------------------------------------------------------------- #include int RSA_public_encrypt(int flen, unsigned char *from, unsigned char *to,RSA *rsa,int padding); unsigned char *from: stringa da crittografare. unsigned char *to: buffer dove la funzione mette l'output crittografato. RSA *rsa: chiave pubblica RSA. Come padding impostiamo RSA_PKCS1_OAEP_PADDING Ritorna la grandezza dei dati crittografati. --------------------------------------------------------------------- int RSA_private_decrypt(int flen,unsigned char *from,unsigned char *to,RSA *rsa,int padding); unsigned char *from: stringa da decrittare. unsigned char *to: buffer che conterra' l'output in chiaro. RSA *rsa: chiave privata RSA. Come padding impostiamo sempre RSA_PKCS1_OAEP_PADDING. Ritorna la grandezza del testo in chiaro. --------------------------------------------------------------------- Bene ora vediamo un programmino che cifra e decifra il contenuto di un file. RICORDO CHE STIAMO USANDO DIRETTAMENTE L'ALGORITMO RSA, QUINDI POSSIAMO INTERVENIRE SU UNA PICCOLA QUANTITA' DI DATI(ricordate rsautl nella prima parte dell'articolo?). --------------------------file_crypt.c------------------------------- /* Simple RSA encrypting/decrypting tool. Coded by binduck - Compile: gcc -lssl file_crypt.c -o file_crypt Usage: ./file_crypt -h for help */ #include #include #include #include #include #include #define SECFILE "sec.pem" #define PUBFILE "pub.pem" #define HELP 'h' #define GENKEY 'g' #define CIPHER 'c' #define DECIPHER 'd' RSA* readpemkeys(int type); void genkey(int size); int main(int argc,char *argv[]) { int ch,size=0,len=0,ks=0; FILE *fp; RSA *key; char char_opt[] = {HELP,GENKEY,CIPHER,DECIPHER}; unsigned char *out,*in,*mex; printf("RSA Cipher/Decipher Signer/Verifier.\n"); printf("Coded by Binduck - \n\n"); if (argc == 1) { printf("%s -h for help.\n",argv[0]); } while((ch=getopt(argc,argv,char_opt)) != -1) { switch(ch) { case HELP: printf(" %s -g :generates RSA keys and save them " "in PEM format.(1024 or 2048 are strongly suggested).\n",argv[0]); printf(" %s -c :crypt datas in 'file_in' " "and stores output in 'file_out'.\n",argv[0]); printf(" %s -d :decript datas in 'file_in' " "and stores output in 'file_out'.\n",argv[0]); break; case GENKEY: if(argc != 3) { fprintf(stderr,"Error: check arguments.\n%s -h for " "help.\n",argv[0]); exit(0); } printf("Generating RSA keys...\n"); size=atoi(argv[2]); printf("%d bits.\n",size); genkey(size); printf("Private Key saved in %s file.\n",SECFILE); printf("Public Key saved in %s file.\n",PUBFILE); printf("Done.\n"); break; case CIPHER: if(argc != 4) {