Arduino Forum

International => Italiano => Software => Topic started by: leo72 on Apr 14, 2013, 11:00 pm

Title: Nuova libreria pRNG
Post by: leo72 on Apr 14, 2013, 11:00 pm
Ogni tanto mi risveglio dal letargo e divento pericoloso perché mi metto a produrre software  ]:D
Questa volta è il turno della pRNG da pretty Random Number Generator, una libreria che serve, come si capisce dal nome, a produrre numeri pseudo casuali.

Dove sta l'inghippo?  :smiley-yell:
L'inghippo sta nel fatto che questa libreria cerca di generare numeri pseudo casuali discretamente casuali. Come saprete la funzione random() di Arduino è tutto fuorché random perché ogni volta che si avvia la scheda, la sequenza riparte. Con pRNG ho cercato un modo alternativo per generare una sequenza non ripetibile, evitando i pastrocchi della lettura dei pin analogici che di casuale hanno ben poco  ;)

La libreria utilizza un interrupt sollevato dal WatchDog Timer per collezionare entropia usando un timer dell'Arduino (o del microcontrollore) ed un registro a scorrimento a retroazione lineare (in inglese LFSR, da Linear Feedback Shift Register) di Galois a 32 bit. I dati casuali sono prelevabili come singoli byte da un pool costantemente aggiornato. Il meccanismo permette di avere sequenze sempre diverse e mai ripetute (per lo meno non nel breve periodo).

Ormai il WatchDog lo conoscerete senz'altro perché ve l'ho menata non so quanto a riguardo visto che l'ho usato nel mio leOS2. Sfruttando la possibilità che offre di generare anche un interrupt, si può creare una ISR (Internet Service Routine) che periodicamente fa scorrere il registro: il registro restituisce in output un bit, bit che viene poi combinato tramite XOR con il bit meno significativo del contatore di un timer del microcontrollore ed il risultato che si ottiene viene inserito in un pool. Grazie a questo meccanismo la sequenza di bit generata appare semi casuale, ripetendosi solo dopo un elevato numero di estrazioni, e più è grande il registro maggiore è questo valore. L'uso del registro a scorrimento è il meccanismo usato che consente di avere sequenze molto complesse. Resta il problema della ripetibilità all'avvio. Ad esempio, la funzione random predefinita dell'Arduino in realtà di random non ha nulla dato che ad ogni avvio essa restituisce sempre la stessa sequenza numerica: pRNG, invece, ogni volta che viene avviato restituisce una sequenza diversa. Ciò è possibile perché il registro a scorrimento è usato in combinazione con un seme casuale sempre diverso per cui anche la sequenza che esso restituisce varia ogni volta.

Vediamo come viene estratto questo seme. Il WatchDog Timer riceve il clock da un oscillatore a 128 kHz mentre tutte le altre periferiche del microcontrollore, compresi i timer, ricevono il clock di lavoro da un'altra fonte, che per le schede Arduino è il risuonatore ceramico esterno. Grazie alle tolleranze produttive, ogni componente viene realizzato diverso dagli altri con specifiche di funzionamento grosso modo uguali ma mai perfettamente identiche. Queste tolleranze sono responsabili della non perfetta precisione del segnale generato, che può subire delle oscillazioni rallentando oppure accelerando rispetto alla frequenza nominale. Sfruttando questo fatto, accade che quando viene chiamata la routine di interrupt del WatchDog ed andiamo a leggere il contatore del timer, può accadere che l'oscillatore del primo abbia avuto una leggera accelerazione rispetto al secondo o viceversa. Questa differenza permette ad ogni intervallo di leggere nel contatore del timer un valore leggermente differente. Questo è il meccanismo alla base della pRNG grazie al quale essa non genera mai la stessa sequenza di numeri casuali.

L'uso della libreria è molto semplice. Basta scaricare l'archivio e scompattarlo nella cartella /libraries contenuta nella propria cartella degli sketch. A questo punto basta includerla nel proprio sketch ed istanziarne una copia:

Code: [Select]
#include "pRNG.h"
pRNG prng;

Nel setup() va inizializzata prima dell'uso con il metodo begin():

Code: [Select]
void setup() {
prng.begin();


La libreria fornisce 2 soli metodi, getRndByte() per estrarre dal pool un byte casuale (0..255), e getRndInt() per estrarre un intero senza segno (0..65535):

Code: [Select]
byte valByte = prng.getRndByte();
unsigned int valInt = prng.getRndInt();


Una nota a riguardo del pool di numeri casuali. Esso ha una dimensione predefinita di 10 byte (modificabile nel file pRNG.cpp) e viene popolato bit per bit a partire da quello meno significativo del primo byte fino al bit più significativo dell'ultimo byte. Una volta raggiunta l'estremità del pool, l'algoritmo riparte dall'inizio. Quando si estrae un byte, viene prelevato il primo byte dal pool e tutti quelli successivi vengono spostati indietro di una posizione per occupare lo spazio vuoto che si è creato. Se nel pool non sono disponibili almeno 8 bit, verrà atteso finché non sarà pronto 1 byte di entropia. Questa cosa è da tenere a mente perché richieste continuative di numeri casuali saranno evase solo quando i dati saranno disponibili. Il WatchDog Timer è impostato con il minimo prescaler possibile, che genera un interrupt circa ogni 16 millisecondi, per cui per ottenere 1 byte di entropia sono necessari circa 8*16=96 ms.

La libreria è compatibile con tutti i microcontrollori Atmel ad accezione dell'ATmega8 perché il suo WatchDog Timer non è capace di sollevare un interrupt.

IMPORTANTE:
la libreria NON deve essere utilizzata nel caso si richieda un VERO generatore di numeri casuali perché non è garantito che la pRNG non fornisca ad un certo punto una sequenza ripetibile di numeri. Nel caso si necessiti di più sicurezza, è bene rivolgersi a sistemi di generazione di numeri casuali diversi.

AVVISO PER GLI UTENTI DELLA ARDUINO MEGA/MEGA2560:
il bootloader originale delle schede Arduino MEGA e MEGA2560 non disattiva il watchdog al riavvio del microcontrollore per cui si incorre in un reset infinito che blocca il chip. Per evitare questo problema bisogna sostituire il bootloader con uno aggiornato che è esente da questo problema. Il bootloader è prelevabile da questa pagina (https://github.com/arduino/Arduino-stk500v2-bootloader/tree/master/goodHexFiles).

La libreria è scaricabile da questa pagina (http://www.leonardomiliani.com/2013/nuova-libreria-prng/).
Title: Re: Nuova libreria pRNG
Post by: PaoloP on Apr 15, 2013, 06:14 pm
Bel lavoro.

x iscrizione.
Title: Re: Nuova libreria pRNG
Post by: leo72 on Apr 15, 2013, 08:56 pm
Grazie  :smiley-sweat:
Temevo fosse passata in secondo piano e nessuno l'avesse notata  ;)

Ho fatto un lavoraccio nella ricerca di un sistema per generare un buon campione di entropia.
Intanto il registro scelto, che unisce una discreta casualità ad una ripetitività distribuita su un lungo periodo. L'LFSR di Galois lo avevo già usato per generare del rumore bianco, usato poi per simulare un rumore casuale che, a bassa frequenza, ricordava un po' un'esplosione. A questo ho aggiunto il seme preso dal registro di un timer.
L'idea dell'oscillatore separato del WDT permette di leggere il valore del registro di un timer con un intervallo che è sempre leggermente differente ogni volta, grazie a questa cosa ad ogni avvio hai sempre una sequenza differente senza fare strane letture sui pin analogici che di casuale hanno ben poco.
Del registro prendo solo il bit meno significativo e lo miscelo con uno XOR al bit in uscita dall'LFSR, per aumentare appunto la casualità.

I timer non vengono toccati, per cui l'uso dell'Arduino rimane inalterato in tutto e per tutto. Se però si è disposti a sacrificare un timer, volendo uno può impostare il timer 1, che è a 16 bit, in modalità contatore agganciandolo senza prescaler al clock di sistema, 16 MHz, per avere maggior casualità in ingresso.
Title: Re: Nuova libreria pRNG
Post by: gpb01 on Apr 15, 2013, 09:13 pm
Bel lavoro Leo, però ...
... con 2.95 US$ ci metto questo https://www.sparkfun.com/products/11551 (https://www.sparkfun.com/products/11551) che ha un generatore di numeri random HW di qualità (... e che fa tante altre belle cose)  :P :P :P

Ahahahahah  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green:

Guglielmo
Title: Re: Nuova libreria pRNG
Post by: leo72 on Apr 15, 2013, 09:18 pm
Ma quello è un chip di autenticazione (che avevamo già conosciuto in un'altra discussione, mi ricordo) mentre il mio è un generatore di numeri casuali.
Mettiamo che vuoi fare per i tuoi figli/nipoti/amici il classico gioco dei dadi usando un chip e qualche led... Se usi la rnd() di Arduino, ogni volta che accendi saprai sempre la sequenza che ottieni. Con la pRNG no  ;)

Chissà poi in quanti altri casi ti serve un numero veramente casuale e non sai come ottenerlo:
1) facilmente
2) senza componenti esterni
Con pRNG non spendi un soldo né usi nulla di extra  XD

Ovviamente scherzo e se uno ha bisogno di qualcosa di serio deve giustamente rivolgersi ai prodotti specifici.

EDIT:
vedo ora che può generare anche numeri casuali. Ok. Però pRNG non costa nulla  ;)
Title: Re: Nuova libreria pRNG
Post by: gpb01 on Apr 15, 2013, 09:28 pm

...
EDIT:
vedo ora che può generare anche numeri casuali. Ok. Però pRNG non costa nulla  ;)


Si, il datasheet parla proprio di :  "Internal, high-quality Random Number Generator (RNG)" ...

"Random Number Generator (RNG)
The ATSHA204 includes a high-quality random number generator that returns a 32-byte random number to the system. The device combines this generated number with a separate input number to form a nonce that is stored within the device in TempKey and may be used by subsequent commands.
The system may use this random number generator for any purpose. One common purpose would be as the input challenge to the MAC command on a separate CryptoAuthentication device. The device provides a special Random command for such purposes, which does do not affect the internally stored nonce.
To simplify system testing, prior to locking the Configuration zone the random number generator always returns the following value:
ff ff 00 00 ff ff 00 00 ...
where ff is the first byte read from the device and is used for the SHA message.
To prevent replay attacks on encrypted data that is passed to or from the ATSHA204, the device requires that a new, internally generated nonce be included as part of the encryption sequence used to protect the data being read or written. To implement this requirement, the data protection key generated by GenDig and used by the Read or Write command must use the internal random number generator during the creation of the nonce.
Random numbers are generated from a combination of the output of a hardware random number generator and an internal seed value, which is not externally accessible. The internal seed is stored in the EEPROM, and is normally updated once after every power-up or sleep/wake cycle. After the update, this seed value is retained in registers within the device that are invalidated if the device enters sleep mode or the power is removed.
"

... e si, costa (... anche se poco) e usa un pin :D :D :D

Guglielmo
Title: Re: Nuova libreria pRNG
Post by: leo72 on Apr 15, 2013, 09:32 pm
Vedi? La LMSoft (che sarei io  :smiley-yell: :smiley-yell: ) è specializzata nell'offrire soluzioni a 360° volte a permettere all'utente la risoluzione di tutta quella serie di piccoli  problemi che affliggono il programmatore moderno, dall'RTC software impreciso al finto RTOS fino ad arrivare ad un RNG "carino"  ;) (pRNG sta difatti per pretty Random Number Generator)
Title: Re: Nuova libreria pRNG
Post by: testato on May 10, 2013, 01:05 am
Bravo  :)
Title: Re: Nuova libreria pRNG
Post by: leo72 on May 10, 2013, 09:11 am
Ma l'hai provata?  ;)
Title: Re: Nuova libreria pRNG
Post by: testato on May 10, 2013, 01:13 pm
no, altrimenti invece di scrivere Bravo avrei scritto Testato :-)
pero' oggi la provo ok ?
Title: Re: Nuova libreria pRNG
Post by: testato on May 10, 2013, 06:04 pm
TESTATO  :)
come al solito lavoro bello, interessante, istruttivo

Testata su IDE 1.5.2 (win7-64)
Importata tramite funzione automatica dello .zip

Correzioni e proposte di modifica:

Nel README.TXT
Quote
- will return a random insigned long integer (0..4294967295).
- Whe WatchDog Timer is clocked by a separated 128 kHz clock


Sketch di esempio:
Proporrei il seguente scketch, sia per tenere in ordine crescente i metodi, sia per includere il LONG ora assente
Code: [Select]
void loop() {
   Serial.println(prng.getRndByte());
   delay(1000);
   Serial.println(prng.getRndInt());
   delay(1000);
   Serial.println(prng.getRndLong());
   delay(1000);
}

Title: Re: Nuova libreria pRNG
Post by: gpb01 on May 10, 2013, 06:13 pm
Leo, correggimi se sbaglio, in tutti i casi in cui il numero random serve in situazioni NON deterministiche/ripetitive (es. solo all'accadere di un certo evento), senza portarsi dietro codice aggiuntivo, la sequenza :

Code: [Select]

randomSeed(millis());
myRand = random();


dovrebbe comunque garantire numeri NON determinabili e NON ripetitivi ... giusto ?

Guglielmo
Title: Re: Nuova libreria pRNG
Post by: testato on May 10, 2013, 07:07 pm
randomSeed altera solo il primo numero generato, ne deriva che se l'evento capita al millis x, poi si spegne si riaccende, e ricapita al millis x, il primo numero generato e' sempre lo stesso.
Logicamente richiamando millis inizia a diventare veramente difficile. pero' e' gia' meno difficile del metodo randomSeed(analogRead(0));
la libreria di leo va ancora oltre
Title: Re: Nuova libreria pRNG
Post by: testato on May 10, 2013, 07:31 pm
TEST n2
Random ufficiale (senza seed) vs pRNG
Protocollo di test: Stampa di numeri generati durante 5 boot separati
Risultato: Superato

Quote
Random: 16807
57
6919
18869
Random: 16807
22
21117
4294947658
Random: 16807
87
63414
30767
Random: 16807
207
47937
220
Random: 16807
175
14193
467
Title: Re: Nuova libreria pRNG
Post by: gpb01 on May 10, 2013, 08:24 pm

randomSeed altera solo il primo numero generato, ne deriva che se l'evento capita al millis x, poi si spegne si riaccende, e ricapita al millis x, il primo numero generato e' sempre lo stesso.
...


No, non si spegne, stà in attesa di ... un evento che però NON è deterministico (... ed è proprio la casualità dell'evento che rende il tutto non predeterminabile) ... quindi, credo, rendendo la sequenza un "perfetto" generatore casuale, senza l'overload di un'altra, per quanto snella, libreria. ;)

Guglielmo
Title: Re: Nuova libreria pRNG
Post by: testato on May 10, 2013, 09:40 pm
il non spegnimento non esiste se parli di millis, perche' all'overload all'overflow e' come se avessi spento  :)
faccio una classifica per come la vedo io:

Dal peggiore al migliore
- random senza seed o con seed fisso
- random con millis come seed
- random con analog come seed
- pRNG

Title: Re: Nuova libreria pRNG
Post by: gpb01 on May 10, 2013, 09:53 pm

il non spegnimento non esiste se parli di millis, perche' all'overload e' come se avessi spento  :)
...


... overflow ;)

Si, ma come ti ho spiegato la sequenza è chiamata da eventi già di per se casuali, quindi ... credo che sia NECESSARIAMENTE essa stessa casuale ;)

Guglielmo
Title: Re: Nuova libreria pRNG
Post by: testato on May 10, 2013, 10:03 pm
certo, ma qui e' come la questione degli antifurti, ogn'uno decide a che livello arrivare.
ad esempio l'affidabilita' della pRGN, che per me e' gia' un qualcosa di impressionante, di inespugnabile al solo pensiero, per altri non lo e'. Leo stesso alla fine dice che se si vuole piu' sicurezza esistono metodi di piu' alto livello.
Quindi se a te basta la millis va bene cosi', sei tu a decidere. Per me basta anche la random senza seed  XD
Title: Re: Nuova libreria pRNG
Post by: leo72 on May 11, 2013, 10:16 am
Il problema è proprio determinare quanto un evento non è deterministico  ;)
In crittografia non si dà mai per scontato nulla.

A noi inserire come seed del generatore random il valore di millisecondi passati dall'accensione dell'Arduino o di un computer pare un valore molto casuale. Per i crittoanalisti invece non lo è assolutamente. Un protocollo crittografico che prende il tempo trascorso dall'accensione della macchina è considerato con un livello di sicurezza pari a zero perché è replicabile, anche se in condizioni estreme: bisognerebbe calcolare il tempo esatto al us di avvio del SO, del software e poi prendere il momento esatto in cui è stato prelevato quel valore. Ma è replicabile.

Eventi invece non dipendenti da fattori esterni sono considerati più sicuri. Certo, può capitare che i 2 oscillatori interni del micro (quello del WDT e quello del clock di sistema)  abbiano la stessa identica tolleranza per cui all'avvio girino perfettamente sincronizzati. In questo caso si potrebbe allora introdurre altra entropia leggendo ad esempio il valore del sensore di temperatura che è integrato in molte MCU della serie Atmega ed Attiny, avendo in questo modo altri 8/10 bit di entropia certa (è difficile che in 2 stanze ci sia la stessa identica temperatura ambientale esatta al centesimo di grado).
Oppure, iniziando ad usare hardware esterno, utilizzare ad esempio il rumore di uno zener amplificato con un transistor o un opamp. Ma qui si inizia ad usare componenti extra, e si esulo dallo scopo per cui ho scritto la pRNG: fare con quello che ci si ritrova in casa.
Title: Re: Nuova libreria pRNG
Post by: Etemenanki on May 11, 2013, 12:24 pm
Be', il sistema che avevo progettato quando ero sotto naja prevedeva proprio una soluzione hardware di quel tipo ... la giunzione di un transistor polarizzata inversamente (che ho sempre usato anche come generatore di rumore bianco per le tarature audio) amplificata, squadrata, e conteggiata ogni secondo in una diversa banda (arrivi tranquillamente a 50KHz, quindi di numeri casuali in quel modo ne generi finche vuoi ... che piu casuali di cosi si muore :P :D) ... pero', sempre hardware esterno extra, e' ... anche facendo tutto il lavoro di filtraggio e conteggio all'interno dell'arduino, ti serve sempre il transistor, almeno un'operazionale doppio, ed un po di componenti discreti ... non molta roba, ma sempre piu di zero :P

EDIT: leo, e mettendo una ntc (se gia non hai il sensore termico di cui parli) su un paio di ingressi analogici e lasciando gli altri aperti per leggere il rumore, magari connessi a piste lunghe terminate a vuoto che facciano da "antenne", e poi usando tutti questi valori, magari scramblerando uno con l'altro con delle exor ? ... non penso che una cosa simile possa essere replicata tanto facilmente, specie la lettura di valori random delle analogiche lasciate aperte, ed i componenti esterni sarebbero semplicemente una o due pastiglie ntc, o meglio ancora una ntc ed una ptc, cosi non potrebbero essere uguali neppure per tolleranza ?
Title: Re: Nuova libreria pRNG
Post by: gpb01 on May 11, 2013, 01:29 pm

Il problema è proprio determinare quanto un evento non è deterministico  ;)
In crittografia non si dà mai per scontato nulla.

A noi inserire come seed del generatore random il valore di millisecondi passati dall'accensione dell'Arduino o di un computer pare un valore molto casuale. ..........


Si, ovviamente Leo, il valore di millis() è chiaramente ripetibile ed è per questo che ti parlavo di un evento esterno NON deterministico (e quindi di sua natura CASUALE) che quindi rende casuale anche il valore di millis() usato per il seed.

La mia questione nasceva difatti da UN particolare caso che stò affrontatndo in questi giorni dove ... non è comunque richiesta una sicurezza a livello "militare". ;)

Se avessi bisogno di maggiore sicurezza, come sai, avrei aggiunto il chip di cui abbiamo più volte parlato ed avrei risolto :)

Guglielmo

P.S. : Tranquillo che sono comunque conscio delle problematiche che ci sono dietro ... ho scritto il mio primo algortmo DES su ... un Apple IIe (con la scheda USCD Pascal a bordo) ... un "tot" di tempo fa ... come puoi immaginare XD XD XD
Title: Re: Nuova libreria pRNG
Post by: leo72 on May 11, 2013, 02:28 pm
@etemenanki:
la soluzione con HW esterno è sempre la migliore, soprattutto usando dei generatori di entropia difficilmente influenzabili, e lo zener è uno di questi insieme ai termistori.
Spiegami però perché usare l'NTC, c'è qualche motivo rispetto al PTC?

Tornando al sensore integrato, molte MCU ce l'hanno, l'Atmega328 ce l'ha. Con le vecchie versioni dell'IDE era possibile leggerlo direttamente dal codice di Arduino selezionando il pin 8, con le versioni più recenti questo non è più possibile perché il core mi pare che filtri gli indirizzi che vanno oltre ai pin fisici del micro quindi bisogna lavorare a mano.

@guglielmo:
Tempo fa ho fatto dei test ed avevo anche scritto una piccola libreria (simplePRNG) prima di abbandonare la strada del sensore interno. Essa all'avvio leggeva 4 pin analogici ed il sensore interno ed usava l'entropia estratta come seme per un generatore di numeri casuali derivato da un vecchio algoritmo di 20 anni fa che avevo trovato in rete e che si basava esclusivamente sull'uso di numeri interi. I valori che dava non erano male.
Si potrebbe magari combinare il setup delle 2 lib, ossia unire la lettura delle discrepanze fra gli oscillatori interni alla lettura del sensore di temperatura e di alcuni pin analogici per avere ancor più casualità.
Title: Re: Nuova libreria pRNG
Post by: gpb01 on May 11, 2013, 02:47 pm

...
@guglielmo:
Tempo fa ho fatto dei test ed avevo anche scritto una piccola libreria (simplePRNG) prima di abbandonare la strada del sensore interno. Essa all'avvio leggeva 4 pin analogici ed il sensore interno ed usava l'entropia estratta come seme per un generatore di numeri casuali derivato da un vecchio algoritmo di 20 anni fa che avevo trovato in rete e che si basava esclusivamente sull'uso di numeri interi. I valori che dava non erano male.
Si potrebbe magari combinare il setup delle 2 lib, ossia unire la lettura delle discrepanze fra gli oscillatori interni alla lettura del sensore di temperatura e di alcuni pin analogici per avere ancor più casualità.


Se è per divertirci si può fare ;) ... ma per le esigenze reali credo che quanto hai già fatto sia più che sufficiente ;)

Del resto, se uno ha proprio delle esigenze particolari ... c'è sempre quel piccolo chip che costa una miseria XD

Guglielmo
Title: Re: Nuova libreria pRNG
Post by: leo72 on May 11, 2013, 02:51 pm
Quel chip non lo voglio usare. Per principio  :smiley-yell:
Title: Re: Nuova libreria pRNG
Post by: Etemenanki on May 11, 2013, 02:56 pm
>leo: no, nessuna ragione particolare per usare ntc al posto di ptc, parlavo di usare un ptc ed un'ntc su due diversi canali cosi da avere sempre valori differenti e non prevedibili, dato che se con 2 ntc (o ptc) c'e' il rischio, per quanto remoto, di beccarne 2 dello stesso lotto di produzione e con la stessa tolleranza, usando due componenti con comportamenti opposti si elimina anche quel minimo rischio, massimizzando la casualita' ... in quanto allo zener, preferisco il transistor polarizzato inversamente, perche' gli zener in genere sono progettati per rendere il minor rumore possibile, mentre i transistor generici no ... da vecchie prove che avevo fatto (secoli fa), con lo stesso circuito, un comunissimo BC237 con la base a massa e l'emettitore polarizzato positivo mi dava quasi il triplo di banda di rumore di uno zener ...

EDIT: allora se ci mettiamo pure una fotoresistenza e' anche meglio, altra sorgente di livello casuale ... se andiamo avanti cosi, ce lo frega la cia  ]:D
Title: Re: Nuova libreria pRNG
Post by: leo72 on May 11, 2013, 03:06 pm

un comunissimo BC237 con la base a massa e l'emettitore polarizzato positivo mi dava quasi il triplo di banda di rumore di uno zener ...

EDIT: allora se ci mettiamo pure una fotoresistenza e' anche meglio, altra sorgente di livello casuale ... se andiamo avanti cosi, ce lo frega la cia  ]:D

Alla fine viene fuori un superchip crittografico  ;)

Comunque un grosso limite è la bassa risoluzione dell'ADC: 10 bit sono veramente pochi per avere elevati valori di entropia nell'immediato periodo.
Title: Re: Nuova libreria pRNG
Post by: testato on May 11, 2013, 04:08 pm
Mi chiedervo ma come funziona, giusto in due parole, l altro lato del discorso crittografico, cioe la decrittazione ?
Cioe se io metto due arduini in comunivazione, fa un lato spedisco un testo segreto, cripyato in basealla pRGN, dall altra parte ricevo il dato criptato ma non posso ricreaemi io la chiave, e nemmeno posso spedirmi la chiave in chiaro altrimenti intercettando testo e chiave sono fregato ?
Se cripto anvhe la chiave sono punto e a capo
Title: Re: Nuova libreria pRNG
Post by: Etemenanki on May 11, 2013, 04:22 pm
Be, no, dovresti usare un'algoritmo crittografico a doppia chiave ... una e' pubblica, e viene liberamente distribuita e serve SOLO per crittare, mentre l'altra la conosci solo tu e ti serve per decrittare ... il sistema e' asimmetrico, quindi la chiave che e' stata usata per crittare non potra' mai essere usata per decrittare.
Title: Re: Nuova libreria pRNG
Post by: gpb01 on May 11, 2013, 04:57 pm

Mi chiedervo ma come funziona, giusto in due parole, l altro lato del discorso crittografico, cioe la decrittazione ?
.................


Un'introduzione ai vari metodi di criptografia abbastanza ben fatta e scritta in modo chiaro ... http://techblog.rosedu.org/from-0-to-cryptography.html (http://techblog.rosedu.org/from-0-to-cryptography.html) ... dagli una letta ;)

Guglielmo
Title: Re: Nuova libreria pRNG
Post by: testato on May 11, 2013, 07:03 pm
Thanks
Title: Re: Nuova libreria pRNG
Post by: leo72 on May 12, 2013, 08:01 am
Nella crittografia a chiave pubblica esistono 2 chiavi.
Colui che vuole iniziare una comunicazione cifrata genera una coppia di chiavi, una segreta che non deve distribuire a nessuno ed una pubblica che può distribuire liberamente.
Questa chiave pubblica può essere usata da tutti coloro che intendono spedire un messaggio cifrato al distributore della stessa.
Questo cifrerà il messaggio con la chiave pubblica e poi lo spedirà in rete. Solo colui che possiede la chiave privata potrà riaprire quel messaggio.

Esistono 2 problemi con la chiave pubblica:
1) devi usare chiavi molto molto più grosse di quelle private (in numero di bit) per avere la stessa sicurezza
2) non hai nessuna identità su chi ti ha spedito il messaggio

Per capire il punto 1, considera che una chiave privata a 128 bit è il minimo per garantire una sicurezza dei dati per almeno 20/30 anni (considerando un attacco a forza bruta). Per avere la stessa sicurezza con una chiave pubblica bisogna salire almeno a 2048 bit (meglio 4096). Capirai che con una piccola MCU che ha solo 2 kB di RAM e lavora con interi a 32 bit la cosa diventi molto complessa.

Per risolvere il punto 2 si deve ricorrere ad un sistema di autenticazione del messaggio.

Vi rimando a questa pagina:
https://it.wikipedia.org/wiki/Differenza_fra_cifratura_simmetrica_e_asimmetrica

Ci sono spiegate un pò di differenze fra i 2 sistemi.

Secondo me, quando possibile, è meglio usare un algoritmo a chiave privata: a parità di lunghezza della chiave (in bit) è di diversi ordini di grandezza più robusto ed è di più facile implementazione sulle piccole MCU ad 8 bit. Difatti sistemi tipo l'AES non sono un problema per l'Arduino.
Title: Re: Nuova libreria pRNG
Post by: Etemenanki on May 12, 2013, 06:47 pm
Ci sarebbe un secondo modo per autenticare il mittente del messaggio, oltre a quello di dare solo a lui la chiave pubblica menzionato in quell'articolo, ma e' un po piu macchinoso ... in compenso sfrutta la reversibilita' di alcuni algoritmi a chiave asimmetrica.

Questi sono bidirezionali, cioe', se io tu cripti un messaggio per me con la mia chiave pubblica, solo io posso decriptarlo con la mia chiave privata, ma allo stesso tempo, se io cripto un messaggio con la mia chiave privata, tu (o chiunque la possieda) lo puoi decriptare con la mia chiave pubblica, e viceversa ... e questo NON rivela le chiavi private in alcun modo ...

Questo, se ognuno di noi ha la chiave pubblica dell'altro, consente di effettuare una doppia cifratura di sicurezza, in questo modo: prima tu cripti il messaggio con la tua chiave privata, poi lo cripti di nuovo con la mia chiave pubblica ... quando io lo ricevo, lo decripto prima con la mia chiave privata, e poi di nuovo con la tua chiave pubblica ... solo se sei stato tu, che sei l'unico ad avere la tua chiave privata, ad inviarlo, mi ritrovo con un messaggio decriptato, altrimenti rimane illeggibile.