Modulo senza fili? quale scelgo...

Salve raga... devo realizzare una semplice comunicazione seriale senza fili tra un master e uni slave... Le prerogative della comunicazione sono le seguenti:

  1. devo coprire un raggio di 15m (no muri, no ostacoli occludenti)
  2. la comunicazione deve essere "sicura" nel senso che, vedendo ad esempio gli hc-12 mi sembra che non hanno nemmeno pairing è quindi da escludere
  3. meglio se la connessione sia cifrata (non indispensabile)...

avendo a disposizione 2 hc-05 ho visto che bastano pochi metri e l'assenza di ostacoli per far si che la connessione va a farsi benedire...

Suggerimenti?
Grazie!

ti dico come farei io
gli HC 12 hanno certamente caratteristiche radio sufficenti, per lo scopo, anzi sovrabbondanti, ne uso e mi trovo bene
ma mancano di sicurezza, qui c'è da fare un distinguo
sicurezza=affidabilità dei dati
sicurezza=riservatezza dei dati
nel primo caso gli HC12 sono soddisfacenti
è la seconda: la riservatezza che difetta, sia nel senso che altri non devono poter INTERCETTARE e capire cosa sto facendo sia nel nel senso che altri non devono SOSTITUIRSI a me dando comandi malevoli
a mio parere comunque queste cose NON sono da affidare al canale di comunicazione, ma ad un layer intermedio, tra l'applicazione e il canale
in buona sostanza non devi usare un canale cifrato, devi trasmettere informazioni cifrate da te su un canale aperto, così per soprammercato NON ti affidi a soluzioni "chiuse" ma sei tu che decidi come cifrare
quanto importnti sono le informazioni che trasmetti
da 0 Comando delle tapparelle
a 10 Password del conto in banca
a 100 sblocco del caveau della banca
a 1000 codici di lancio dei missili nucleari puntati su....
ecco, per ognuno di questi livelli esiste un corrispondente livello di cifratura che garantisce tutte e due le sicurezze delle quali parlavo prima, su canale aperto, hai mai visto il film "a prova di errore"?

Grazie per la tua giustissima osservazione.
Cerco di spiegare meglio le mie perplessità:
hc-12 = ottime per portata segnale ma sicurezza 0 (vari video sul tubo dimostrano come con Arduino è facile riprodurre una determinata sequenza binaria sui 433 dopo averla "registrata")
hc-05 = utilizzano un codice di pairing ma la portata è troppo limitata per lo scopo (almeno dai miei test)
esp8622 based = potrebbe essere una soluzione sia per portata che per "sicurezza" anche se sulla normale Wi-Fi c'è da pensare ai deauth-attack che nel mio caso lascia il tempo che trova poiché in caso di NON comunicazione tra i due apparati non accadrebbe un bel niente...

Ultimo, ma non per importanza, la possibilità di creare un pcb standalone del tutto (atmega, radio wireless, ecc)
Questo potrebbe essere un giusto compromesso tra portata e sicurezza ma mi mancano informazioni circa:
è possibile creare un AP con un modulo del genere in modo da poter accettare client ed in caso é possibile inviare semplicemente dati tra i due al solo scopo di instaurare una comunicazione "simil transparent"?

miky_police:
vari video sul tubo dimostrano come con Arduino è facile riprodurre una determinata sequenza binaria sui 433 dopo averla "registrata"

Se puoi usare il WiFi tanto meglio, ma richiede un'infrastruttura (l'access point) sempre attiva e (ipotizzo, non l'ho mai usato) uno scambio messaggi socket based.

Il Bluetooth è molto limitato come portata (d'altra parte è pensato per dispositivi indossabili a bassissima potenza).

Altre forme di trasmissione senza fili non hanno virtualmente limiti, tranne quelli normativi (frequenza, tipo di modulazione, potenza massima e rapporto tempo trasmissione/pausa non superiore a un tot percentuale, non ricordo se un 10% o meno ancora).

Un minimo di sicurezza si può introdure scambiando stringhe random cifrate con un pool di chiavi conosciute solo alle stazioni autorizzate. Qualcosa del genere complicabile a volontà: digilander.libero.it/francodpx/filetesto/TEX_chiave.HTM Se anche qualcuno registra non può sapere se quello che passa è un comando cifrato reale, se è una stringa random di handshake, e quale chiave si sta usando in quello specifico momento, in sostanza lo stesso comando da una trasmissione all'altra è diverso e accettato solo se l'handshake (pseudo)random è andato a buon fine. E si può sempre introdurre un blocco progressivo ogni N tentativi errati come ogni cassaforte/apertura di sicurezza che si rispetti :wink:

Se puoi usare il WiFi tanto meglio, ma richiede un’infrastruttura (l’access point) sempre attiva e (ipotizzo, non l’ho mai usato) uno scambio messaggi socket based.

ecco. è proprio questo il punto…
si può impostare il predetto modulo (esp8266) come access point? quindi possiede le caratteristiche di routing a livello dhcp/assegnazioni ip?
e ammesso che sia così posso inviare ciò che voglio su tale comunicazione?(della serie voglio creare una “comunicazione seriale” su tcp/ip)

Ho pensato un po'
rimanendo su cose semplici, da fare capire e spiegare, si potrebbe fare così:
parte radio: in chiaro, con moduli HC12, la cifratura la facciamo noi
cifratura, prima ipotesi
la teoria dice che una chiave sufficentemente lunga e usata una volta sola rende virtualmente indecrittabile il messaggio senza usare metodi a forza bruta
ho pensato che una semplice cifratura con uno xor bit a bit, primo carattere del messaggio xor col primo della chiave, secondo col secondo e via così risulta quindi inviolabile, se cambiamo la chiave tutte le volte
OK, ci pensiamo dopo, per ora il problema è che ci sono casi per cui la cifratura del carattere darebbe come risultato \0, che non vogliamo perchè ci troncherebbe la stringa (intesa come stringa di C terminata da \0)
ok, la funzione di cifratura carattere per carattere EVITA questo caso, brutalmente

char codex(char a, char b)
{
    // applica una semplice codifica xor al byte in ingresso
    // per evitare che diventi \0 (terminatore di stringa)
    // NON applica la codifica se a==b
    // passo per una funzione apposita solo per prevedere eventuali agggiunte
    if (a == b)
    {
        return a;
    }
    else
    {
        return a ^ b;
    }
}

queso permette di cifrare un carattere per volta
cifrare un intera stringa potrebbe essere

void cifra(char stringa[], const char chiave[], byte index)
{
    // cifra una stringa (intesa come array di char terminato da \0
    int indice = 0;

    while (stringa[indice])
    {
        // fino alla fine della stringa
        byte  partizione = index + indice;
        stringa[indice] = codex(stringa[indice++], chiave[partizione]);
    }
}

ignoriamo per il momento index e partizione, servono dopo
questa funzione cifra una stringa su se stessa usando una chiave lunga almeno la lunghezza della stringa, soddisfacendo la teoria
la cifratura è simmetrica, per de-cifrare basta che in ricezione si ripeta l'operazione con la giusta chiave

il problema è cambiare la chiave tutte le volte, sulle due macchine
OK, si risolve, si usa una chiave lunga 255 caratteri (e se il messsaggio fosse più lungo NON userei arduino)
e si comincia tutte le volte a leggerla da un differente punto di ingresso
ecco quindi index inteso come punto di ingresso della chiave e partizione inteso come il punto fin dove siamo arrivati nell'uso della chiave, cast(r)are a byte permette di "andare a capo" e ripartire dall'inizio della chiave se si sborda come lunghezza

adesso serve solo scambiarsi tra trasmettitore e ricevitore (in letteratura solitamente indicati come Alice e Bob, con Charlie che fa il man in the middle)
dicevo che Alice e Bob devono solo scambiarsi l'indice, che cambia tutte le volte
OK, basta che Alice trasmetta una stringa conosciuta, e Bob tenti la decifratura con i primi N indici successivi all'ultimo usato, se la decodifica va a buon fine sappiamo quale indice ha usato Alice e possiamo usarlo per decifrare il messaggio principale
ecco, quindi come procedere:
Alice guarda l'ultimo indice usato, passa all'indice successivo e lo usa per cifrare la password, trasmette la password, aspetta il tempo che Bob faccia il lavoro e trasmette con la stessa cifratura il messaggio
Bob riceve la password cifrata e ripete per ogni indice, dall'ultimo che ha usato fino al ennesimo successivo, la decifrazione, se va a buon fine aggiorna l'ultimo indice usato e decifra il messaggio, che nel frattempo Alice sta per trasmettergli, se non va a buon fine non decifra nulla e morta li
Punti deboli: due

  1. messa così la cosa sembra che la chiave venga usata per tronconi successivi e sovrapponentisi, che NO buono NO
    2)se Charlie viene a conoscenza della password in chiaro la puo' usare per ricostruire la chiave, o almeno il pezzo locale appena usato, che potrebbe usare per ri-costruire a blocchi l'intera chiave
    risolviamo prima questo: basta che invece di una sola password ve ne siano alcune, che verranno usate in ordine sparso e casuale, mai la stessa due volte consecutive, questo riduce drasticamente la possibilità che Charlie possa ricostruire prima la password e poi da questa la chiave
    invece per il primo problema, è un non problema: io non ho mai detto che l'indice si deve incrementare di uno per ogni utilizzo
    basta che dato un indice sia possibile conoscerne il successivo, che non sia banalmente quello ottenuto fecendo +1
    magari facendo +101 e cast(r)ando a byte si ottiene che la sequenza degli indici usati NON sia consecutiva e non capiti mai che due messaggio consecutivi abbiano due chiavi locali uguali per tutto salvo il carattere di inizio
    quindi una funzione byte successivo(byte i) restituirebbe l'indice da usare immeditamente dopo i, pur se quseto NON è banalmente i+1
    credo di aver descritto l'intera procedura di cifratura/de-cifratura con una sicurezza accettabile per le applicazioni di classe "arduino"
    di quelle classe "B52" non parlo, per clausole contrattuali

oh, sia chiaro, io sono un dilettante e potrei aver preso una mega cantonata.....

io sono sempre più convinto che sei troppo fuori :smiley:

bello mi piace e me lo segno :wink:

Grazie, sempre bei complimenti....
comunque il segreto che applico è semplice, ed alla modica cifra di un sorriso, che hai già pagato, te lo dico:
per risolvere i problemi la prima cosa da fare è definirli, poi documentarsi (non sul tubo, ma su fonti autorevoli, io uso "Le Scienze") e poi ragionarci sopra
che è esattamente la mia prima firma, che un giorno rimetterò (le voglio usare a rotazione)
A parità di risultato maggiore il pensiero minore il lavoro
quindi: prima di fare, PENSA

e comunque, non ti crederai che sulla "mia" copia della pinremoti io non abbia già previsto questo, vero?
mi sono limitato ad anticipare il prossimo topic, che sarebbe stato, "come ti sfumo il byte"
mi sa che vi siete persi una puntata gustosa
Vorrei fosse comunque chiaro che quando parlo "per sentito dire" o "per ipotesi" lo dico sempre, se non trovi questa indicazione è perchè parlo "per esperienza" (ecco perchè chi poi dice che le cose non vanno mi fa un po' adirare, perchè non è nemmeno capace di copiare ma critica)

Standardoil:
Ho pensato un po'
rimanendo su cose semplici, da fare capire e spiegare, si potrebbe fare così:
parte radio: in chiaro, con moduli HC12, la cifratura la facciamo noi
cifratura, prima ipotesi
la teoria dice che una chiave sufficentemente lunga e usata una volta sola rende virtualmente indecrittabile il messaggio senza usare metodi a forza bruta
ho pensato che una semplice cifratura con uno xor bit a bit, primo carattere del messaggio xor col primo della chiave, secondo col secondo e via così risulta quindi inviolabile, se cambiamo la chiave tutte le volte
OK, ci pensiamo dopo, per ora il problema è che ci sono casi per cui la cifratura del carattere darebbe come risultato \0, che non vogliamo perchè ci troncherebbe la stringa (intesa come stringa di C terminata da \0)
ok, la funzione di cifratura carattere per carattere EVITA questo caso, brutalmente

char codex(char a, char b)

{
    // applica una semplice codifica xor al byte in ingresso
    // per evitare che diventi \0 (terminatore di stringa)
    // NON applica la codifica se a==b
    // passo per una funzione apposita solo per prevedere eventuali agggiunte
    if (a == b)
    {
        return a;
    }
    else
    {
        return a ^ b;
    }
}



queso permette di cifrare un carattere per volta
cifrare un intera stringa potrebbe essere


void cifra(char stringa, const char chiave, byte index)
{
    // cifra una stringa (intesa come array di char terminato da \0
    int indice = 0;

while (stringa[indice])
    {
        // fino alla fine della stringa
        byte  partizione = index + indice;
        stringa[indice] = codex(stringa[indice++], chiave[partizione]);
    }
}



ignoriamo per il momento index e partizione, servono dopo
questa funzione cifra una stringa su se stessa usando una chiave lunga almeno la lunghezza della stringa, soddisfacendo la teoria
la cifratura è simmetrica, per de-cifrare basta che in ricezione si ripeta l'operazione con la giusta chiave

il problema è cambiare la chiave tutte le volte, sulle due macchine
OK, si risolve, si usa una chiave lunga 255 caratteri (e se il messsaggio fosse più lungo NON userei arduino)
e si comincia tutte le volte a leggerla da un differente punto di ingresso
ecco quindi index inteso come punto di ingresso della chiave e partizione inteso come il punto fin dove siamo arrivati nell'uso della chiave, cast(r)are a byte permette di "andare a capo" e ripartire dall'inizio della chiave se si sborda come lunghezza

adesso serve solo scambiarsi tra trasmettitore e ricevitore (in letteratura solitamente indicati come Alice e Bob, con Charlie che fa il man in the middle)
dicevo che Alice e Bob devono solo scambiarsi l'indice, che cambia tutte le volte
OK, basta che Alice trasmetta una stringa conosciuta, e Bob tenti la decifratura con i primi N indici successivi all'ultimo usato, se la decodifica va a buon fine sappiamo quale indice ha usato Alice e possiamo usarlo per decifrare il messaggio principale
ecco, quindi come procedere:
Alice guarda l'ultimo indice usato, passa all'indice successivo e lo usa per cifrare la password, trasmette la password, aspetta il tempo che Bob faccia il lavoro e trasmette con la stessa cifratura il messaggio
Bob riceve la password cifrata e ripete per ogni indice, dall'ultimo che ha usato fino al ennesimo successivo, la decifrazione, se va a buon fine aggiorna l'ultimo indice usato e decifra il messaggio, che nel frattempo Alice sta per trasmettergli, se non va a buon fine non decifra nulla e morta li
Punti deboli: due
1) messa così la cosa sembra che la chiave venga usata per tronconi successivi e sovrapponentisi, che NO buono NO
2)se Charlie viene a conoscenza della password in chiaro la puo' usare per ricostruire la chiave, o almeno il pezzo locale appena usato, che potrebbe usare per ri-costruire a blocchi l'intera chiave
risolviamo prima questo: basta che invece di una sola password ve ne siano alcune, che verranno usate in ordine sparso e casuale, mai la stessa due volte consecutive, questo riduce drasticamente la possibilità che Charlie possa ricostruire prima la password e poi da questa la chiave
invece per il primo problema, è un non problema: io non ho mai detto che l'indice si deve incrementare di uno per ogni utilizzo
basta che dato un indice sia possibile conoscerne il successivo, che non sia banalmente quello ottenuto fecendo +1
magari facendo +101 e cast(r)ando a byte si ottiene che la sequenza degli indici usati NON sia consecutiva e non capiti mai che due messaggio consecutivi abbiano due chiavi locali uguali per tutto salvo il carattere di inizio
quindi una funzione byte successivo(byte i) restituirebbe l'indice da usare immeditamente dopo i, pur se quseto NON è banalmente i+1
credo di aver descritto l'intera procedura di cifratura/de-cifratura con una sicurezza accettabile per le applicazioni di classe "arduino"
di quelle classe "B52" non parlo, per clausole contrattuali

si potrebbe anche buttare giù un isteresi per avere una semplice password da utilizzare al primo scambio e tutte le successive calcolate sulla base di parametri non trasmessi, o anche trasmessi...
si, modi di creare cifrature non mancano... sicuramente

Standardoil:
Grazie, sempre bei complimenti....
...omissis

-OT-
solo per chiarire.... non vorrei che la prendessi a male, era realmente un complimento e mi sembra di avertelo gia detto :slight_smile: nel senso di geniaccio sregolato...un po sul tipo di "doc" del ritorno al futuro per intenderci :slight_smile:

-fine OT-

Tutt'altro che prenderla male. E' graditissimo

Avevo capito cosa intendevi, grazie di cuore, ancora

ho visto gli hc-05 con un semplice boost realizzato con un filo di rame lungo esattamente 12cm ma voglio evitare di modificare i singoli componenti per raggiungere il risultato.
Altre opzioni?

miky_police:
ho visto gli hc-05 con un semplice boost ......
Altre opzioni?

SI, usa moduli BT di classe 1 invece che fare modifiche dal dubbio risultato !

Costano sicuramente di più, ma sono oggetti progettati e realizzati per raggiungere almeno i 100mt. QUESTO è un esempio, ma Sparkfun (ed i suoi rivenditori) ne hanno anche altri modelli.

Guglielmo

gpb01:
SI, usa moduli BT di classe 1 invece che fare modifiche dal dubbio risultato !

Costano sicuramente di più, ma sono oggetti progettati e realizzati per raggiungere almeno i 100mt. QUESTO è un esempio, ma Sparkfun (ed i suoi rivenditori) ne hanno anche altri modelli.

Guglielmo

Ecco, sapevo che avresti consigliato qualcosa di interessante, mi chiedevo solo quando lo avresti fatto ;D
Come quella volta che per pilotare un motoriduttore da 10A mi hai risolto il problema in 10 minuti. VNH2SP30, che tra l'altro sta arrivando dagli ispanici :smiley:
Adesso ti metto in difficoltà? ::slight_smile:
Se vorrei rimanere nel budget dei 10 dollari per terminale?

miky_police:
Se vorrei rimanere nel budget dei 10 dollari per terminale?

Cerchi gli stessi moduli BT su … AliExpress … prendendoti tutti i rischi del caso :smiley: :smiley: :smiley:

Guglielmo

:smiley: :smiley:

Patrick_M:
...un po sul tipo di "doc" del ritorno al futuro per intenderci :slight_smile:

però se devo essere paragonato a un dottore preferirei essere paragonato al "buon dottore" Asimov, se non ti spiace.
Lui si che aveva fantasia e raziocinio a volontà....

tratto da qui Un occhiolino al Buon Dottore

"Il Buon Dottore - come lo ricorda l'amico e collega Sprague de Camp - era rumoroso, estroverso, volubile, espansivo e impulsivo: non poteva fare a meno di mettersi in mostra, di architettare scherzi e raccontare barzellette. Chi lo incontrava di persona, specie durante le convention della SF americana, veniva letteralmente sopraffatto dalla sua prorompente personalità. Citando Poul Anderson, che lo conobbe proprio a uno di questi eventi: - Mi aspettavo un intellettuale mingherlino: mi trovai davanti un tizio col fisico di un giocatore di football che le sparava grosse, faceva il buffone e correva dietro a tutte le sottane della convention." :smiley:

Standardoil:
oh, sia chiaro, io sono un dilettante e potrei aver preso una mega cantonata

Il problema con i procedimenti amatoriali di criptaggio è proprio questo, non siamo del settore, non abbiamo l’esperienza di chi si occupa professionalmente di codici cifrati, e quindi è facilissimo che sfugga una cosa banale che a prima vista ci sembra a prova di bomba (si può dire bomba su un forum? :smiley: :smiley: :smiley: )

Lo XOR in particolare è talmente semplice che si presta fin troppo a giochetti di reversibilità, come lo swap senza variabile temporanea:

a = a ^ b;
b = a ^ b;
a = a ^ b;

Si crede che sia tutto bello al sicuro xorato la dentro, e basta xorare con qualcos’altro che torna tutto fuori in chiaro. Esempio:

  • Alice e Bob hanno un inconfessabile segreto in comune, la Kiave K (che non si trasmettono mai).
  • Quando Alice vuole parlare con Bob lo chiama in chiaro: “helo!”
  • Bob coscienzioso crea una stringa random B che xora con K e la trasmette ad Alice (il malefico Charlie vedrà ogni volta una stringa totalmente random “Vernam compliant”).
  • Alice la dexora con K riottenendo B.
  • Alice a sua volta crea un’altra stringa random, la xora con K e la manda a Bob (anche qui Charlie vede solo una stringa random da cui non può ricavare nulla).
  • Alice e Bob da questo momento si sentono al sicuro e parlano xorando tutti i messaggi sia con B che con A (E Charlie A e B non le può mai conoscere perché non ha K e non la può scoprire)
  • Ma Charlie si sfrega le mani, perché due pivelli così non li aveva mai incontrati. Infatti basta xorare tutti i messaggi successivi con la prima stringa random (xorata K) trasmessa da Bob, e con la seconda stringa random (xorata K) trasmessa da Alice, per leggere tutti i messaggi perfettamente in chiaro.
     helo
   ----------->
       B ⊕ K
   <-----------
       A ⊕ K
   ----------->
     A ⊕ B ⊕ M
   <-----------

(A ⊕ B ⊕ M) ⊕ (A ⊕ K) ⊕ (B ⊕ K) = M

Si può cercare di confondere le acque, ma il massimo a cui si arriva usando la sola matematica dello XOR, una chiave di partenza K fissa, e un numero sufficientemente elevato di campioni, è ottenere la protezione M⊕K, cioè un normale Vigenère.