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.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $hwstack = 64
- $swstack = 32
- $framesize = 64
- $sim
- Config Submode = New
- Const Rolling = 3
- Dim N As Byte , I As Byte
- Dim Xkey(16) As Byte
- Xkey(1) = 16
- Xkey(2) = 15
- Xkey(3) = 14
- Xkey(4) = 13
- Xkey(5) = 12
- Xkey(6) = 22
- Xkey(7) = 22
- Xkey(8) = 44
- Xkey(9) = 55
- Xkey(10) = 0
- Xkey(11) = 9
- Xkey(12) = 8
- Xkey(13) = 7
- Xkey(14) = 6
- Xkey(15) = 5
- Xkey(16) = 4
- Dim Xmsg(16) As Byte
- Dim Mymsg As String * 12 At Xmsg(1) Overlay
- Sub Send_crypted(byval My_string As String * 12)
- Mymsg = My_string
- Xteaencode Xmsg(1) , Xkey(1) , 16
- For I = 1 To 16
- Print Hex(xmsg(i));
- Next
- Print " ";
- End Sub
- Sub Decrypt_msg()
- Xteadecode Xmsg(1) , Xkey(1) , 16
- Print Mymsg
- End Sub
- Print "Send crypted normally"
- For N = 1 To 5
- Call Send_crypted( "Send crypted")
- Call Decrypt_msg()
- Next
- '------------------[CRYPTED RANDOMLY]-----
- Print ""
- Print "Now send the same but crypted randomly"
- Dim Synchro_tx As Byte
- Dim Txarr(16) As Byte 'array
- Dim Txstr As String * 12 At Txarr(2) Overlay 'shifted +1
- Sub Send_crypted2(byval My_string As String * 12)
- Txstr = My_string
- Txarr(15) = Rnd(255) 'always random
- Synchro_tx = Synchro_tx + Rolling
- Txarr(16) = Synchro_tx
- Txarr(1) = Crc8(Txarr(1) , 16) 'first always random
- Xteaencode Txarr(1) , Xkey(1) , 16
- For I = 1 To 16
- Print Hex(txarr(i));
- Next
- Print " "; 'space in terminal
- End Sub
- Dim Synchro_rx As Byte
- Dim Rxarr(16) As Byte 'array
- Dim Rxstr As String * 12 At Rxarr(2) Overlay 'shifted +1
- 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
- For N = 1 To 5
- Call Send_crypted2( "Send crypted")
- For I = 1 To 16
- Rxarr(i) = Txarr(i) 'emulate that we receiving data in another device
- Next
- 'I = Memcopy(txarr(1) , Rxarr(1) , 16 , 3) 'same here
- Call Decrypt_msg2()
- Next
- End