Fiorenzo Mangone

Writer


subject

Migliori articoli

I Bitcoin spiegati a mio padre - la crittografia

Nello scorso articolo abbiamo parlato dell'aspetto economico e della definizione dei Bitcoin in quanto moneta virtuale. Oggi invece andremo ad analizzarne l'aspetto crittografico. L’uso della crittografia risulta essere di importanza cruciale nel sistema Bitcoin; essa è usata per celare l’identità degli utenti della rete grazie alle funzioni Hash, per garantire che il denaro di un portafoglio sia speso solo dal legittimo proprietario, grazie ad uno schema di firma digitale chiamato Algoritmo di Firma Digitale su Curve Ellittiche (ECDSA), o impedire l'alterazione della Block Chain, cioè il registro generale di tutti le transazioni economiche effettuate. Funzioni crittografiche Hash Una funzione crittografica Hash è una funzione H che, dato in input una stringa m di lunghezza arbitraria (potenzialmente infinita), restituisce in output un messaggio H(m) di lunghezza predefinita chiamato digest. La lunghezza del digest è definita dall’algoritmo Hash usato, per esempio, nel sistema Bitcoin vengono utilizzate due funzioni, SHA256 e RIPEMD160 che, rispettivamente, restituiscono un output di 256 bit e 160 bit. Di seguito un esempio dell’output delle due funzioni in formato esadecimale. Ricordiamo che un carattere esadecimale è grande 4 bit, quindi le stringhe in output saranno lunghe rispettivamente 64 e 40 caratteri SHA256(‘Bitcoin’) = B4056DF6691F8DC72E56302DDAD345D65FEAD3EAD9299609A826E2344EB63AA4RIPEMD160(‘Bitcoin’) = 4C9F77AB9E5EEF487C2C0AE07029E79B2CA11A68 Proprietà le funzioni crittografiche Hash: Dato un messaggio m, deve essere impossibile risalire al messaggio originario m dall’output di H(m). Inoltre, deve essere facile e veloce per un calcolatore calcolare l’Hash del messaggio. Dato un messaggio Y deve essere computazionalmente impossibile[ 1 ] trovare un messaggio X tale che H(X) = Y. Proviamo a spiegarlo meglio: ipotizziamo ci sia un messaggio M, il cui Hash sia Y e quindi H(M)=Y. Quello che sottolinea il punto 2 è che deve essere difficile trovare un secondo messaggio X il cui Hash sia uguale a Y. Deve essere computazionalmente impossibile trovare due messaggi m1 e m2 diversi fra loro con H(m1) = H(m2). Dato che il digest ha una lunghezza finita, ci si aspetta che messaggi diversi possano avere Hash uguali. Quello che evidenzia questa proprietà, è che deve essere difficile trovare questi due messaggi m1 e m2, ovviamente più è grande l’output di un Hash, più è difficile che ciò si verifichi.  La differenza dal punto 2 sta nel fatto che in questo caso i due messaggi sono stati scelti da noi. Questo implica che se riuscissi a "violare" questa proprietà, potrei per esempio spacciarmi per un altro utente e usare il suo denaro. Vediamo ora un altro esempio: SHA256(’Bitcoin’) = B4056DF6691F8DC72E56302DDAD345D65FEAD3EAD9299609A826E2344EB63AA4SHA256(’bitcoin’) = 6b88c087247aa2f07ee1c5956b8e1a9f4c7f892a70e324f1bb3d161e05ca107b Come si può notare, una minima variazione nel messaggio iniziale produce un cambiamento radicale nell’Hash ottenuto in output. Perchè questo esempio? Le funzioni Hash vengono usate anche per verificare la correttezza di un messaggio. Infatti inserendo in input la medesima stringa, si avrà sempre il medesimo output. Come riportato dalla guida di Ubuntu, Quando si effettua il download di Ubuntu da internet, c'è la possibilità che il file non venga scaricato nel modo corretto e presenti degli errori. Questi errori possono compromettere la stabilità e/o il funzionamento di Ubuntu. Il programma md5sum è progettato per verificare l'integrità e l'autenticità dei dati usando l'hash crittografica a 128 bit MD5. Infatti, una volta scaricata la iso e il file MD5SUMS contenente l'Hash ufficiale, basterà ricalcolare l'Hash e confrontarlo. Digitando nel terminale il comando  md5sum -c MD5SUMS | grep ubuntu-14.04-desktop-amd64.iso, se non ci sono errori verrà restituito il messaggio: ubuntu-14.04-desktop-amd64.iso: OK Quando un utente effettua un pagamento, viene creata una transazione nel sistema dei Bitcoin. Data l’assenza di un ente centrale, come una banca, a fare da garante, la transazione deve essere verificata sei volte, cioè bisogna verificare che il mittente abbia effettivamente quella somma di denaro. La verifica avviene aggiungendo un nuovo blocco nella Block Chain, il quale conterrà la firma digitale del Hash della transazione precedente. In questo modo chi riceve il pagamento può controllare i diversi passaggi di proprietà della moneta trasferita verificando le firme presenti in ogni transazione. La modifica di una transazione non è quindi possibile poichè gli Hash non corrisponderebbero più. Crittografia asimmetrica La crittografia asimmetrica, conosciuta anche come crittografia a chiave pubblica e privata, è un tipo di crittografia dove ad ogni attore coinvolto nella comunicazione è associata una coppia di chiavi: una chiave pubblica, che può essere diffusa pubblicamente, ed una privata, che deve essere tenuta assolutamente nascosta. La caratteristica principale è che solo ciò che viene cifrato con la chiave pubblica può essere decifrato con la chiave privata associata, e viceversa. Ipotizziamo che Alice voglia mandare un messaggio a Bob. Lei userà la chiave pubblica di Bob Kpub, e genererà il messaggio cifrato. Quando Bob riceverà il messaggio cifrato, userà la sua chiave privata Kpriv per scoprire il contenuto del messaggio. Se C è quindi il messaggio cifrato, ed M il messaggio originale, risulta: C = encrypt(M, Kpub)M = decrypt(C, Kpriv) Firma digitale Con Firma Digitale si intende un mezzo che, grazie alla crittografia asimmetrica, consente di dimostrare l’autenticità di un messaggio. Come una firma su carta, una firma digitale per essere tale deve soddisfare le seguenti caratteristiche: Autenticità: il destinatario di un messaggio firmato può verificare che il messaggio non sia stato inviato da un’altra persona. Integrità: il messaggio non è stato manomesso. Non ripudiabilità: una volta inviato il messaggio, non si può negare di averlo fatto. Per quanto riguarda il sistema Bitcoin, per evitare che durante una transazione si subisca una frode viene eseguito questo algoritmo: Per inviare un messaggio firmato M: Si esegue l’Hash del messaggio: H = SHA256(M) Si cifra H con la chiave privata, per ottenere la firma: S = encrypt(H, Kpriv) Si invia la firma S insieme al messaggio M. Per verificare che la firma S sia valida per il messaggio M: Si esegue l’Hash del messaggio M: H = SHA256(M) Si decifra S con la chiave pubblica: H’ = decrypt(S, Kpub) Si verifica che H = H’. Se risultano uguali la firma è valida. Attacco a collisione Un attacco a collisione è un tipo di attacco in cui si cercano due messaggi in input, i quali producono lo stesso Hash in output. Come già sottolineato, è possibile che questo evento si verifichi, data la lunghezza finita dell'output delle funzioni Hash. Quando ciò si verifica, si dice che si ha una collisione. Quindi se un attaccante riuscisse a generare volutamente un indirizzo uguale a quello di un altro utente, l'attaccante potrebbe spendere il denaro dell'utente col medesimo indirizzo. Tuttavia ciò risulta essere computazionalmente improbabile. Infatti, per creare una collisione, significherebbe calcolare in media, 2^(160/2) valori Hash (ipotizzando un Hash di 160bit). Ad oggi, per calcolare tutti i possibili valori, si impiegherebbe un tempo troppo lungo (migliaia di anni). Lo scopo di questo articolo è stato quello di darvi alcune nozioni base che vi permetteranno più avanti di capire le fondamenta su cui sono stati costruiti i Bitcoin. La Crittografia è un mondo assai ampio e complesso, il quale non può essere riassunto in così poche righe. [1] Una serie di operazioni vengono definite computazionalmente impossibili o intrattabili quando per eseguirle è necessario un tempo lunghissimo (centinaia di anni) utilizzando il super computer più veloce attualmente esistente. Fonte: Introduction to Cryptography with Coding Theory

I Bitcoin spiegati a mio padre - la moneta virtuale

“Il Bitcoin è una valuta virtuale bla bla bla...“. Su internet si trovano moltissimi articoli sui Bitcoin, la maggior parte dei quali inizia più o meno così, che cercano di riassumere un argomento molto ampio in poche righe. Così ho deciso di creare la rubrica “I Bitcoin spiegati a mio padre”, il cui scopo è cercare di spiegare il mondo che ci sta dietro in modo chiaro ed esaustivo.Tornando alla definizione iniziale, per capire cosa sono i Bitcoin, dobbiamo capire cos’è la moneta virtuale, e quindi: cos’è la moneta virtuale? È una forma di denaro digitale. E cos’è il denaro digitale? Il denaro digitale è un tipo di moneta elettronica che esiste solo online. Ma allora cos’è il la moneta elettronica? (questa Matrioska pare non finire più...) La moneta elettronica Ok, finalmente abbiamo risalito la corrente e quindi, per capire qualcosa in più, partiamo dalla sua definizione tecnica; la Commissione europea definisce così la moneta o denaro elettronico (in inglese e-money): “Un valore monetario rappresentato da un credito nei confronti dell'emittente che sia memorizzato su un dispositivo elettronico, emesso previa ricezione di fondi di valore non inferiore al valore monetario emesso e accettato come mezzo di pagamento da soggetti diversi dall'emittente” che, detto in parole povere, è “l'equivalente in forma digitale del denaro contante, memorizzato su un dispositivo elettronico” Un esempio tipico di moneta elettronica è il portafoglio elettronico (chiamato anche Smart Card o Carta prepagata), tramite il quale è possibile eseguire piccoli pagamenti usando un account personale ad esso associato. Il portafoglio elettronico consente ad un individuo di eseguire transazioni monetarie (online o in un negozio fisico) tramite l'uso di dispositivi elettronici, come computer o smartphone o carte elettroniche. Di portafoglio ne esistono due tipologie: device-based: attraverso l'utilizzo di dispositivi elettronici dotati di tecnologia Near Field Communication (NFC), presente anche su alcuni smartphone, si può eseguire una transazione in modo molto semplice: appoggiando il device su un lettore si effettua il pagamento. internet-based: concede all'utente la possibilità di creare un proprio profilo a cui associare uno o più strumenti di pagamento come carte di credito o conti correnti bancari. Per effettuare un acquisto online basterà accedere con le credenziali del proprio profilo, senza dover fornire i dati della carta al sito e-commerce. PayPal o Google Wallet ne sono due classici esempi. Torniamo al denaro digitale... Abbiamo detto che il denaro digitale è una forma di denaro elettronico, quindi un mezzo tramite il quale possiamo effettuare pagamenti online. Ma allora perchè chiamare in modo differente la stessa cosa? Perchè una differenza c’è: mentre il denaro elettronico si basa sul fatto che la cifra presente sulla carta prepagata corrisponde a quanto versato in banca, e che quindi al pagamento o alla ricezione di denaro il capitale viene aggiornato, il denaro digitale invece è una forma di pagamento che sostituisce le normali banconote, e che può essere utilizzato per eseguire transazioni solo su internet. Di fatto, non esiste la corrispettiva valuta fisica. Una delle prime società ad usare la moneta digitale è stata la E-gold, fondata nel 1996 e che faceva uso del Digital gold currency (DGC), una forma di valuta privata, e quindi indipendente dalle agenzie governative, basata sui metalli preziosi. La sua caratteristica stava nel fatto che, a differenza di una moneta cartacea nazionale soggetta ad inflazione, un grammo di oro digitale aveva lo stesso valore in tutti i paesi del mondo in quanto l'oro è universalmente accettato in base al peso, non importa da quale fonte provenga. Un altro esempio è stata Liberty Reserve, fondata nel 2006, le cui valute erano il Liberty Reserve Dollars e il Liberty Reserve Euro, avente il loro equivalente in Dollaro(USD) e Euro(EUR). Entrambe furono chiuse dal governo degli Stati Uniti per riciclaggio di denaro. La valuta virtuale Rimane però un problema: gli esempi appena descritti, nonostante fossero già qualcosa di più astratto rispetto ad una classica valuta nazionale, si basavano su qualcosa di materiale come l’oro, mentre, per quanto riguarda la valuta virtuale, la storia è diversa, in quanto a conti fatti si tratta solo di un insieme di numeri senza una tangibilità.Ma andiamo con ordine: le valute virtuali appartengono alla categoria delle monete digitali, quindi valute create e controllate da un team di sviluppatori indipendenti ed sono utilizzate tra membri di una specifica comunità virtuale. Queste valute non hanno nessun vincolo giurisdizionale, perchè non hanno legami con una Banca Centrale o Enti pubblici ma possono essere legalmente accettate tra tutte le persone che decidono di usarle come mezzo di pagamento.Esse possono essere generate, immagazzinate o scambiate elettronicamente, il tutto senza il bisogno di organi che facciano da tramite. Al mondo ne esistono una quantità enorme, ma sono quasi un centinaio quelle con un reale utilizzo, tutte sviluppate da team differenti e con obbiettivi e caratteristiche differenti, se non per una cosa in comune: tutte usano un sistema crittografico, sia per la generazione che per la transazione delle stesse. Per questo vengono chiamate criptovalute. Al tempo stesso però sono valute pubbliche, in quanto il codice sorgente è presente su GitHub, e chiunque può analizzarne il contenuto alla ricerca di falle o di possibili raggiri, o, perchè no, forkarne il progetto per crearne una valuta nuova. La prima ad aver preso piede, nonchè la più famosa è il Bitcoin. Per ora è tutto. Per scoprire tutto sulla storia del Bitcoin, come viene generato e perchè funziona, non vi resta che aspettare il prossimo articolo. Alla prossima.

[TaskerTime] Musica nelle tue cuffie!

Eccoci ad un altro capitolo della nostra rubrica TaskerTime. Oggi vediamo come, inserendo le cuffie nello smartphone, avere l'immediato avvio della musica. Per farlo basteranno pochi passaggi: aggiungiamo lo Stato - Cuffie Collegate - Qualunque. Come nuova attività in entrata associata allo Stato, impostiamo Volume Media - Livello 9 per avere un volume iniziale medio-alto e Controllo Media - Play [Simulazione] selezionando come App l'applicazione da noi scelta. Nel mio caso, ho scelto il music player predefinito. Come attività in uscita Volume Media - Livello 0, Controllo Media - Stop e Kill App - Musica Se riceviamo un messaggio audio o guardiamo un video e vogliamo ascoltarlo in cuffia, per quanto detto sopra, partirà automaticamente la musica, portandoci ad odiare il nostro amato plugin. Per questo motivo dobbiamo effettuare qualche cambiamento alla configurazione precedente. Creiamo una variabile %Social settata a 0 e aggiungiamo come Applicazione tutte quelle apps per le quali non vogliamo che parta la musica quando sono in primo piano. Come attività in ingresso al task Applicazione appena creato,  impostiamo Imposta %Social a 1, e come attività in uscita Imposta %Social a 0. La stessa configurazione dobbiamo impostarla per il nuovo stato Chiama - Tutti, in modo da non far partire la musica se riceviamo o effettuiamo una chiamata. Ora non ci resta che modificare l'attività in entrata di Cuffie Collegate un If, che eseguirà Controllo Media - Play solo se la variabile %Social è uguale a 0.

[TaskerTime] Modalità Silenziosa Ad Hoc

In uno degli ultimi articoli abbiamo parlato di come possiamo disabilitare la modalità silenziosa durante le chiamate. Oggi vedremo come attivare la modalità silenziosa quando lo schermo dello smartphone è acceso e disattivarla quando è spento. In questo modo il telefono eviterà di vibrare o suonare mentre lo stiamo usando.  Come prima cosa,  aggiungiamo l'evento Display Off e, come nuova attività, Do Not Disturb - Tutti, la quale consentirà al telefono di suonare. Allo stesso modo, l'opzione Display On in modalità Do Not Disturb - Alarms, non permetterà al telefono di emettere alcun suono quando lo schermo è acceso. Questa configurazione presenta però una criticità: alla ricezione di una chiamata consegue l'accensione dello schermo, la quale, attivando la modalità silenziosa, comporta, in caso di non utilizzo del telefono, la possibile perdita della chiamata stessa. Per questo motivo sarà necessario aggiungere un'ulteriore condizione che non attiverà la modalità silenziosa alla ricezione di una chiamata. Come prima cosa, inizializziamo una variabile (che ho chiamato Call) dal menù Vars a 0. Aggiungiamo quindi lo stato Chiama - In Entrata, impostando la variabile %Call a 1 e attivando la modalità Do Not Disturb - Priorità. Inseriamo come Attività in Uscita Imposta %Call a 0 e Do Not Disturb - Alarms. Per finire, modifichiamo l'evento Display On, inserendo come condizione l'attivazione della modalità Do Not Disturb - Alarms solo se la variabile %Call è diversa da 1.