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