Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: martin 04. 10. 2014, 23:46:11

Název: Arduino - šifrování přenosu po Ethernetu
Přispěvatel: martin 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 (https://github.com/franksmicro/Arduino/tree/master/libraries/Xtea), XXTEA (https://github.com/alessandro1105/XXTEA-Arduino) a RC4 (https://github.com/shirokuade/RC4-Arduino/blob/master/RC4Encryption/RC4Encryption.pde).
Prvni dve jsou blokove, RC4 proudova.
Napr. XTEA se na jednocipech opravdu pouziva (http://pandatron.cz/?1083&implementace_sifry_xtea).

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.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: Bla 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.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: Bla 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.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: martin 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.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: Jenda 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.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: and 05. 10. 2014, 08:51:00
Za drevnich casu Z80 procesoru se sifrovalo klicem a XOR... http://en.wikipedia.org/wiki/XOR_cipher (http://en.wikipedia.org/wiki/XOR_cipher)

http://www.csl.mtu.edu/cs5461/www/Reading/Venugopalan03.pdf (http://www.csl.mtu.edu/cs5461/www/Reading/Venugopalan03.pdf)
http://www.efton.sk/crypt/sea.htm (http://www.efton.sk/crypt/sea.htm)
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: JardaP . 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?
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: Bla 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.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: Bla 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á.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: martin 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.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: Jenda 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ý
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: Bla 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.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: Jenda 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.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: martin 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 (https://github.com/alessandro1105/XXTEA-Arduino/blob/master/Arduino%20XXTEA/test_libreria_xxtea/test_libreria_xxtea.ino) ho maji?
Slo by u RC4 pouzit pro inicializaci cislo z AD prevodniku? Kde (https://github.com/shirokuade/RC4-Arduino/blob/master/RC4Encryption/RC4Encryption.pde) 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?
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: Jenda 05. 10. 2014, 21:05:57
Jaky mod u *TEA myslis?
Obecně mód blokové šifry. Není to specifické pro (X)XTEA.

Kde (https://github.com/alessandro1105/XXTEA-Arduino/blob/master/Arduino%20XXTEA/test_libreria_xxtea/test_libreria_xxtea.ino) 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 (https://github.com/shirokuade/RC4-Arduino/blob/master/RC4Encryption/RC4Encryption.pde) 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.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: Jenda 05. 10. 2014, 21:08:39
Ještě k té RC4: https://en.wikipedia.org/wiki/RC4#Biased_outputs_of_the_RC4

Co se týče použití CBC, dej si pozor, aby jsi na serveru neměl padding nebo decrypting oracle. Dobře je to popsáno v prvních kapitolách http://cryptopals.com/.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: JardaP . 05. 10. 2014, 21:27:15
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

No, rikal jste puvodne, ze to potece pres Ethernet. Internet neni Ethernet. Ethernet mate na lokalni siti, nicmene jestli to posilate treba z domova, tak Ethernet konci na domaci strane modemu. Na druhe strane to s nejvetsi pravdepodobnosti uz bude neco jineho.
Název: Re:Arduino - sifrovani prenosu dat po Ethernetu
Přispěvatel: martin 05. 10. 2014, 23:29:04
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).
Jak jsem mel nahodna cisla v JSONu, slo by to brat jako IV?
Pripadne to neresit JSONem, ale ziskat jedno cislo z AD. To imho nejsnazsi cesta k ziskani nahodne cisla na Arduino. Na pin se nic nepripoji a cte se hodnota.
Jak tomu predam 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š.
Kdyz na zacatku kus vyhodim, nebudou chybet data? Nebo mam z dat udelat neco jako "ABCdata.data.data", kde ABC blok 50 bajtu dlouhy?

Planuju desifrovat data z Arduina v Jave. Zatim pro testovani pouzivam:
Kód: [Vybrat]
public class RC4 {
public static void main(String[] args) throws Exception {
byte[] key = "tajneHeslo".getBytes("ASCII");
String clearText = "Moje tajna zprava.";

Cipher rc4 = Cipher.getInstance("RC4");
SecretKeySpec rc4Key = new SecretKeySpec(key, "RC4");
rc4.init(Cipher.ENCRYPT_MODE, rc4Key);
byte[] cipherText = rc4.update(clearText.getBytes("ASCII"));

Cipher rc4Decrypt = Cipher.getInstance("RC4");
rc4Decrypt.init(Cipher.DECRYPT_MODE, rc4Key);
byte[] clearText2 = rc4Decrypt.update(cipherText);
String decrypted = new String(clearText2, "ASCII");
System.out.println("decrypted" + decrypted);
}
}
Pokud prvni X bajtu budu "tocit", jak to poresim na serverove strane? Implementace Javy nejak resi toceni pevnich X bajtu a CBC?