Synka in klocka vid utbyte av låskoder tillför ingen formellt höjd säkerhet för en angripare som verkligen vill forcera ett lås.
Trådlöst lås, om man vill göra detta med någon form av säkerhet så hamnar man efter kort analys i tre slutsatser:
1. Även om protokollet som används blir känt så ska det inte försämra säkerheten (klockan går bort). Tvärs om kan det vara bra att ha denna öppenheten av koden då eventuella brister lättare upptäcks om det är många som kan analysera.
2. Avlyssning och analys av innehållet ska inte påverka säkerheten.
3. Man_in_the_middle ska inte påverka säkerheten.
Det finns många mer eller mindre komplicerade lösningar som försöker klara dessa tre villkor. Ofta kräver det tung kryptering och lösenords-utbyte i flera led.
För ett kombinerad billås och startnyckel finns en variant som inte ens kräver något kodat protokoll och är lätt att implementera på i stort sett valfri MCU.
Protokollet är väldigt enkelt, fast tveksamt om jag kan beskriva enkelheten, men gör ett försök:
Initiering av nyckel-koder
Nyckeln ansluts induktivt eller elektriskt till tändlåset, dels får man kommunikation och nyckelns batteri kan laddas. När lyckat uppstartskommando utförts skapar bilens nyckeldator 1000 slumpmässiga tal samt en ny nyckelidentitet. Vidare skapas ett antal slumpmässiga tal som motsvarar de funktioner nyckeln ska kunna utföra.
Denna samling slumptal lagras på en för nyckeln reserverad minnesbank i bilens låsdator och en kopia på slumptalen överförs till nyckelns minne.
Elektrisk eller induktiv anslutning försvårar avlyssning av denna kritiska del.
Slumpgenereringen kan använda tid som en del av ett frö för slumpgenereringen. Skapa ett bra frö och ha en bra pseudogenerator är viktigt.
Bilens nyckeldator kan ha flera minnesbanker för flera olika nyckel-identiteter och behörighetsnivåer.
Fjärrnyckel-funktion
Vid upplåsning av bil skickar nyckeln sin senast tilldelade nyckelidentitet samt begäran om önskad funktion, dvs slumptalet som motsvarar att t.ex. låsa upp en dörr.
Bilen svarar med att skicka ut tre slumpmässigt valda tal som är index till de senaste lagrade 1000 talen för denna nyckels minnesbank.
Nyckeln svara med dessa tre lagrade tal som indexen pekade ut.
Bilen kollar om det stämmer med numren i den egna minnesbanken och i så fall utför begärda funktionen.
Samtidigt markeras använda index som använda, så att de inte kan återkomma. Av 100 index, finns 997 kvar som är oförbrukade.
Till slut blir alla index förbrukade, när 333 nyckelfunktioner använts.
När nyckeln ansluts elektriskt eller induktivt för att starta bilen får nyckeln 1000 helt nya slump-tal (baserade på nytt frö) översända av bilens låsdator och tilldelas ett helt nytt identitet-värde alla index är åter tillgängliga.
Om någon försöker obehörigt avlyssning vid dörröppning och lyckas med full avkodning, ger återuppspelning eller andra trix inget än ett antal slumptal som aldrig kan återanvändas för låsöppning.
Om angripare försöker identifiera sej som nyckel ska denna gissa rätt på de tre slumptalen som utsända index pekar på, och som aldrig återkommer och som helt förnyas nästa gång då bilen startas med denna nyckel.
Chansen att lyckas med detta är som att kasta en kortlek genom en hö-fläkt och få korten att på andra sidan hamna i en sorterad hög.
Fördelen med denna program-sekvens är att den kan utföras även med små MCU-resurser i såväl nyckel som bil-dator, enkel programmering utan någon kryptering som t.ex. kan köras på en ESP8266 som enda chip för nyckeldelen. Nycklar kan enkelt göras ogiltiga vid förlust, nya nycklar kan enkelt läggas till.
Man kan ha flera nycklar och även nyckel som mobil-app med i princip samma programmering.
Det som jag inte tagit med här är att man måste ha en funktion för att göra en första nyckel-initiering. Kan ske så enkelt som att man omedelbart efter startad bil med giltig nyckel ansluter en nyckel med tomt minne, varpå bilens dator aktiverar även denna med ett nytt nyckel-id och 1000 nya slumptal.
Det förutsätter att vid nystartad bil kan den som sitter bakom ratten förmodas vara behörig att registrera nya nycklar, vilket är troligt eftersom denne annars inte kunnat starta bilen, bortsett från stulen nyckel.
Mer komplicerat så kan man köra någon form av inloggning via dator för att administrera nycklar.
Eftersom kommunikation med ESP8266 kan ske över t.ex. WPA2 så finns redan där ett visst skydd mot den som vill avlyssna kommunikationen.
Skulle en avlyssnare knäcka WPA2 så är allt denne får ut av klartexten ett antal slumptal som aldrig kommer återupprepas.
Skulle någon hitta nyckeln och lyckas läsa av minnesinnehållet är det inget värt om förlorad nyckel raderas i bildatorn.
Det krävs att minnesinnehållet förnyas genom start av bilen, vilket måste ske innan alla indexen är förbrukade för en nyckel.
Man kan utföra 333 nyckelfunktioner innan slumptalen är förbrukade sedan är nyckeln inte fungerande.
Det är lätt att variera programkoden för att passa egna behovet. För att slippa externt minne kan interna flash-minnet användas.
Storlek på talen och hur många slumptal som ska lagras kan varieras. Det kan vara fler eller färre än 1000 minnes-positioner.
Riktigt många minnespositioner så kan nyckeln betraktas som engångs-aktiverad. Vid normal användning räcker antalet index under förväntad nyckel-livslängd.
Samtidigt kan det vara bra med tillfällig nyckel som bara behöver ett fåtal lagrade tal som därmed bara kan låsa upp bilen en ett begränsat antal gånger, eller för en max giltighets-tid, som sätts i bilens låsdator.
Minnesbehovet kan påverkas genom att välja tal-storlek och indexerings-metod. Man kan t.ex. peka på nibbles och avläsa olika antal binära bitar i talen för de tre indexen och utföra någon matematisk funktion av det hela innan det återsänds till bilens låsdator. Så länge låsdatorn gör på samma sätt och får samma slutsumma så godkänns koden.
Ett problem är hur man ska lagra dessa tal om man inte vill använda externt flash-minne för att få enklast möjliga hårdvara.
För ESP8266 är minnes-storleken något i stil med 100 byte som kan användas som minnesbank. Detta minne kan slitas ut om man uppdaterar ofta (startar bilen ofta), men man kan välja att bara uppdatera när antalet lediga index närmar sej kritisk min-nivå och det är fortfarande god säkerhet mot avlyssning även med en kort minnesbank så länge ett slumptal inte återanvänds.
En lockande möjlighet att spara minne är att tillåta att ett index återanvänds men det sänker säkerheten rejält. Från att vara nära omöjligt kan den angripare som loggat alla tidigare sekvenser få en hypotetisk ingång om låsdatorn använder tre index som alla pekar på återanvända minnespositioner.
Alternativt lagrar man alla slumptal direkt vid programmeringen av nyckeln, för ESP2866 finns upp till 4MB tillgängliga för att lagra slumptal förutom programkoden.
Omräknat till mina behov så bör det räcka i ca 100 år.
Detta protokollet påminner rätt mycket om hur säkerheten är uppbyggd för bankdosor. De talen man matar in i en bankdosa är i princip index till en minnesbank. Samma inmatat tal ger alltid samma svar i dosan. En skillnad är att man i exemplet med billåset dessutom förnyar minnes-innehållet varje gång bilen startas.
Somliga bankdosor har delvis en förnyelse genom att använda kompletterande engångskoder på papper.
Bankdosan har ett skydd mot borttappad dosa, då den kräver en upplåsningskod för att man ska få tillgång till minnesbanken och felaktigt angiven upplåsningskod spärrar dosan efter ett antal försök.
Inget hindrar att man gör något liknande för en bilnyckel, men kodknappar eller biometriskt lås skulle göra nyckeln betydligt mer komplex både att designa och att använda.
Lättare med biometriskt lås i ratten. Vid fel kod utlöses
krockkudde under sätet efter 100 meters körning.