Aeronautica | Comunicatii | Constructii | Electronica | Navigatie | Pompieri | |
Tehnica mecanica |
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.
Copyright © 2024 - Toate drepturile rezervate