Rolling code - przesyłaj dane bezpieczniej

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Rolling code - przesyłaj dane bezpieczniej

Post autor: niveasoft » 16 cze 2022, 20:45

Niektóre radiolinie mają wbudowane kodowanie transmisji, ale większość z nich nie.
W Bascomie można kodować dane za pomocą Xtea, ale zobacz, co się dzieje, gdy wysyłasz te same dane.
Zakodowany ciąg Hexstring zawsze wygląda tak samo.
Jeśli więc ktoś nagra twoją transmisję, to gdy zostanie ona odtworzona, urządzenie zareaguje tak samo.

Możemy to mocniej zakodować.
Xtea array musi być wielokrotnością liczby 8. Czyli 8, 16, 24, 32 itd.
Jest to najkrótszy przykład wysyłania DOKŁADNIE TEGO SAMEGO ciągu znaków z ZAWSZE innym kodowaniem.
Tablica 16 bajtów jest nakładana na nasz łańcuch, ale z przesunięciem o jeden bajt, więc pierwszy jest dla as.
Ponadto łańcuch jest krótszy i mamy dwa bajty na końcu tablicy.
Do 15`tego bajtu ładujemy jakąś losową wartość, a następnie obliczamy CRC z całej tablicy i umieszczamy ją w pierwszym bajcie. W ten sposób możemy sprawdzić integralność danych nawet po stronie odbiorcy.
Jeśli teraz zaszyfrujemy naszą tablicę za pomocą Xtea, to za każdym razem otrzymamy zaciemniony ciąg heksadecymalny.

Skończyliśmy tak? Nie do końca...

Nikt nie wie, jakie dane wysyłamy, ale jeśli te dane zostaną przechwycone i odtworzone, to będą one znowu ważne!

Dlatego właśnie umieściłem pewną wartość Synchro w 16`tym bajcie.
To Synchro jest zwiększane za każdym razem o wartość stałej Rolling = 3 i tylko nadajnik i odbiornik wiedzą jaka to jest wartość.
Oznacza to, że nagrana transmisja jest teraz BEZUŻYTECZNA.
Pojedyncze Synchro bez Random 15 może być niewystarczające, ponieważ po przepełnieniu bajtu pewnego dnia wiadomość będzie znowu ważna.

Możesz zbudować pilota, który nawet gdy nadajesz poza zasięgiem, to po drugim kliknięciu zostaniesz ponownie zsynchronizowany. Podobnie jak w przypadku pilota samochodowego.

Sprawdź jak można to zrobić. Można to wykorzystać nawet w niektórych transmisjach RS485.
  1. $regfile = "m328pdef.dat"
  2. $crystal = 16000000
  3. $hwstack = 64
  4. $swstack = 32
  5. $framesize = 64
  6. $sim
  7.  
  8. Config Submode = New
  9.  
  10. Const Rolling = 3
  11.  
  12.  Dim N As Byte , I As Byte
  13.  Dim Xkey(16) As Byte
  14.  
  15.   Xkey(1) = 16
  16.   Xkey(2) = 15
  17.   Xkey(3) = 14
  18.   Xkey(4) = 13
  19.   Xkey(5) = 12
  20.   Xkey(6) = 22
  21.   Xkey(7) = 22
  22.   Xkey(8) = 44
  23.   Xkey(9) = 55
  24.   Xkey(10) = 0
  25.   Xkey(11) = 9
  26.   Xkey(12) = 8
  27.   Xkey(13) = 7
  28.   Xkey(14) = 6
  29.   Xkey(15) = 5
  30.   Xkey(16) = 4
  31.  
  32.  
  33. Dim Xmsg(16) As Byte
  34. Dim Mymsg As String * 12 At Xmsg(1) Overlay
  35.  
  36. Sub Send_crypted(byval My_string As String * 12)
  37.  
  38.  Mymsg = My_string
  39.  
  40.  Xteaencode Xmsg(1) , Xkey(1) , 16
  41.  
  42.  For I = 1 To 16
  43.   Print Hex(xmsg(i));
  44.  Next
  45.   Print "  ";
  46. End Sub
  47.  
  48. Sub Decrypt_msg()
  49.  Xteadecode Xmsg(1) , Xkey(1) , 16
  50.  Print Mymsg
  51. End Sub
  52.  
  53. Print "Send crypted normally"
  54.  
  55. For N = 1 To 5
  56.  Call Send_crypted( "Send crypted")
  57.  Call Decrypt_msg()
  58. Next
  59.  
  60. '------------------[CRYPTED RANDOMLY]-----
  61. Print ""
  62. Print "Now send the same but crypted randomly"
  63.  
  64. Dim Synchro_tx As Byte
  65. Dim Txarr(16) As Byte                                       'array
  66. Dim Txstr As String * 12 At Txarr(2) Overlay               'shifted +1
  67.  
  68.  
  69. Sub Send_crypted2(byval My_string As String * 12)
  70.  
  71.  Txstr = My_string
  72.  Txarr(15) = Rnd(255)                                       'always random
  73.  Synchro_tx = Synchro_tx + Rolling
  74.  Txarr(16) = Synchro_tx
  75.  Txarr(1) = Crc8(Txarr(1) , 16)                           'first always random
  76.  
  77.  Xteaencode Txarr(1) , Xkey(1) , 16
  78.  
  79.  For I = 1 To 16
  80.   Print Hex(txarr(i));
  81.  Next
  82.   Print "  ";                                               'space in terminal
  83. End Sub
  84.  
  85. Dim Synchro_rx As Byte
  86. Dim Rxarr(16) As Byte                                       'array
  87. Dim Rxstr As String * 12 At Rxarr(2) Overlay               'shifted +1
  88.  
  89. Sub Decrypt_msg2()
  90.  Xteadecode Rxarr(1) , Xkey(1) , 16
  91.  Print Rxstr ;
  92.  Print "  " ;
  93.  If Rxarr(16) = Synchro_rx Then
  94.   Print "OK VALID"
  95.  Else
  96.   Print "NOT VALID! "                                       '; Synchro_rx ; " " ; Rxarr(16)
  97.  End If
  98.   Synchro_rx = Rxarr(16) + Rolling
  99. End Sub
  100.  
  101.  
  102. For N = 1 To 5
  103.  Call Send_crypted2( "Send crypted")
  104.  
  105.    For I = 1 To 16
  106.     Rxarr(i) = Txarr(i)                                     'emulate that we receiving data in another device
  107.    Next
  108.  
  109.   'I = Memcopy(txarr(1) , Rxarr(1) , 16 , 3)                'same here
  110.  
  111.  Call Decrypt_msg2()
  112. Next
  113.  
  114. End
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
vdl
Posty: 2
Rejestracja: 08 kwie 2020, 12:12

Re: Rolling code - przesyłaj dane bezpieczniej

Post autor: vdl » 24 cze 2022, 17:36

Pomysł ciekawy, ale wydaje mi się, że wymaga nieco dopracowania.
Zastanawia mnie aktualizacja wartości Synchro_rx:

Kod: Zaznacz cały

 Sub Decrypt_msg2()
 Xteadecode Rxarr(1) , Xkey(1) , 16
 Print Rxstr ;
 Print "  " ;
 If Rxarr(16) = Synchro_rx Then
  Print "OK VALID"
 Else
  Print "NOT VALID! "                                       '; Synchro_rx ; " " ; Rxarr(16)
 End If
  Synchro_rx = Rxarr(16) + Rolling
End Sub
O ile dobrze rozumiem, nowa wartość jest ustawiania po każdym odebranym komunikacie, niezależnie czy poprawnym, czy nie.
Do głowy przychodzą mi od razu dwa potencjalne ataki:
1) wysłanie dowolnych "śmieci" ustawi wartość Synchro_rx, więc kolejna transmisja od legalnego nadajnika może zostać odrzucona
2) atakujący może nagrać 2 kolejne komunikaty. Jeśli odtworzy je w tej samej kolejności to system drugi potraktuje jako poprawny.
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Rolling code - przesyłaj dane bezpieczniej

Post autor: niveasoft » 24 cze 2022, 22:04

Naprawdę nie oczekiwałem takiego zainteresowania i naprawdę mądrych ataków :D
Biję brawo. Kto by pomyślał :D
Oczywiście nie wiesz co wysłałeś. Bo właśnie o to w tym chodziło że każda transmisja inna.
vdl
Posty: 2
Rejestracja: 08 kwie 2020, 12:12

Re: Rolling code - przesyłaj dane bezpieczniej

Post autor: vdl » 25 cze 2022, 9:20

Wszystko co związane z szyfrowaniem i zabezpieczeniami jest interesujące :)
Dodanie wartości losowej do komunikatu oraz liczenie sumy kontrolnej to bardzo dobry pomysł.
Natomiast sposób obsługi Synchro_rx wydaje się wymagać nieco dopracowania. Moim zdaniem rozwiązanie wcale nie jest proste, ale może warto chociaż spróbować?
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Rolling code - przesyłaj dane bezpieczniej

Post autor: niveasoft » 25 cze 2022, 9:26

(nie)Myśle od wczoraj(weekend, koszenie trawy, potem grill) ahahahahahah :D
Dziękuję za udział w dyskusji bo to otwiera oczy :D
ODPOWIEDZ