Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Meseria se fura, ingineria se invata.Telecomunicatii, comunicatiile la distanta, Retele de, telefonie, VOIP, TV, satelit




Aeronautica Comunicatii Constructii Electronica Navigatie Pompieri
Tehnica mecanica

Comunicatii


Index » inginerie » Comunicatii
» Cum sa construiti un sistem de securitate folosind cartelele telefonice


Cum sa construiti un sistem de securitate folosind cartelele telefonice


Cum sa construiti un sistem de securitate folosind cartelele telefonice

Inainte de a incepe, tin sa mentionez ca acest articol a fost scris in scopuri de cercetare si in scopuri pur educationale. Nu imi asum nici o raspundere pentru ce se va intampla cand veti citi acest articol. Dumneavoastra, cititorul, veti pune in practica aceste informatii pe propriul dumneavoastra risc.

Standardul ISO 7816 aparut pe la mijlocul anilor '80 a patruns in multe domenii de activitate, cum ar fi domeniul bancar (carti de credit), telefonie (plata convorbirilor telefonice de la posturile publice), audio-vizual (cartele de codare a semnalului video), etc.
Deoarece la noi in tara cel mai uzual exemplu este banala cartela telefonica, voi incerca sa explic sistemul de functionare a acestor cartele telefonice. E bine sa stiti ca modul de functionare si continutul acestor cartele nu este deloc secret. Pentru mai multe informatii contactati: International Standard Institute (Case Postale 56 CH-1211 Geneve 20 Switzerland).
Fiind interesat de sistemele de securitate a programelor, bazate pe dispozitive externe atasate unor porturi seriale sau paralele ale sistemului, am ajuns la concluzia ca refolosirea cartelelor electronice, de genul celor folosite in telefonie este cea mai simpla metoda, desi nu foarte sigura, de a proteja un program cu un dispozitiv extern.



Ce este o "cartela"

De fapt, o cartela electronica nu este decat un EPROM de 128, 256 sau 512 biti, in care pot fi stocate informatii de genul: cate unitati au ramas de consumat, producatorul cartelei, codul tarii etc. Singurul inconvenient in cazul nostru este faptul ca nu se poate scrie un cod in interiorul cartelei, deoarece aceasta este protejata la scriere printr-o "siguranta" creata la programarea cartelei in fabrica. Acest lucru inseamna ca va trebui sa folositi cartele care mai au inca cateva unitati ramase sau prin folosirea altor cartele din tari diferite (Germania, Franta, Monaco etc).
Tehnologia de realizare a fost prin 1984 cea NMOS dar, la scurt timp, constructorii au decis ca tehnologia CMOS este mai ieftina.
Dar sa intram in miezul problemei si voi incepe prin a explica cum functioneaza cartelele electronice Schumbler, folosite in Franta. Ele contin o memorie de 256 biti in tehnologie NMOS, dintre care 96 biti sunt protejati la scriere, au un consum de curent de 85mW in regim de citire, timp de acces 500ns, pot lucra intr-un interval de temperaturi cuprins intre -100 si +700 grade Celsius si pot retine datele inscriptionate timp de 10 ani.
Iata pozitia contactelor care este respectata de toate cartelele electronice ISO7816:

PINOUT:

1 : Vcc = 5V 5 : Gnd

2 : R/W    6 : Vpp = 21V

3 : Clk    7 : I/O

4 : Reset    8 : Fuse

Pe pinul numarul 1 se aplica tensiunea de citire (+5Vcc); pinul 2 este folosit pentru trimiterea semnalului de reset catre cartela, pinul 3 primeste semnalul de ceas, pinul 5 este legat la masa, iar pinul 7 este folosit pentru transferul de date intre interfata de citire si cartela.
Poate va intrebati cum se reseteaza cartela pentru a porni o noua sesiune de transfer de date. Raspunsul este la fel de simplu ca si intrebarea: se seteaza intai linia de ceas (CLK) pe starea "1" logic si apoi se seteaza linia de reset (R ) pe "1" logic.
Dupa aceasta operatiune, indicatorul de adresa, care stocheaza pozitia de citire din memoria cartelei , va fi resetat la 0. Dar atentie, acest indicator nu poate fi resetat atat timp cat are valoarea cuprinsa intre 0 si 7.
Bine, dar cum incrementez indicatorul de adresa? Incrementarea se face astfel: comutati linia de reset (R) pe starea logica "0" si de cate ori linia de ceas (CLK) este setata pe "1" logic indicatorul va fi incrementat cu 1. Atunci cand linia CLK este setata pe "0" logic, valoarea bitului din memorie indicat de pointerul de adresa va fi transmisa la pinul de iesire. Daca se doreste decrementarea indicatorului de adresa, aceasta se poate realiza prin resetarea cartelei, si implicit a indicatorului, apoi se asigneaza indicatorului valoarea dorita. Cam atat despre citirea cartelei.
Va voi prezenta in continuare harta memoriei pentru generatia a doua de cartele telefonice care sunt, de fapt, memorii de 128 biti in tehnologie NMOS. Dintre acesti 128 de biti, 64 sunt READ ONLY , 40 sunt READ/WRITE si 24 sunt setati "din fabrica" pe 1. Iata harta memoriei cartelelor:

Octet

Bit

Valoare hexa

F2h / 2Fh

F4h / 2Fh

80h / 6Fh

------------ Germania

80h / 37h

80h / 77h

------------- Olanda

10h / 2Bh

------------- Romania

FFh - Germania / Olanda

2Fh - Romania

2Ah - Producator: Solaic

4Ah - Producator: ODS

8Ah - Producator: G+D

CAh - Producator: Gemplus

Identificatorul producatorului (*)

Zona de numarare

Zona de biti setati pe "1"


(*) Identificatorul producatorului este o zona de 40 biti READ ONLY ce poate contine un numar serial al cartelei telefonice, data fabricarii sau centrele de distributie pentru care a fost fabricata cartela respectiva.
Zona de numarare contine date despre cate unitati au mai ramas pe cartela si valoarea sa initiala este setata de producator. Sistemul de numarare a unitatilor ramase pe cartele se face dupa sistemul octal (baza 8) si are la baza sa urmatorul algoritm: valoarea fiecarei parti din cele 5 ce compun zona de numarare va fi data de numarul de biti setati pe 1 astfel , 00001111 va fi egal cu 4, 00011111 va fi egal cu 5 etc. Valoarea totala se calculeaza dupa formula:

k=4   

k=0

unde k este numarul octetului de adunat (0 .. 4),iar Ok este valoarea octetului de adunat.

Iata un exemplu:

Octet 9

Octet 10

Octet 11

Octet 12

Octet 13

3 (octal)

6 (octal)

7 (octal)

1 (octal)

2 (octal)

care in final face 15818 unitati ramase pe cartela.

Quick Lock

Dupa ce am explicat cum functioneaza o cartela telefonica, ajung in sfarsit si la sistemul de protectie, denumit de mine "Quick Lock" (QL). Tot ansamblul este realizat dintr-un dispozitiv ce realizeaza legatura dintre PC si cartela si bineinteles un program ce citeste si interpreteaza datele primite. Sistemul de prindere a cartelei se poate realiza manual (fiecare cum crede mai bine) sau in cazul in care aveti pe acasa un telefon cu cartela, defect, ii puteti lua conectorul. Pentru a construi un conector, va trebui sa masurati cu atentie marimea si dispunerea contactelor pe cartela pentru evita distrugerea cartelei prin introducerea tensiunii de alimentare pe alte contacte. Dispozitivul de prindere trebuie sa fie foarte fix si solid pentru a se evita distrugerea acestuia.
Iata cum trebuie sa conectati cartela la portul paralel al calculatorului Dvs.:
Pin 1 cartela - pin 10 PP,
Pin 2 cartela - pin 4 PP,
Pin 3 cartela - Pin 3 PP,
Pin 4 cartela - Pin 2 PP,
Pin 7 cartela - Pin 7 PP,
Pin5 cartela - Pin 25 PP.
Este bine ca pinul 1 al cartelei sa fie legat la pinul 5 al aceleiasi cartele printr-un condensator de 100 nF pentru a evita eventualele fluctuatii ale tensiunii.
Voi prezenta si un program de citit cartelele, dumneavoastra urmand sa modificati codul in functie de necesitatile dumneavoastra. Programul este scris in Borland Pascal 7.0 dar se poate folosi cu mici modificari si in versiuni anterioare ale acestui mediu. Programul functioneaza foarte simplu, si il veti putea realiza si dvs. in orice alt limbaj doriti daca urmariti cu atentie cele spuse mai sus. Oricum, voi explica in continuare, folosind codul, cum puteti citi aceste cartele.

Cum functioneaza

Acum, va voi explica si cam in ce ar consta un sistem de protectie realizat pe baza acestor cartele si cum ar trebui el sa functioneze in conceptia mea.
Pentru protectia programelor dvs. este de ajuns sa scrieti o rutina de citire bazandu-va pe cele de mai sus si sa va intocmiti un cod de protectie. Acest cod poate fi alcatuit din diferite combinatii de valori citite din cartela, ba chiar si adaugand valori luate din numele utilizatorului sau numere seriale ce pot fi cu usurinta descoperite de hackeri.
Acest proiect i-ar putea ajuta pe conationalii mei ce produc software. Solutia se poate dovedi ieftina in comparatie cu alte dispozitive de protectie soft & hard. Deci dragi producatori de soft, daca veti folosi candva aceasta metoda, va rog trimiteti-mi si mie un e-mail sau chiar o copie a programului produs de dumneavoastra.
Metoda "QuickLock" este doar in faza de "hai sa ne jucam", dar este functionala. Oricine este interesat de acest sistem sau de alte detalii privind functionarea lui este rugat sa ma contacteze telefonic, prin e-mail sau chiar personal.

Jesy

-------------cut here

Card Reader Ver. 1.01 Build 103 *)

uses crt;

const high:byte=1;

low:byte=0;

lptn:byte=$01;

pvcc:byte=$80;

prst:byte=$04;

pclc:byte=$02;

msio:byte=$80;

shio:byte=$07;

hexchr:string[16]='0123456789ABCDEF';

type datac=array[0..15] of byte;

var lpt:array[1..4] of word absolute $0040:$0008;

_ad:word;

lc:datac;

procedure Write_hex(n:word;p:byte);

var a:string[16];

i:byte;

begin

a:='';

for i:=1 to 4 do

begin

a:=hexchr[n and $0F+1]+a;

n:=n shr 4

end;

a:=copy(a,p,4);

write(a)

end;

procedure Write_Bin(n:byte);

var i:byte;

begin

for i:=7 downto 0 do write((n shr i)and $01:1);

end;

procedure Write_port(b:byte);

begin

port[_ad]:=b

end;

function Read_port:byte;

begin

Read_port:=port[_ad+1]

end;

procedure Initialize;

var i:word;

begin

if lpt[lptn]=$0000 then

begin

writeln(#13#10'No LPT',lptn:1,'on this computer !');

halt(0);

end

else

begin

write(#13#10'Plug LPT',lptn:1,' detected at addres ');

Write_hex(lpt[lptn],2);

writeln('H ');

_ad:=lpt[lptn]

end

end;

procedure Sincronize;

begin

delay(2);

end;

procedure Add_Bit(var v:byte;b:byte);

begin

v:=v shl 1+b;

end;

procedure Send_command(v,r,c:byte);

begin

Write_port(v*pvcc+r*prst+c*pclc)

end;

function Get_Byte:byte;

begin

Get_Byte:=((not(Read_port))and msio) shr shio

end;

procedure Wait_For_Card;

begin

Send_command(low,low,low);Sincronize;

writeln(#13#10'Imput a card then press any key ');

readkey;

end;

procedure Read_Card(var cc:datac);

var bp,tp:byte;

begin

Send_command (low,low,low);Sincronize;

Send_command (high,low,low);Sincronize;

for bp:=0 to 15 do

begin

cc[bp]:=0;

for tp:=7 downto 0 do

begin

Add_Bit(cc[bp],Get_Byte);Sincronize;

Send_command(high,low,high);Sincronize;

Send_command(high,low,low);Sincronize;

end

end;

Send_command(low,low,low);Sincronize;

end;

procedure Show_Card;

var p:byte;

begin

write(' ');

for p:=1 to 16 do write (p:2,' ');

write(#13#10'Hex content is ->');

for p:=0 to 15 do begin Write_hex(lc[p],3);write(' ')end;

writeln(#13#10'Binary content is -> ');

for p:=1 to 8 do write (p:8,' '); writeln;

for p:=0 to 15 do begin

Write_Bin(lc[p]);write(' ');

if (p=7) or (p=15) then writeln

end;

for p:=9 to 16 do write(p:8,' ');writeln;

end;

begin

Clrscr;

Initialize;

Wait_for_card;

Read_card(lc);

Show_Card;

readln ;

end.





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate