Come creare un protocollo di comunicazione UART sicuro?


8

Mi chiedevo come creare un protocollo di comunicazione UART / USB sicuro. Ne ho bisogno per la comunicazione tra un microcontrollore e un PC. Ho ~ 10 comandi e ho pensato di usare 10 comandi di riconoscimento separati per ognuno di essi.

Lo scambio dovrebbe andare così:

  • Il PC invia il comando di sveglia tramite UART
  • µC riconosce che il PC è collegato e invia il suo comando al PC, ad es. 0x01
  • Il PC fa quello che gli è stato chiesto (alcune cose hardware) e risponde ~0x01quando ha finito (annullo il numero per creare una "distanza" maggiore tra i due numeri)
  • µC sa che ha inviato 0x01e si aspetta ~0x01dal PC. Se qualcosa di diverso da quello che ~0x01ritorna, l'µC saprà che qualcosa è andato storto e invierà una nuova richiesta o un messaggio di errore

Nel caso in cui µC invii 0x01, il PC capisce 0x02e rispedisce ~0x02, ma µC legge a ~0x01causa di un po 'di rumore sarebbe piuttosto male.

Quanto è sicuro in termini di trasmissione o come posso renderlo più sicuro?


1
Potresti voler rivedere la mia domanda correlata e le ottime risposte ad essa.
Eugene Sh.

1
Con "più sicuro" intendo che intendi meno incline agli errori di trasmissione, non aggiungere criptovalute ecc. Per resistere alle intercettazioni e cosa no. Anche solo questo è un campo piuttosto vasto: en.wikipedia.org/wiki/Error_detection_and_correction
Fizz

2
Potresti cercare il codice di Hamming . Richiederà fino a 16 comandi (4 bit) e li espanderà in modo sistematico a 7 bit (che possono essere trasmessi su una UART standard). È possibile scegliere di correggere qualsiasi errore a singolo bit o rilevare se due bit sono stati ricevuti male.
Neil_UK,

2
1) 7 bit + un bit di parità è unidirezionale ed è semplice. Non catturerà tutti i possibili errori ma ne catturerà molti. 2) Un metodo più efficace consiste nell'inviare due byte, prima con il comando effettivo e in secondo luogo con il 'non' del primo comando. 3) Ancora meglio è inviare un byte 'command coming', seguito dal comando, seguito dal complimento del comando, seguito da un 'end of command byte. I byte 'command coming' e 'end of command' dovrebbero essere selezionati per non sovrapporsi a nessuno dei byte di comando e complimento
user3629249

1
Se sono necessari solo 10 comandi, è possibile inserire due copie in ogni byte (per ridondanza), oltre ai bit di parità. O poiché hai uno spazio simbolico di 256 simboli e ne hai bisogno solo di 10, puoi semplicemente scegliere simboli al massimo diversi (tutti i simboli differiscono per più bit) o ​​scegliere solo simboli con numeri pari di uno e zeri. Non devi certo preoccuparti di errori a bit singolo.
mkeith,

Risposte:


1

Penso che dovresti definire comandi più lunghi tra cui probabilmente checksum o CRC e attendere un ACK / NACK o una condizione di errore.

Puoi prendere esempi da protocolli semplici come TFTP ( RFC 1350 )


1

Per una comunicazione sicura dovresti considerare tutti i possibili thread sulla tua linea di comunicazione. Pertanto è necessario definire se il sistema è accessibile dall'esterno (sistemi di terze parti, ad es. Wireless)

In generale devi pensare ai seguenti thread:

  • ripetizione
  • ommision
  • resequencing
  • manipolazione
  • ritardo
  • inserimento
  • corruzione

Le misure standard contro i thread sono:

  • Sequenza o timestamp
  • supervisione del tempo
  • codici sorgente e di destinazione univoci
  • risposta
  • identificazione precedente
  • una specie di checksum, codice hash ...
  • tecniche crittografiche alcune di queste che hai già implementato con il tuo semplice protocollo.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.