Arduino - šifrování přenosu po Ethernetu

martin

Arduino - šifrování přenosu po Ethernetu
« kdy: 04. 10. 2014, 23:46:11 »
Ahoj,
potrebuju prenaset namerena data z Arduina na server pres Ethernet. Data mohou byt treba namerene teploty z teplomeru, id cipu z rfid ctecky, stav ad prevodniku atd.

Rad bych jejich prenos trochu zabezpecil. Nejde mi o nic neprustrelneho, spis se chci branit beznemu BFU s nainstalovanym Wiresharkem.

Koukal jsem, ze na Arduino je dostupnych celkem dost sifrovacich alogoritmu. Bohuzel ATmega328 neni vykonostne na takoveto operace stavena.
Zkousel jsem ze srandy AES a funguje. Jente pak uz jednocip chudak nemuze delat nic jineho.

Nasel jsem ve spojitosti s Arduinem sifry XTEA, XXTEA a RC4.
Prvni dve jsou blokove, RC4 proudova.
Napr. XTEA se na jednocipech opravdu pouziva.

Nejsem kryptolog takze to chapu takto: obecne je proudova sifra snadnejsi k hacknuti, ale je rychlejsi a mene narocna na zdroje.
K datum je nejlepsi vzdy pridat nejaka nahodna a tim ztizit utocnikovy praci.

Mate nejake zkusenosti s jednou z vyse uvedenych sifer na Arduinu? Shanim neco s nejmensim vyuzitim pameti a vykonu. Na rychlosti ani bezpecnosti zas tolik nezalezi, ale primarne potrebuju zdroje jednocipu na jine veci.
O sifrovani (a srovnani algoritmu) toho moc nevim, vzdy jsem jenom pouzival na PC jiz hotove knihovny.

Neradte mi prosim pouzit Rapberry Pi. Pouzivam ji taky an nektere veci, ale tentokrat je Arduino vhodnejsi.
« Poslední změna: 06. 10. 2014, 08:21:49 od Petr Krčmář »


Bla

Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #1 kdy: 05. 10. 2014, 00:06:21 »
Tak použij úplně jednoduchý bitový posun podle klíče.

Jako první vygeneruješ číslo: 3 a tohle číslo bitově posuneš podle klíče (o 4)
Měj klíč: 485214582214582458

A teď jdou hodnoty:
1. hodnotu posuneš o 3+8
2. hodnotu posuneš o 3+5
3. hodnotu posuneš o 3+2
4. hodnotu posuneš o 3+1
5. hodnotu posuneš o 3+4

Kdybych to chtěl udělat chytřejší, tak moje zařízení se zeptá serveru:
Dej mi šifrovací klíč: odpověď XXXXXX (posunuté o klíč serveru)
Dešifruju (provedu bitový posun podle klíče serveru) a získám 123456, což je číslo, které jsem dostat měl
Můj tajný klíč: 258412
Provedu bitový posun 1 o 2, 2 o 5, 3 o 8

A podle výsledného klíče provedu posun dat, která serveru posílám.

Dokud budeš posílat jen hodnoty, tak na to můžeš čučet tejden a jsi stejně v háji.
Kdo by se s tím rozkódováním drbal co?

Navíc to můžeš dál zlepšovat, třeba přidat sůl, což bude číslo, které nějak pravidelně modifikuje bitový posun.

Bla

Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #2 kdy: 05. 10. 2014, 00:16:17 »
Samozřejmě bitově posouváš číslo!
Číslo 4 tj: 0100 Bin posuneš >> 0010 a máš z toho 2
Pokud bys dělal posun nad binárně vyjádřenou hodnotou ASCI znaku, dostaneš se mimo úsek písmen/číslic a už se dá hádat
Víš jak to myslím.

martin

Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #3 kdy: 05. 10. 2014, 00:21:03 »
Pokud budu stale vylepsovat svuj algoritmus, stejne se nakonec  dostanu na slozitost nejake existujici sifry.
Sifrovani jako matematik nerozumim, proto nebudu vyvijet zadnou vlastni.
I tak diky za radu.

Jenda

Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #4 kdy: 05. 10. 2014, 01:19:12 »
Dokud budeš posílat jen hodnoty, tak na to můžeš čučet tejden a jsi stejně v háji.
A pak si všimnu, že ty hodnoty nejsou navzájem nezávislé a náhodné, přičemž po sobě se budou měnit v nejnižších bitech, a pak uvidím, že se změnily třeba takhle: ____XX__ a vidím, že tohle je bitová rotace (nikoli posun) o dva doleva. A těchto dvojic nasbírám víc a podívám se, jak se liší jejich posun v závislosti na prvním bajtu transakce, použiju tutéž metodu a voilá, cracknul jsem ti klíč.

Tvořit si vlastní „šifrovací“ algoritmy je cesta do pekel. Nikdo z nás nemá dostatek znalostí a nepostihne všechny možné důsledky na to, aby udělal alespoň trochu kvalitní šifru.


and


JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #6 kdy: 05. 10. 2014, 10:10:45 »
Nic ve zlem, ale neda mit to: Jakym zpusobem se vam utocnik s Wiresharkem prolama na Ethernet? Nebo se bojite, ze vase lepsi polovicka napichne kabel a pak bude cucet na nejaka binarni data, ze kterych by se mohla dozvedet teplotu v obyvaku? K cemu vam to zabezpeceni vlastne je?

Bla

Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #7 kdy: 05. 10. 2014, 19:08:39 »
Tvořit si vlastní „šifrovací“ algoritmy je cesta do pekel. Nikdo z nás nemá dostatek znalostí a nepostihne všechny možné důsledky na to, aby udělal alespoň trochu kvalitní šifru.

Co píšeš je jako obvykle blbost.
Pokud to nejsou citlivá data, ale chci je pouze zmást, pak je bitový posun jednoduchý, výpočetně nenáročný a snadno implementovatelný -> dostatečně dobrý.

Pokud se chceš bavit o šifrách, mohu ti poskytnout takové informace, že je stejně nebudeš mít šanci nikdy pochopit.
Mimo to plácáš hrozné, ale hrozné kraviny, rozdíl na nejnižších bajtu. Řekni mi, jak poznáš, jak se posunulo číslo 101101 a o kolik.
Škoda elektronů na odpověď pro tebe.

K cemu vam to zabezpeceni vlastne je?
Asi to má téct po internetu, ale pokud to nejsou zajímavá data, nikdo se nebude obtěžovat je dešifrovat.

Pokud budu stale vylepsovat svuj algoritmus, stejne se nakonec  dostanu na slozitost nejake existujici sifry.
Sifrovani jako matematik nerozumim, proto nebudu vyvijet zadnou vlastni.
I tak diky za radu.
Pokud chceš šifru, tak samozřejmě je nesmysl znovu nalézat kolo.
Pokud chceš pouze zmást data tak, aby se v nich nikdo nemohl rochnit, je bitový posun good enought a ten XOR tam přidat můžeš taky.

Bla

Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #8 kdy: 05. 10. 2014, 19:19:54 »
Mějme bitový posun 1001 >> 1100 tj. číslo 9 změníš na 12, jenže při každém odečtení hodnoty se posun mění.
Tady nejde o to, že by to bylo nehaxnutelné, ale nikomu se to nevyplatí lámat.

A o tom to je!
Šifra je dostatečně silná ve chvíli, kdy není nikdo, komu by se jí vyplatilo lámat!

Je šifra AES 256 bitů dostatečně silná?
To je ale hloupá otázka co?
Otázka má znít: Pro koho!

Pro zašifrování telefonních čísel milenek ti stačí výše uvedený bitový posun, pro zašifrování kódů pro řízení atomových střel je slabá.

martin

Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #9 kdy: 05. 10. 2014, 19:25:36 »
Nic ve zlem, ale neda mit to: Jakym zpusobem se vam utocnik s Wiresharkem prolama na Ethernet? Nebo se bojite, ze vase lepsi polovicka napichne kabel a pak bude cucet na nejaka binarni data, ze kterych by se mohla dozvedet teplotu v obyvaku? K cemu vam to zabezpeceni vlastne je?
Co treba RFID ctecka, ktera posila ID cipu pres internet a podle toho otevira dvere? Umim si predstavit zlodeje Wiresharkem. Ale to neres, kdyby nebylo SSL do banky, tak te taky ve vetsine pripadu nikdo nezneuzije.

K cemu vam to zabezpeceni vlastne je?
Asi to má téct po internetu, ale pokud to nejsou zajímavá data, nikdo se nebude obtěžovat je dešifrovat.
Presne tak, potece to pres internet + treba pres nejakou free nesifrovanou wifi, to neovlivnim

Tvořit si vlastní „šifrovací“ algoritmy je cesta do pekel. Nikdo z nás nemá dostatek znalostí a nepostihne všechny možné důsledky na to, aby udělal alespoň trochu kvalitní šifru.
Co píšeš je jako obvykle blbost.
Pokud to nejsou citlivá data, ale chci je pouze zmást, pak je bitový posun jednoduchý, výpočetně nenáročný a snadno implementovatelný -> dostatečně dobrý.
Pokud se chceš bavit o šifrách, mohu ti poskytnout takové informace, že je stejně nebudeš mít šanci nikdy pochopit.
Mimo to plácáš hrozné, ale hrozné kraviny, rozdíl na nejnižších bajtu. Řekni mi, jak poznáš, jak se posunulo číslo 101101 a o kolik.
Škoda elektronů na odpověď pro tebe.
Proc teda vsichni jedou na AES a nenapisou si vlastni sifru?

Je šifra AES 256 bitů dostatečně silná?
To je ale hloupá otázka co?
Otázka má znít: Pro koho!
Pro zašifrování telefonních čísel milenek ti stačí výše uvedený bitový posun, pro zašifrování kódů pro řízení atomových střel je slabá.
OK, pokud teroristi budou mit plan utoku jadernou bombou sifrovany AES256, jak ho budete lamat? Asi rucne trubkou po hlave...

Proste a jednoduse - valstni sifru implementovat nechci. EOL
Resim, jestli pouzit XTEA, XXTEA, nebo RC4. Rad bych, pokud tomu nekdo rozumi ziskal radu, ktera sifra je pro mne nejvhodnejsi.

Jenda

Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #10 kdy: 05. 10. 2014, 19:45:58 »
Pokud se chceš bavit o šifrách, mohu ti poskytnout takové informace, že je stejně nebudeš mít šanci nikdy pochopit.
Takové informace si umím najít taky a to je taky důvod, proč šifry nenavrhuju ;). A myslím, že existují informace o šifrách, které taky nikdy nepochopíš.

Mimo to plácáš hrozné, ale hrozné kraviny, rozdíl na nejnižších bajtu. Řekni mi, jak poznáš, jak se posunulo číslo 101101 a o kolik.
Psal jsem o dvou následujících hodnotách. Ale je možné, že jsem tvoji specifikaci nepochopil (např. jsem narazil na to, že zjevně posouváš desítková čísla, a neřešíš, co udělat s 7 posunutou o jedna doleva - z toho by bylo E).

Škoda elektronů na odpověď pro tebe.
Tak si nakašli ;). K zamyšlení: kdyby tvoje šifra byla bezpečná, proč se používá milionkrát složitější AES, Blowfish a spol.?

Pokud chceš pouze zmást data tak, aby se v nich nikdo nemohl rochnit, je bitový posun good enought a ten XOR tam přidat můžeš taky.
*nikdo dostatečně motivovaný

Bla

Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #11 kdy: 05. 10. 2014, 19:51:11 »
...
Proc teda vsichni jedou na AES a nenapisou si vlastni sifru?
...
OK, pokud teroristi budou mit plan utoku jadernou bombou sifrovany AES256, jak ho budete lamat? Asi rucne trubkou po hlave...
....
Proste a jednoduse - valstni sifru implementovat nechci. EOL
Resim, jestli pouzit XTEA, XXTEA, nebo RC4. Rad bych, pokud tomu nekdo rozumi ziskal radu, ktera sifra je pro mne nejvhodnejsi.

Ad bod 1)
AES se poměrně jednoduše implementuje, jsou na to hotové knihovny a je to fakt easy.

Ad bod 2)
Já od teroristů nic lámat nebudu, budou to dělat tajné služby s hardwarem, který nemá s tím tvým nic společného.
Nějaké vyšší mozkové funkce od tebe asi čekat nemůžu co? Třeba porozumění psanému textu....

Ad bod 3)
A zase jsme u toho, CO ŽE TO CHCEŠ ŠIFROVAT?

Ad bod 4)
U šifry jde o to, kdo to bude lámat a protože tě po posledním postu mám za pitomce, takže to asi nebude nic světoborného, proto je úplně jedno, jakou šifru použiješ. Použij tedy takovou, která existuje v nějaké knihovně pro tvůj čip a naimplementuješ jí dobře.
I silnáš šifra špatně implementovaná, například se špatně udělaným generátorem náhodných čísel, se stává slabou.

Jenda

Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #12 kdy: 05. 10. 2014, 19:53:32 »
Mějme bitový posun 1001 >> 1100 tj. číslo 9 změníš na 12, jenže při každém odečtení hodnoty se posun mění.
Máš jen 10 možných „inicializačních vektorů“ (nebo 256, pokud bys jel po bajtech, ne po číslech).

OK, pokud teroristi budou mit plan utoku jadernou bombou sifrovany AES256, jak ho budete lamat? Asi rucne trubkou po hlave...
Postranními kanály. Například pomocí 0day exploitů na jejich operační systém. Nebo pomocí HW backdooru v jejich počítači. Moderní šifry se lámou typicky jen pomocí postranních kanálů.

Resim, jestli pouzit XTEA, XXTEA, nebo RC4. Rad bych, pokud tomu nekdo rozumi ziskal radu, ktera sifra je pro mne nejvhodnejsi.
Myslím, že je to celkem jedno.

U blokové (*TEA) nezapomeň použít vhodný šifrovací mód a u proudové (RC4) si dej pozor na inicializační vektor. U RC4 taky nezapomeň discardnout začátek keystreamu. Suma sumárum, RC4 bych nedoporučil.

martin

Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #13 kdy: 05. 10. 2014, 20:09:42 »
Resim, jestli pouzit XTEA, XXTEA, nebo RC4. Rad bych, pokud tomu nekdo rozumi ziskal radu, ktera sifra je pro mne nejvhodnejsi.
Myslím, že je to celkem jedno.

U blokové (*TEA) nezapomeň použít vhodný šifrovací mód a u proudové (RC4) si dej pozor na inicializační vektor. U RC4 taky nezapomeň discardnout začátek keystreamu. Suma sumárum, RC4 bych nedoporučil.

Jaky mod u *TEA myslis? Kde ho maji?
Slo by u RC4 pouzit pro inicializaci cislo z AD prevodniku? Kde to resi oni? Jak to myslis se zacatkem keystreamu?

Data budou treba v tomto tvaru (jen na ukazku, proste to bude najaky JSON:
Kód: [Vybrat]
{
   "ID":123456789,
   "detected_rfid_chip":"id chipu",
   "temperature":[
      {
         "DS18B20_ID":"ID cidla 1",
         "temp":20.3
      },
      {
         "DS18B20_ID":"ID cidla 2",
         "temp":-12.34
      }
   ],
   "radnomForEncryption":{  /* to budou asi cisla z AD prevodniku, proste nejaka nahodna data */
      "rnd1":123456,
      "rnd2":253753,
      "rnd3":278722
   }
}
Planoval jsem do JSONu vzdy pridat nejaka nahodna data, aby se stizilo prolomeni sifry. Je to takhle dobry napad?

Jenda

Re:Arduino - sifrovani prenosu dat po Ethernetu
« Odpověď #14 kdy: 05. 10. 2014, 21:05:57 »
Jaky mod u *TEA myslis?
Obecně mód blokové šifry. Není to specifické pro (X)XTEA.

Kde ho maji?
Asi nikde, tohle šifruje po blocích. Ty je musíš chainovat. https://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Common_modes Na obrázku tučňáka je dobře vidět, proč není dobrý nápad šifrovat po jednotlivých blocích. Doporučil bych ti CBC, je snadno implementovatelné (XOR s předchozím blokem) a pro tvou aplikaci jeho chyby nevadí.

Slo by u RC4 pouzit pro inicializaci cislo z AD prevodniku?
Použil bych nějaký PRNG. IV nemusí být náhodný, jediné, co je potřeba, je, aby byl pokaždé jiný (a pokud možno něco trochu složitějšího než pouhá inkrementace).

Kde to resi oni?
Nikde. Ta rutina předpokládá, že jí dáš klíč už s IV.

Jak to myslis se zacatkem keystreamu?
První bajty RC4 keystreamu mají biasy a navíc z nich lze odvodit informace o klíči. Na tomto dojelo třeba WEP. Řeší se to tak, že na začátku to chvíli (50-1000 bajtů) točíš naprázdno a až pak šifruješ.

Planoval jsem do JSONu vzdy pridat nejaka nahodna data, aby se stizilo prolomeni sifry. Je to takhle dobry napad?
Přijde mi to zbytečné. Spíš si dej pozor, abys měl kvalitní IV nebo první blok u CBC.