Maşină de codare/decodare
bazată pe algoritmul ARCFOUR
Student: Strainu
Grupa:
Cuprins
1.
Ideea
proiectului
2.
Modalitatea
de implementare
3.
Partea
hardware
4.
Lista
componentelor necesare
5.
Partea
software
6.
Concluzii
7.
Materiale
realizate
8.
Referinţe
1.
Ideea
proiectului
Proiectul meu constă în
realizarea unui dispozitiv de codare/decodare a datelor de pe un card de
memorie folosind un algoritm asemănător cu RC4.
·
Codarea
Datele vor fi citite de la calculator
prin interfaţa serială, vor fi codate în microporcesor şi vor fi scrise pe un
card SD/MMC care poate fi apoi transportat la o maşină de decodare
·
Decodarea
Datele codate vor fi citite de pe
card, decodate şi scrise pe interfaţa serială către calculator.
Proiectul nu va coda decât bucăţi de
text introduse în hyperterminal. Pentru a coda şi alte tipuri de date se poate
crea un program care să ruleze pe calculator şi care să facă o codare în
base64.
2.
Modalitatea de
implementare
Vom folosi
plăcuţa
realizată la faza 1, care conţine
microcontrolerul Atmel ATMega16, circuitul de alimentare la 5V şi portul
serial de comunicare cu calculatorul.
La acest circuit vom mai ataşa un
cititor de carduri SD/MMC pentru a stoca datele codate. Comunicarea între
microcontroler şi cititorul de carduri se face prin portul SPI (pinii PB4-PB7
ai microcontrolerului). Cardurile MMC sunt alimentate la 3,3V şi nu la 5V ca
restul circuitului, de aceea mai avem nevoie şi de o sursă de tensiune de 3,3V
care să ofere Vcc pentru card.
Utilizatorul va comunica cu programul
prin intermediul portului serial şi a unui program dedicat (de exemplu
hyperterminal). El va putea decide dacă doreşte să codeze sau să decodeze un
text, va putea să introducă parola şi eventual textul care trebuie
codat.
3.
Partea
hardware
Schema electrică a întregului ansamblu:
Schema folosită la simulare. Se observă folosirea SPI debugger în locul cardului
SD/MMC
Comunicarea cu
cardul
Comunicarea se face prin trimiterea de comenzi către card şi primirea
răspunsurilor. În total există 15 comenzi şi 3 răspunsuri, pe care însă nu le
vom descrie aici. Pentru o desciere amănunţită, vezi [4]. Citirea/scrierea se
fac pe blocuri, dimensiunea implicită fiind de 512 octeţi. Multe carduri nu
permit schimbarea acestei dimensiuni, deşi protocolul prevede şi această
posibilitate.
Comunicarea are 3 componente:
-
Initializarea
În primul rând cardul trebuie resetat. Acest lucru se face trimiţând comanda
0, la care cardul trebuie să rărpundă cu 0x01 (ceea ce înseamnă că a intrat în
starea IDLE). Apoi se face iniţializare propriu zisă, în care se trimite
comanda 1 şi se asteaptă răspunsul 0x00. Iniţializarea poate dura câteva zeci
de milisecunde, timp în care se va primi altceva.
-
Citirea
În cadrul acestui proiect vom face numai citirea unui singur bloc. Se va
trimite comanda 17 cu un argument ce reprezintă numarul de octeţi de la
începutul cardului de la care se va face citirea. Răspunsul primit trebuie să
fie 0xFE, altfel avem eroare. Dacă nu avem eroare, va urma un bloc de date şi
2 octeţi reprezentând CRC-ul blocului. În această aplicaţie am decis să
ignorăm acest câmp.
-
Scrierea
Scrierea va fi tot pe un bloc. Se va trimite comanda 24, se va aştepta
răspunsul plus timpul necesar încă unui octet, apoi se vor trimite datele.
După terminarea transmisiei, cardul va trimite imediat un răspuns, urmat de o
perioadă de BUSY în care se va face efectiv scrierea, şi în care trebuie să
aşteptăm cardul să devină disponibil.
Comunicarea cu seriala
Atmel ATmega16 are inclusă posibilitatea de comunicaţie pe serială. Funcţiile
implementate asigură conversia dintre \r\n
şi \n. În plus, am folosit macroul
FDEV_SETUP_STREAM pentru a putea folosi seriala ca intrare/ieşire standard.
4.
Lista
componentelor necesare
Lista cuprinde doar componentele suplimentare faţă de cele folosite în plăcuţa
comună. Pentru lista componentelor folosite la plăcuţă, vezi
aici.
Cititor carduri SD/MMC
|
1 bucată
|
Comet S.R.L.
|
Rezistenţe de 1K8
|
3 bucăţi
|
Comet S.R.L.
|
Rezistenţe de 3K3
|
3 bucăţi
|
Comet S.R.L.
|
Stabilizator tensiune de 3,3V
|
1 bucată
|
Comet S.R.L.
|
Condensatori de 100nF
|
2 bucăţi
|
rămaşi de la faza 1
|
5.
Partea
software
Programul rulat de microcontroler foloseşte portul serial pentru a primi
informaţii de la utilizator. Acesta trebuie să aleagă dacă doreşte să codeze
sau să decodeze text.
La codare, utilizatorul trebuie să introducă parola cu care se face codarea
precum şi textul de codat. Rezultatul codării este scris în sectorul 1 al
cardului MMC
La decodare, utilizatorul va introduce parola şi programul va decoda textul.
Dacă parola este corectă, textul va avea sens, dacă nu, cel mai probabil vom
avea caractere din setul ASCII extins, eventual neafişabile.
Datorită limitărilor hardware (doar 512 octeţi de RAM) şi a faptului că
algoritmul ARCFOUR foloseşte un vector de 256 de elemente, limita pentru
lungimea parolei este de 8 caractere (64 de biţi) şi lungimea textului este de
maxim250 de caractere. Teoretic s-ar putea dezvolta o metodă prin care cei 256
de octeţi ar putea fi reduşi la 224, ceea ce ar elibera încă 32 de octeţi,
însă această metodă ar fi mare consumatoare de timp.
O altă soluţie ar fi citirea câte 250 de caractere până la finalizarea
textului, însă acest lucru ar putea crea confuzie pentru anumiţi utilizatori.
Pe lângă programul principal, codul mai are 3 module: unul care se ocupă de
comunicarea pe serială, altul care se ocupă de comunicarea cu cardul MMC şi a
treia care se ocupă efectiv de codare.
Pentru acest proiect am folosit avr-studio, win-avr pentru compilatorul
gcc-avr şi Proteus pentru simulare.
6.
Concluzii
Datorită problemelor software menţionate la punctul anterior dispozitivul nu
poate fi utilizat în lumea reală. Dacă problemele acestea ar fi depăşite,
proiectul ar putea fi cu adevărat util. Printre dezvoltările ulterioare ce ar
putea fi realizate aş enumera folosirea unui algoritm de criptare mai
performant (slăbiciunile lui ARCFOUR au fost demonstrate de spargerea
criptării WEP), critarea fişierelor şi/sau a directoarelor, etc.
Dacă la faza 2 am spus că voi folosi întreruperi pentru a decide dacă e vorba
de codare sau decodare, până la urmă am renunţat la această soluţie ca fiind
nepractică (se poate uita foarte uşor să se apese pe buton).
Singura problemă hardware cu adevărat dificilă a fost defectarea
stabilizatorului de 3,3V. Cum toate magazinele de specialitate erau în
inventar, am recurs la o
schemă
de stabilizare folosind o diodă Zener şi o rezistenţă de
100
Ω,
care dă o tensiune de aproximativ 3,2V, în limitele de funcţionare ale
cardului.
7.
Materiale
realizate
8.
Referinte şi
Link-uri
-
Schema electrică pentru MMC:
http://www.captain.at/electronic-atmega-mmc.php
-
Codarea
RC4:
http://en.wikipedia.org/wiki/RC4
-
Date tehnice MMC:
http://mmc.drzeus.cx/wiki/
-
Comenzi
MMC în modul SPI:
http://elm-chan.org/docs/mmc/mmc_e.html